六、IO流
概述
分类
-
纯文本文件:Windows自带的记事本打开能读懂的
eg:txt文件,md文件,xml文件,lrc文件
IO流体系
字节流
FileOutputStream
-
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
-
创建字节输出流对象
-
写数据
-
释放资源
写数据的3种方式
FileInputStream
-
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中
-
创建字节输入流对象
-
读数据
-
释放资源
循环读取
一次读取多个字节
-
文件拷贝,write要从0索引开始,长度为读取到的len
计算机存储
-
计算机最小的存储单元:字节
-
一个字节有8位,8个比特位 eg:0111 1100
-
1开头的两个字节是中文,高位字节的第一位是1
-
0开头的一个字节是英文
编码与解码
字符流
FileReader
-
缓冲区:8192的字节数组
-
读取的时候先读取缓冲区,没有的从文件中获取数据,转到缓冲区中
FileWriter
-
缓冲区装满,会自动保存
-
flush,自动刷新,还可以继续写数据
-
close,无法继续写数据
缓冲流(包装)
eg:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("a.txt"));
-
Windows:/r/n
-
Linux/n
-
Mac:/r
转换流
-
字符流与字节流的桥梁
-
是字符流的子类
-
把字节流装换成字符流 InputStreamReader
-
把字符流装换成字节流 OutputStreamWriter
eg:
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"), "GBK");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8");
JDK11版本替代
字符流本身可以指定编码格式
eg:
FileReader fr = new FileReader("a.txt", Charset.forName("GBK"));
FileWriter fw = new FileWriter("b.txt",Charset.forName("UTF-8"));
序列化流(包装字节流)
-
对象操作输出流:把Java中的对象写在本地中
-
写出的时候要在对象类中是实现一个Serializable接口
-
Serializable是一个标记型接口,没有抽象方法
反序列化流(包装字节流)
-
对象操作输入流:把序列化的文件中的对象读取到程序中
-
版本号:修改对象类之后,还可以保证读取到文件对象
eg:
private static final long *serialVersionUID* = 1L;
-
transient:瞬态关键字
不会把当前的属性序列化到文件中
-
序列化多个对象时,将对象放到一个集合中
反序列化读取时,可以直接读取一个集合(强转Object),在进行集合遍历
打印流(包装输出流)
字节打印流
字符打印流
-
字符流底层有缓冲区,想要自动刷新需要开启
解压缩流/压缩流
解压缩流
压缩流
单个文件
文件夹
-
递归
Common-is
Hutool工具包
properties配置文件
-
读取:load()方法