IO流中缓冲流的学习与理解

关于缓冲流的理解

缓冲流这个概念是针对底层流来说的,属于高层次的流,在平常的底层流(字节输入流)的使用中,发现的问题就是效率比较低,cpu与io的互动比较慢,原因主要在于io是慢速设备,在仅仅使用字节流来单字节读写时,cpu需要经常等待io,所以导致读写效率太低。此时,引入缓冲的概念,先把多个字节的数据放入内存,众所周知,内存的速度要比io快的多的多,虽然也赶不上cpu,但已经好很多了,cpu直接与内存互动,这自然提高效率。缓冲流的存在更像是套在底层流身上的一个外骨骼机甲,缓冲流对象进行什么动作,底层流也会进行什么动作,只用操作一次,不过因为数据在缓冲区,所以底层流真正处理数据是在数据从缓冲区流到底层流之后才会进行,动作相当于有点延迟,让子弹飞一会儿的感觉。

缓冲流与字节流读写时使用字节数组

字节流中是可以使用字节数组的,一次读取多个,放到数组中,而不是一次读取一个那么慢,可以提高读写的效率。而使用字节数组与缓冲流是不冲突的,我还想了好一会儿,想比一比那个更好,但其实两个可以一起使用。缓冲流是读取了暂时先放在缓冲区中,之后再给底层流;而字节数组是用在一次读取一个还是读取好几个的问题上,所以两个可以组合使用,也没必要讨论谁的效率更高。

关于缓冲区以及缓冲区刷新

在创建缓冲流对象时,可以指定缓冲区的大小,也可以不指定。默认的缓冲区大小是8192个字节,这个貌似是比较优的一个大小,当然,缓冲区太大了浪费内存,太小了影响效率,具体还是看处理文件大小时考虑。当缓冲区未满时,数据存在缓冲区,此时我们若需要将缓冲区的数据送到底层流,让数据进行真正的被操作,则需要刷新一下。刷新就是讲缓冲区的数据送到底层流,这里用flush()方法。值得注意的两个点:
1.当缓冲区被装满了时,缓冲区会自动flush,所以不需要额外操作,过多的flush没有意义且降低效率
2.close()释放资源时实际会默认调用一次flush
所以综上两点,我们只需要记得在最后释放资源即可,一般情况下不太需要纠结flush

文件复制中缓冲流的效果

将一个600M左右的文件从一个文件夹复制到另一个文件夹。

单个字节读写(字节流)1024字节数组读写(字节流)
one thousand years···3544ms
单个字节读写(缓冲流)1024字节数组读写(缓冲流)
19134ms866ms

由上表可见,缓冲流的效率提升超级明显
使用字节数组也是提升的比较高
两者组合,更好

总结

总的来说,缓冲流就是为了提高读写效率,缓解设备间速度差异过大的问题,和计算机中的缓存一个道理,一般使用的话似乎只要会用就行。

第一篇博客,希望能坚持写下去,能坚持自己的从小白到工作程度的自学之路。
文章很多时候是写自己的理解,想法,有时比较抽象难懂,抱歉。若是有错误,欢迎指出,谢谢。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值