IO流、File、文件、缓冲、数据、对象流等流
1.IO流:
流是一个抽象、动态的概念,是一连串连续动态的数据集合。
IO流分类
按流的方向分类:
输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)
** 输出流**:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)
按处理的数据单元分类
** 字节流**:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流,*类InputStream、OutputStream。
字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流,*类Reader、Writer。
按处理对象不同分类:
节点流:可以直接从数据源或目的地读写数据,如FileInputStream、FileReader等。
处理流:不直接连接到数据源或目的地,是”处理流的流”通过对其他流的处理提高程序的性能,如BufferedInputStream、BufferedReader等
字节流
InputStream和OutputStream是Java语言中最基本的两个字节输入输出类。其他所有字节输入输出流类都继承自这两个基类。
这两个类都是抽象类,不能创建它们的实例,只能使用它们的子类.
FilterInputStream和FilterOutputStream是所有包装流的父类
Reader和Writer
Java语言中最基本的两个字符输入输出类。
其他所有字符输入输出流类都继承自这两个基类。
这两个类都是抽象类,不能创建它们的实例,只能使用它们的子类
2.File
创建一个File对象,指向一个文件或者文件夹
File file = new File(“c:/”);
file.getName());//文件或者文件夹的名称
file.length());//长度
file.exists());//是否存在
file.getPath());//相对路径
file.getAbsolutePath());//绝对路径
file.isDirectory());//判断file是否指向一个目录
file.isFile());//判断file是否指向一个文件
file.list();//获取文件夹里的文件
file.lastModified();获取文件最后修改时间,毫秒数
file.delete();删除
file.mkdir();创建文件夹
//获取文件夹中所有文件目录
String[] list = file.list();
for (String s : list) {
System.out.println(s);
}
//用来遍历
File[] files = file.listFiles();
for (File file1 : files) {
System.out.println(file1.getName()+":"+file1.isDirectory());
}
3.文件流:
字节流:FileInputStream(输入流)FileOutputStream(输出流)
输入流:创建流:InputStream is = new FileInputStream();
读取数据:is.read(); 关闭流:is.close();
注意:(1)每次读取一个字节的数据
(2)读取的数据会以编码值的方式进行展示
(3)当读到末尾后,会返回-1
输入流:要哪输出:is.write
注意:(1)写出一个int值,应该是字符的编码值
(2)当写出的文件不存在时,系统会自动帮忙创建
(3)每一次写出数据会对之前的内容进行覆盖
(4)想要在数据的末尾进行追加,可以在参数后加true
复制文件:注意:
(1)可以一次读取一个byte类型数组
(2)当没有数据是返回-1
(3)读取数组返回的数字是数组有效元素的个数
字符流:FileReader(输入)FileWriter(输出)
读取(输入)字符流:注意:
(1)使用FileReader读取字符数据
(2)读取时保证编码一致,改为UTF-8前面会有一个空格
(3)当没有数据时也会返回-1,读取字符数组时也会返回-1
(4)一次读取一个字符
字符输出流:注意:
(1)可以写出int编码值,字符串,字符数组
(2)字符流的底层依然是字节流
(3)处理纯文本数据使用字符流
4.缓冲流:
BufferedInputStream(输入)BufferedOutputStream(输出)
(1)自带一个缓冲区,用于数据存储
(2)底层是8192个字节byte类型数组,8192还可以通过构造起来修改
(3)读取数据先进入缓冲流
输出流:
(1)写数据时先写到缓冲区
(2)将缓冲区的数据写到磁盘内有三种方法
1.缓冲区已满
2.手动刷出,点.flush()
3.关闭流
BufferedWriter(输入):.readLine()输入一行
底层是一个长度为8192的char类型的数组
BufferdWriter(输出):.newLine()也是一行的意思
5.数据流:
DataInputStream(输入)DataOutputStream(输出):
数据流写出数据会保留数据的类型
只有字节流,没有字符流,都是处理流,不是节点流
6.对象流:
ObjectInputStream(输入)ObjectOutputStream(输出)
(1)属性不想存在磁盘上用transient来修饰
(2)保证读取对象的序列化是一致的,否则就会报错
(3)属性那还可以用static,但是不建议用
(4)使用对象流读写引用类型的数据,需要相应类实现Serializable接口
**序列化:**把对象存到磁盘或者讲对象在网络上进行传输,用write()
反序列化:将此盘中或者网络中的对象,读取出来,用read()
打印流:PrintStram(输入)PrintWriter(输出)
转换流:InputStreamReader(输入)OutputStreamWriter(输出)
7.其他流:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IU72gfHm-1595142758510)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]