JAVA自学笔记20

1、递归:

1)方法定义中定义中调用方法本身的现象

2)要有出口,否则就是死递归

次数不能太多。否则内存将溢出

构造方法不能递归使用

//斐波那契数列:1,1,2,3,5,8,13,21.34
public int Fibonacci(int n){
if(n==1||n==2){return 1;}
return Fibonacci(n-1)+Fibonacci(n-2)
}

@例题1:遍历目录下指定后缀名结尾的文件名称

private static void getAllJavaFilePaths(File srcFolder){
//获取该目录下所有的文件或者文件夹的File数组
File[] fileArray=srcFolder.listFiles();
for(File file:fileArray){
if(file.isDirectory()){
getAllJavaFilePaths(file)
}else{
if(file.getNmae().endsWith(".java")){
System.out.println(file.getAbsolutePath());
}
}
}
}

@例题2:递归删除带内容的目录

public class DeleteFolders{
File[] fileArray=srcFolder.listFiles();
for(File file:fileArray){
if(file.isDirectory()){
deleteFolder(file);
}
else{
System.out.println(file.delete());
}
}
System.out.println(srcFolder.delete);
}

2、IO

1)用于处理设备之间的数据传输。java对数据的操作是通过流的方式,java用于操作的流的对象都在IO包中



2)IO流分类

按数据流向分:

输入流:读入数据

输出流:写出数据

按数据类型分

字节流

字符流

3)常用基类:

抽象基类:InputStream,OutputStream

字符流的抽象基类:

Reader,Writer

注意:由这四个类派生出来的子类名都是以其父类名作为子类名的后缀

4)FileOuputStream

构造方法:

FileOutputStream(File file)

FileOutputStream(String name)

//在一个文本文件中写一句hello
//采用字节输出流
//创建字节流输出对象
File file=new File("Fos.txt");
FileOutputStream fos=new FileOutputStream(file);
//或FileOutputStream fos=new FileOutputStream("fos.txt");
//写数据
fos.writer("hello".getBytes());
//释放资源
fos.close();//流关闭,通知系统释放相关资源

4)字节流写数据方式

public void write(int b)

写一个字节

public void write(byte[] b)

写一个字节数组

public void write(byte[] b,int off,int leng)

写一个字节数组的一部分

FileOutputStream fos=new FileOutputStream("fos2.txt");
fos.write(97);//写入a
byte[] bys={97,98,99,100,101};
fos.write(bys);
fos.write(bys,1,3);
//
//实现换行
FileOutputStream fos=new FileOutputStream("fos.txt");
for(int x=0,x<0,x++){
fos.write(("hello"+x).getBytes());
fos.write("\n".getBytes());
}
fos.close();
}

注意:

//追加写入
FileOutputStream fos=new FileOutputStream("fos.txt",true);
for(int x=0,x<0,x++){
fos.write(("hello"+x).getBytes());
fos.write("\r\n".getBytes());
}

5)异常处理

如果fos不是null,才能close

6)字节流读取数据

FileInputStream

构造方法:

FileInputStream(File file)

FileInputStream(String name)

成员方法:

int read():一次读取一个字节,返回-1则已读到末尾

int read(byte[] b):一次读取一个字节数组

