![f2454533ccc40567a94aaee324675117.png](https://i-blog.csdnimg.cn/blog_migrate/e6611f7a7d7c653217c090aacacd78c1.jpeg)
一、BufferedInputStream / BufferedOutputStream 缓冲字节流
1、概念
Java 缓冲流本身并不具有 IO 流的读取与写入功能,只是在别的流(节点流或其他处理流)上加上缓冲功能提高效率,就像是把别的流包装起来一样,因此缓冲流是一种处理流(包装流)。
当对文件或者其他数据源进行频繁的读写操作时,效率比较低,这时如果使用缓冲流就能够更高效的读写信息。因为缓冲流是先将数据缓存起来,然后当缓存区存满后或者手动刷新时再一次性的读取到程序或写入目的地。
因此,缓冲流还是很重要的,我们在 IO 操作时记得加上 缓冲流来提升性能。
下面我们通过两种方式(普通文件字节流与缓冲文件字节流)实现一个文件的复制,来体会一下缓冲流的好处。
2、字节流和缓冲字节流区别
1)FileInputStream 和 FileOutputStream 是节点流
![e67090d01f93cfd2b14a6bf5739aba6a.png](https://i-blog.csdnimg.cn/blog_migrate/5d70c91bdc4a099a50876293a27e2aa1.png)
2)BufferedInputStream 和 BufferedOutputStream 是处理流(包装流)
![7174f42e863d52eeeb8babf1cb3df946.png](https://i-blog.csdnimg.cn/blog_migrate/f0611efb8e889b0b92966cae492daf49.png)
分析:
1) 读文件和写文件都使用了缓冲区,减少了读写次数,从而提高了效率
2) 当创建这两个缓冲流的对象时时,会创建了内部缓冲数组,缺省使用 32 字节大小的缓冲区.
3) 当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区
4) 当写入数据时,首先写入缓冲区,当缓冲区满时,其中的数据写入所连接的输出流。使用方法 lush()可以强制将缓冲区的内容全部写入输出流
5) 关闭流的顺序和打开流的顺序相反.只要关闭高层流即可,关闭高层流其实关闭的底层节点流
6) flush()的使用:手动将 buffer 中内容写入文件
3、使用缓冲流实现文件的高效率复制
示例代码:
public
运行结果:
![98224cb2e281ff83eec94c42f1053325.png](https://i-blog.csdnimg.cn/blog_migrate/4c856823015af59334741efc3dde3c79.png)
注意:
1. 在关闭流时,应该先关闭最外层的包装流,即“后开的先关闭”。
2. 缓存区的大小默认是8192字节,也可以使用其它的构造方法自己指定大小。
二、BufferedReader / BufferedWriter 缓冲字符流
BufferedReader / BufferedWriter 增加了缓存机制,大大提高了读写文本文件的效率,同时,提供了更方便的按行读取的方法:readLine(); 处理文本时,我们一般可以使用缓冲字符流。
案例:使用 BufferedReader 与 BufferedWriter 实现文本文件的复制
public
注意: 1. readLine() 方法是 BufferedReader 特有的方法,可以对文本文件进行更加方便的读取操作。 2. 写入一行后要记得使用 newLine() 方法换行。知乎视频www.zhihu.com
希望可以帮到大家~