Java BufferedInputStream BufferedOutputStream类源码解析

BufferedInputStream

​ BufferedInputStream是一个缓冲输入流,继承的是FilterInputStream。FilterInputStream包含了另一个InputStream作为它的基础数据源,并且FilterInputStream重写了InputStream的所有方法。作为FilterInputStream需要重写其中的部分方法,如果没有重写的话默认调用InputStream的同名方法。

​ 对于BufferedInputStream来说,常规的用法是以FileInputStream作为它的下层输入流,原因是FileInputStream是从文件中读取字节,而文件处于硬盘之中,每次从硬盘读取数据的速度相对于内存很慢。如果多次通过FileInputStream读取或跳过一段字符,就需要多次访问硬盘,如果能够通过一次访问将整块内容读取到内存中,再从内存中多次读取,效率就可以大幅度提高,这就是内存缓冲区。举个极端例子来说,连续调用FileInputStream.read()一千次,得到文件中一千个连续字节,访问硬盘1000次。如果使用FileInputStream.read(buff[1000]),然后从buff[]中读取1000个字节,只需要访问硬盘1-2(跨页)次,访问内存1000次,毫无疑问由于内存对硬盘的数量级速度优势是后者快得多。

​ BufferedInputStream对另一个输出流增加了功能,支持缓存输入和mark/reset操作。当创建BufferedInputStream时,一个内部缓冲数组被建立,随着字节从流中被读取或者跳过,内部缓冲区根据需要从包含的输入流中重新装填许多字节。mark操作记录了输入流中的一个位置,reset操作引起在最近一个mark操作前的所有读取的字节在流中新的字节被获取之前被重新读取。涉及数据的方法是线程同步的。

先来看一下内部变量,可以看到BufferedInputStream新增了很多内部变量来支持缓存以及mark/reset操作。buf数组作为缓冲区,其中的有效字节数是count,当前读取到的位置是pos,所以count-pos是剩余可以从缓冲区内直接读取的字节数。markpos是标记的位置,-1代表没有标记过,pos-markpos是标记之后的字节数,该值不能超过marklimit,超过的话会导致markpos被设为-1也就是mark内容被丢弃。

原文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值