FileInputStream fis=new FileInputStream(fis.txt);
int by=fis.read();
fis.close();
//改进,仅适用与字母与数字
int by=0;
while((by=fis.read())!=-1){
System.out.print((char)by);
fis.close();
}
//字节流复制文本文件
//封装数据源,数据源已读要存在
FileInputStream fis=new FileInputStream("a.txt");
//封装目的地
FileOuputStream fos=new FileOuputStream("b.txt") int by=0;
while((by=fis.read())!=-1{
fos.write(by);
}
fis.close();
fos.close();
//将c盘目录下的a.txt内容复制到b.txt中
FileInputStream fis=new FileInputStream("c:\\a.txt");
FileOuputStream fos=new FileOuputStream("d:\\b.txt");
int by==0;
while((by=fis.read()0!=-1){
fos.write(by);
} fos.close();
fis.close();
//复制图片
FileInputStream fis=new FileInputStream("c:\\a.jpg");
FileOuputStream fos=new FileOuputStream("d:\\b.jpg");
int by==0;
while((by=fis.read()0!=-1){
fos.write(by);
fos.close();
fis.close();
}
//复制视频
FileInputStream fis=new FileInputStream("c:\\a.mp4");
FileOuputStream fos=new FileOuputStream("d:\\b.mp4");
int by==0;
while((by=fis.read()0!=-1){
fos.write(by);
fos.close();
fis.close();
}//速度太慢,一次一个字节复制

研究

int read(byte[] b):一次读取一个字节数组,返回的是实际读取的字符数目,字节数组可被覆盖。到大结尾返回-1

//读取一个文件
byte[]bys=new byte[1024];
int len=0;
while((len=fis.read(bys)!=-1){
System.out.println(new String(bys,0,len));
}
fis.close();

存储图解:

//复制文本文件
FileInputStream fis=new FileIntputStream("c:\\a.txt");
FileOuputStream fis=new FileOutputStream("b.txt");
byte[]bys=new byte[1024];
int len=0;
while((len=fis.read(bys)!=-1){
for.write(bys,0,len);
fos.close();
fis.close();
}
字节流复制视频
FileInputStream fis=new FileIntputStream("c:\\a.mp4");
FileOuputStream fis=new FileOutputStream("b.mp4"); byte[1024];
int len=0;
while((len=fis.read(bys)!=-1){
for.write(bys,0,len);
fos.close();
fis.close();

7)字节缓冲流

字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,这是加入了数组这样的缓冲区的效果,java本身在设计过程中也考虑到了这样的设计思想(装饰设计模式后面讲解),故提供了字节缓冲流

字节缓冲输出流

BufferedOutputStream

字节缓冲输入流

BufferedInputStream

构造方法可以指定缓冲区的大小,因为默认缓冲区大小就足够了。

BufferedIn(out)putStream(In(Out)putStream)

字节缓冲区流仅仅提供缓冲区为高效而设计,但真正的读写操作还得靠基本的流对象实现。

BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("bos.txt"));
//写数据
bos.write("hello".getBytes());
bos.close();
BufferedInputStream bos=new BufferedInputStream(new FileInputStream("bos.txt"));
//读数据
byte[]bys=new byte[1024];
int len=0;
while((len=bis.read(bys)!=-1){
System.out.println(new String(bys,0,len));
}

JAVA自学笔记20的更多相关文章

  1. JAVA自学笔记06

    JAVA自学笔记06 1.二维数组 1)格式: ①数据类型[][]数组名 = new 数据类型[m][n]; 或 数据类型[]数组名[]=new 数据类型[m][n]; m表示这个二维数组有多少个一维 ...

  2. JAVA自学笔记10

    JAVA自学笔记10 1.形式参数与返回值 1)类名作为形式参数(基本类型.引用类型) 作形参必须是类的对象 2)抽象类名作形参 需要该抽象类的子类对象,通过多态实现 3)接口名为形参 需要的是该接口 ...

  3. JAVA自学笔记13

    JAVA自学笔记13 1.StringBuffer类 1)线程安全的可变字符序列 线程安全(即同步) 2)StringBuffer与String的区别:一个可变一个不可变 3)构造方法: ①publi ...

  4. JAVA自学笔记15

    JAVA自学笔记15 @例题1:共有5个学生,请把五个学生的信息存储到数组中,并遍历数组,并获取每个学生的信息 Students[] students=new Student[5]; Student ...

  5. JAVA自学笔记18

    JAVA自学笔记18 1.Map接口: 1)功能: 2) Map<String,String>m=new HashMap<String,String>(); //添加元素,元素 ...

  6. JAVA自学笔记19

    JAVA自学笔记19 1.集合总结 Collection(单列集合) List(有序可重复) ArrayList:底层数据结构是数组 ,查询快,增删慢.线程不安全,效率高 Vector:底层数据结构是 ...

  7. JAVA自学笔记17

    JAVA自学笔记17 1.Map接口 1)概述 将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值.可以存储键值对的元素 2)与Collection接口的不同: ①Map是双列的 ...

  8. JAVA自学笔记25

    JAVA自学笔记25 1.GUI 1)图形用户接口,以图形的方式,来显示计算机操作的界面,更方便更直观 2)CLI 命令行用户接口,就是常见的Dos,操作不直观 3) 类Dimension 类内封装单 ...

  9. JAVA自学笔记09

    JAVA自学笔记09 1.子类的方法会把父类的同名方法覆盖(重写) 2.final: 1)可修饰类.方法.变量 2)修饰类时:此时该类变为最终类,它将无法成为父类而被继承 3)修饰方法时:该方法将无法 ...

随机推荐

  1. 【回顾】html简介、基础、元素

    1.简介 什么是HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言,而是一种标记语言 标 ...

  2. Nodejs通过账号密码连接MongoDB数据库

    转自https://blog.csdn.net/szu_lzz/article/details/77435804#commentBox 1.创建管理员 首先开启Mongo服务,然后切换admin数据库 ...

  3. Loadrunner和JMeter并发对比

    今天在项目中测试发现,其实LR才是实际意义上的并发测试,JMeter不算并发 记录用户登录日志: LR脚本: 1.登录操作放在init初始化中,用5个虚拟用户并发测试:

  4. kudu集成impala

    Kudu 与 Apache Impala (孵化)紧密集成,允许开发人员使用 Impala 使用 Impala 的 SQL 语法从 Kudu tablets 插入,查询,更新和删除数据: 安装impa ...

  5. net core体系-2继续认识net core

    认识net core,net core到底啥?从哪说起呢?我想作为开发的码农,web项目不陌生吧,那就从对应的.net web 对应的net core Web Application项目开始吧. 下面 ...

  6. ELK使用3-Logstash

    一.命令行输入输出操作 1.命令行输出: /application/elk/logstash/bin/logstash -e 'input { stdin{} } output { stdout{} ...

  7. BZOJ1951 [Sdoi2010]古代猪文 中国剩余定理 快速幂 数论

    原文链接http://www.cnblogs.com/zhouzhendong/p/8109156.html 题目传送门 - BZOJ1951 题意概括 求 GM mod 999911659 M=∑i ...

  8. js读取cookie,并利用encrypt和decrypt加密和解密方法

    以下为支持encrypt和decrypt加密和解密方法 eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a ...

  9. 解决每次调试网页,eclipse总是提示edit source lookup path的问题,我的第一篇小随笔,小激动呢

    如图,很简单,只要把想要debug的项目勾上就行,网页调试时,就会自动去找项目文件位置

  10. MacOs brew 命令行安装常见工具

    brew类似ubuntu系统下的apt-get的功能 安装方法:  在Mac中打开Termal:  输入命令: ruby -e "$(curl -fsSL https://raw.githu ...