BufferedInputStream源码分析

inputStream的在BufferedInputStream中使用到的方法


1、read()
2、skip()
3、available()




浅复制
BufferedInputStream内部维护一个缓冲字节数组,
当调用read1(byte[] b)方法时,核心原理是将内部缓冲字节数组的内容,浅复制到方法参数的目标字节数组中。
这样做的好处是,避免了大量的磁盘IO,因为原始的InputStream类实现的read是即时读取的,即每一次读取都会是一次磁盘IO操作(哪怕只读取了1个字节的数据),可想而知,如果数据量巨大,这样的磁盘消耗非常可怕。而通过缓冲区的实现,读取可以读取缓冲区中的内容,当读取超过缓冲区的内容后再进行一次磁盘IO,载入一段数据填充缓冲,那么下一次读取一般情况下就直接可以从缓冲区读取,减少了磁盘IO




read1(byte[] b, int off, int len)

方法是非贪婪读取,最多只从底层字节流读取一次

处理方式简称为:缓冲区没剩先填充,有剩直接读,读取有偏差,不一定按目标。

处理方式如下:

如果内部缓冲字节数组的剩余字节数为0:

      额外判断:如果目标读取字节数大于内部缓冲字节数组的长度 ,直接从底层字节流读取目标读取字节数,给目标字节数组。这样做的好处是,不用经过填充内部缓冲字节数组的中间过程,实现流的平滑降级;

       调用fill()方法填充内部缓冲字节数组。并再次检查填充后缓冲区的剩余字节数是否大于0,从而判断是否达到文件尾。

如果内部缓冲字节数组的剩余字节数大于0:

1、如果内部缓冲字节数组的剩余字节数,大于用户的目标读取字节数,按照目标读取字节数的大小浅复制给目标字节数组;
2、如果内部缓冲字节数组的剩余字节数,小于用户的目标读取字节数,按照剩余字节数的大小浅复制给目标字节数组;
/**
     * Read characters into a portion of an array, reading from the underlying
     * stream at most once if necessary.
     */
    private int read1(byte[] b, int off, int len) throws IOException {
        int avail = count - pos;
        if (avail <= 0) {
            /* If the requested length is at least as large as the buffer, and
               if there is no mark/reset activity, do not bother to copy the
               bytes into the local buffer.  In this way buffered strea
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值