关于缓冲流的理解
缓冲流这个概念是针对底层流来说的,属于高层次的流,在平常的底层流(字节输入流)的使用中,发现的问题就是效率比较低,cpu与io的互动比较慢,原因主要在于io是慢速设备,在仅仅使用字节流来单字节读写时,cpu需要经常等待io,所以导致读写效率太低。此时,引入缓冲的概念,先把多个字节的数据放入内存,众所周知,内存的速度要比io快的多的多,虽然也赶不上cpu,但已经好很多了,cpu直接与内存互动,这自然提高效率。缓冲流的存在更像是套在底层流身上的一个外骨骼机甲,缓冲流对象进行什么动作,底层流也会进行什么动作,只用操作一次,不过因为数据在缓冲区,所以底层流真正处理数据是在数据从缓冲区流到底层流之后才会进行,动作相当于有点延迟,让子弹飞一会儿的感觉。
缓冲流与字节流读写时使用字节数组
字节流中是可以使用字节数组的,一次读取多个,放到数组中,而不是一次读取一个那么慢,可以提高读写的效率。而使用字节数组与缓冲流是不冲突的,我还想了好一会儿,想比一比那个更好,但其实两个可以一起使用。缓冲流是读取了暂时先放在缓冲区中,之后再给底层流;而字节数组是用在一次读取一个还是读取好几个的问题上,所以两个可以组合使用,也没必要讨论谁的效率更高。
关于缓冲区以及缓冲区刷新
在创建缓冲流对象时,可以指定缓冲区的大小,也可以不指定。默认的缓冲区大小是8192个字节,这个貌似是比较优的一个大小,当然,缓冲区太大了浪费内存,太小了影响效率,具体还是看处理文件大小时考虑。当缓冲区未满时,数据存在缓冲区,此时我们若需要将缓冲区的数据送到底层流,让数据进行真正的被操作,则需要刷新一下。刷新就是讲缓冲区的数据送到底层流,这里用flush()方法。值得注意的两个点:
1.当缓冲区被装满了时,缓冲区会自动flush,所以不需要额外操作,过多的flush没有意义且降低效率
2.close()释放资源时实际会默认调用一次flush
所以综上两点,我们只需要记得在最后释放资源即可,一般情况下不太需要纠结flush
文件复制中缓冲流的效果
将一个600M左右的文件从一个文件夹复制到另一个文件夹。
单个字节读写(字节流) | 1024字节数组读写(字节流) |
---|---|
one thousand years··· | 3544ms |
单个字节读写(缓冲流) | 1024字节数组读写(缓冲流) |
---|---|
19134ms | 866ms |
由上表可见,缓冲流的效率提升超级明显
使用字节数组也是提升的比较高
两者组合,更好
总结
总的来说,缓冲流就是为了提高读写效率,缓解设备间速度差异过大的问题,和计算机中的缓存一个道理,一般使用的话似乎只要会用就行。
第一篇博客,希望能坚持写下去,能坚持自己的从小白到工作程度的自学之路。
文章很多时候是写自己的理解,想法,有时比较抽象难懂,抱歉。若是有错误,欢迎指出,谢谢。