IO流
- 字符流:适用文本的读写。字符输出流:必须使用 刷新或关闭操作;缓冲区满自动刷新;
- 字节流:适合文本数据转移:(如一切文件/视频/图像的复制。P19视频最后我是这样认为的把这个文本输出后不乱码,肯定还有个东西把所有字节数组连起来的东西);
- 缓冲流:对原始流包装,提高读写性能,自带8K 字节/字符缓冲池于内存。new BufferInputStream(new FileInput()),特殊BufferReader有方法readLine()
- 字符转换流:解决乱码问题:new InputStreamReader(原始流,字符集)
- 打印流:写什么就输出什么,不会进行字符==对应字符序号,2者转换的情况 。PrintStream/PrintWriter。把sout代码输出到文件:System.setOut(new PrintStream())
- 数据流:把数据带着类型。通信时用。new DataOutputStream(原始流)。输入时必须按输出的数据类型顺序进行。
- 序列化流:把Java对象的序列化成文件与反序列化。new ObjectOutputStream(原始流).writeObject.(对象)。某个类需要被序列化,必须实现Serializable接口。成员属性如果不想被序列化,使用transient定义,再次反序列时也不在拥有该属性。
1.认识IO流
IO流分为:输入流和输出流。
作用:读写数据的。
2.IO流的应用场景
3.怎么学习IO流?
先搞清io体系和分类,再逐一学习每个IO流作用和用法,这样整个思路会非常的清晰。而不是一会学这个一会学学那个。
IO流分类
IO流体系
小结
FileInputStream
常用api
案例代码应用
代码优化1
存在问题一:如果文件数据很大,则需要写很多read()调用,使用while循环遍历。
代码优化2
存在问题:
1.读取数据的性能很差!
每次调用read()只读取1个字节,每次调用都会通过系统调用
从磁盘读取,导致系统性能很差。
2.读取汉字输出会乱码!!无法避免的!!
由于read()每次读取一个字节
,如果文件含有中文则会出现中文乱码(UTF-8中文占用三个字节)
3.流使用完毕之后,必须关闭!释放系统资源!
因为FileInputStream流一直通过系统资源
关联着文件,一方面一直占用系统资源,另一方面占用着文件。
小结
代码优化三:
虽然只有文件只有5个字节,但第二次读取2个字节,但打印字符串确是三个字节。
使用 new String(buffer,offset:0,Len2); 读取多少,倒出多少。
代码优化四:
使用循环改造:
代码优化5
性能得到了明显的提升!!
存在问题:这种方案也不能避免读取汉字输击乱码的问题!
虽然这种操作存在问题,但很多场景都会有应用,做流的传输、文件拷贝等!
小结
优化6
一次读取全部字节,适用于文件不是太大的场景。
小结
FileOutputStream
常用api
案例代码
代码优化1
存在问题:os.write(‘磊’)会出现乱码。
使用byte数组,一次写多个字节。byte[]bytes=“我爱你中国abc”,getBytes();
写部分字节
案例代码
案例代码
小结
复制图片案例应用
释放资源的方式
方式一:
方式二:
自动释放资源
验证
小结
IO字符流
FileReader和FileWriter
FileReader
字节流:适合复制文件等,不适合读写文本文件。
存在问题:
1.可能出现中文乱码
2.文件太大,没有那么多字节数组
解决方案:
字符流:适合读写文本文件内容
api
案例代码
每次读取一个字符。
优化1
每次读取多个字符,减少系统调用,提升性能,
小结
FileWriter
api
案例代码
写一个字符。
写一个字符串。
写一个字符数组。
追加数据管道。
注意事项
因为字符输出流每次先写到缓冲区里面,优化减少了系统的调用次数,直到刷新缓冲区或者缓冲区满自动写或者关闭流。
小结
IO流-缓冲流
作用:对原始流#行包装,以提高原始流读写数据的性能
字节缓冲流
原理
没有缓冲流:32次系统调用
有缓冲流:4次系统调用
api
案例代码
小结
字符缓冲流-BufferedReader
api
代码案例
使用br.readLine()每次读取一行
字符缓冲流-BufferedWriter
api
案例代码
小结
原始流、缓冲流性能分析
IO流-打印流
体系
作用
打印流:输出数据到文件,非常方便,可以取代输出流。
两者区别
PrintStream
api
案例代码
指定编码:
源码分析
包装缓冲流,性能是高效的
PrintWriter
api
案例代码
不带追加功能,如果需要追加,包装低级流传参。
小结
打印流的应用
IO流-数据流
体系
DataOutputStream
案例代码
不是乱码,是数据一种存储方式,包含类型和数据,不是看的,是方便后续读数据和类型。
DataInputStream
api
api
小结
IO流-序列化流
体系
ObjectOutputStream
api
案例代码
对象必须实现序列化接口
不是乱码,是数据一种存储方式,不是方便我们看的,是方面下一次读出来。
ObjectInputStream
api