处理流:

处理流是对一个已经存在的流的连接和封装,利用的是装饰设计模式,通过所封装后的流进行功能调用实现数据读写,例如BufferedInputStream,处理流的构造器总是需要带一个其他流的对象作为参数。一个流经过其他流的多次包装,称为流的连接,例如FileInputStream的对象经过BufferedInputStream包装后,才使用BufferedInputStream的对象去调用读写数据的方法,那么这个过程就形成了一个流的连接。

  读写流程示意:

77e3075cf3827d1c2e9948c53be2d5de.png


加解密流程示意:

ca19a98bb0f3a54fdca78e650072c0e3.png



常用的处理流:

FileInputStreamFileOutputStream是基本的流。

 

缓存流:

BufferedInputStream

BufferedOutputStream

 

基本数据流:

DataInputStream

DataOutputStream

 

对象流:

ObjectInputStream

ObjectOutputStream

 

 

缓存流:

缓存流作为缓冲读写数据使用,它有一个大小为8k的缓存池,加上缓存流的话在读取数据的时候每次就会一次性读取8k,然后读完了再读取8k,输出也是如此,所以能够优化读写上的速度,但是只适合用于单个字节或少量字节的读取或输出上的事情上才有效果。因为如果是批量读取的话,每次读取的字节数量都比较大,就没必要多此一举去使用缓存流了,使用缓存流的话如果不是马上调用close关闭,就需要调用flush方法来清理缓存。

  流程示意:

5a97f37368f46e341596b01ead594204.png



代码示例:

  这是一个拷贝文件的代码示例,用于对比读取单个字节的情况下,使用缓存流和不使用缓存流的区别,并且对比批量读取下使用缓存流和不使用缓存流的区别:

单个字节读取使用缓存流的方式:

e8b916bfe53fc64fd7461f38826fae2f.png


运行结果:

d7d5b1e5f538ec4e5174501846691ea9.png



单个字节读取不使用缓存流的方式:

7dae1a13f004cc910532be82d70db6df.png


运行结果:

6334463fd3568bc38f47fa7cdb7a3623.png

从结果可以看出,缓存流在这种单个字节读取的速度优化上效果是相当好。


批量读取下使用缓存流的方式:

9be1f7f1895ecc8c84373cd28338cd30.png


运行结果:

1cb23a47352fe05c43ca0749b8bae9a8.png



批量读取下不使用缓存流的方式:

4b3cead83d417315186025df43007cb6.png


运行结果:

bd911b8e2284f13fadfee967082e869e.png

  从结果可以看出,缓存流在这种批量字节读取的速度优化上效果是相差无几的,甚至有时候加上缓存流反而会变慢,所以在这种批量读取的方式上不需要用缓存流。