Java IO流-高级流
IO流 高级流
缓冲流分为字节缓冲流与字符缓冲流
字节缓冲流分为BufferedInputStream(字节缓冲输入流)和BufferedOutputStream(字节缓冲输出流)
字符缓冲流分为BufferedReader(字符缓冲输入流)与BufferedWriter(字符缓冲输出流)
字节缓冲流

原理:底层自带了长度为9182的缓冲区提高性能
例:一次拷贝一个字节
例:一次拷贝多个字节
字符缓冲流

原理:底层自带了长度为8192的缓冲区提高性能
字符缓冲流的特有方法


readLine方法在读取的时候,一次读一整行,遇到回车换行结束,但是它不会把回车换行读到内存中
缓冲流为什么能提高性能?
缓冲流自带长度为8192的缓冲区
可以显著提高字节流的读写性能
对于字符流提升不明显,对于字符缓冲流关键点是两个特有的方法readLine()与newLine()
注意,文件流最好随用随创建,什么时候不用什么时候关闭
转换流
转换输入流(InputStreamReader)
转换输出流(OutputStreamWriter)
JDK11后
转换流的作用:字节流想使用字符流中的方法
例:利用字节流读取文件中的数据,每次读一整行不出现乱码
序列化流
ObjectOutputStream(序列化流)可以把Java中的对象写到本地文件中


小细节:使用对象输出流将对象保存到文件时会出现NoteSerializableException异常 解决方案:让Javabean类实现Serializable接口
Serializable接口没有抽象方法(标记型接口)
反序列化流
ObjectInputStream(反序列化流)可以把序列化到本地文件中的对象读取到程序中来


如果序列号不一样会报错
解决方案1:在类里面这样定义
解决方案2:在IDEA里面设置自动产生序列号
transient瞬态关键字:不会把当前属性序列序列化到本地文件中
序列化流与反序列化流细节
使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口,否则会出现NotSerializableException异常
序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了
序列化对象后,修改了Javabean类,再次反序列化会出问题:InvalidClassVersionUID(序列号版本号)
如果一个对象中的某个成员变量的值不想被序列化,可以加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
打印流
分类:一般指PrintStream,PrintWriter两个类
特点1:打印流只操作2文件目的地,不操作数据源
特点2:特有的写出方法可以实现数据原样写出 如:打印97 文件中:97 打印true 文件中:true
特点3:特有的写出方法可以实现自动刷新,自动换行 打印一次数据=写出+换行+刷新
字节打印流

字节流底层没有缓冲区,开不开自动刷新都一样

字符打印流

字符流底层有缓冲区,想要自动刷新需开启

成员方法与字节打印流一样
打印流的应用场景
字节打印流:默认自动刷新
字符打印流:自动刷新需要开启
解压缩流
关键:压缩包里的每一个文件或文件夹都是一个ZipEntry对象
压缩流
压缩本质:把每一个(文件/文件夹)看成ZipEntry对象放到压缩包中
例:压缩一个文件
Commos-io
Commos-io是apache开源基金组织提供的一组有关IO操作的开源工具包
作用:提高IO流的开发效率
Apache:专门为支持开源软件项目而办的一个非盈利性组织,成立于1999年,总部在美国马里兰州
使用步骤:
在项目中创建一个文件夹lib
将jar包复制粘贴到lib文件夹
右键点击jar包,选择Add as Library->OK
在类中导包使用


[hutool](入门和安装 (hutool.cn): https://hutool.cn/docs/#/)国产Java工具包
