java学习笔记-I/O篇(2):BufferedInputStream

我们都知道输出时如果不去flush,数据会暂存在buffer里不会真正地输出。那么输入呢?输入显然不需要我们去关心太多,我们只需要读就行了。buffer对于使用者是透明的,但是通过查看源码可以得知它是怎么操作的。


(详细的代码分析先不做)


简单的讲,通过一个private static int DEFAULT_BUFFER_SIZE = 8192; 默认为8192长度的buffer(创建BufferedInputStream实例时可以指定Buffer大小),和一个fill()方法,来实现一次性读取一堆数据并保存在buffer里。


fill()方法的作用就是预读一段输入,将其存在buffer里。当我们调用read时,假如buffer里还有我们没读过的数据,就会先读buffer。假如buffer里的数据不够我们这次要读的总数,那么就会调用fill(),从流里再预读一段数据进buffer,再从buffer里去读,重复这个过程直到满足这次要读的总数为止。


假如我们要读取的数据长度很长(超过buffer大小),那么就会不走buffer直接去流里面读相应长度的数据,然后再fill一次。


这么做其实就是相当于用空间换时间:内存操作的速度通常都要比I/O(比如读写硬盘)要高速很多很多,通过预读一段数据进内存可以在读取非常频繁的情况下大大增加系统运行的速度。读取越频繁、缓冲区定义的越大,速度提升越明显。当然,如果缓冲区太大的话当心内存不够用(一般不太会出现这种情况)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值