java io BufferedInputStream源码分析

本文详细分析了Java中的BufferedInputStream类,涵盖了DEFAULT_BUFFER_SIZE和MAX_BUFFER_SIZE常量,buf缓冲区,以及count、pos、markpos和marklimit等字段的作用。文章还深入探讨了getXXXOpen方法、构造函数、fill方法和三个read方法的实现细节,最后讨论了其他相关方法。
摘要由CSDN通过智能技术生成

目录

简介

字段DEFAULT_BUFFER_SIZE,MAX_BUFFER_SIZE,buf,bufUpdater,count,pos,markpos,marklimit

两个getXXXOpen方法,两个构造函数

fill方法和3个read方法

其余方法


简介

package java.io;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

/**
 * BufferedInputStream将缓冲输入并支持标记和重置方法的能力,添加到另一个输入流中。
 * 当创建bufferedinputstream时,将创建一个内部缓冲区数组。
 * 当读取或者跳过流中的字节时,如果需要,内部缓冲区将从所包含的输入流中重新一次读取许多字节。
 * mark操作会记住输入流中的一个点,而reset操作会在
 * 从包含的输入流中获取新字节之前,将自最近的mark操作以来读取的所有字节重新读取。
 *
 * @author  Arthur van Hoff
 * @since   JDK1.0
 */
public
class BufferedInputStream extends FilterInputStream

字段DEFAULT_BUFFER_SIZE,MAX_BUFFER_SIZE,buf,bufUpdater,count,pos,markpos,marklimit


    /**
     * 8192
     */
    private static int DEFAULT_BUFFER_SIZE = 8192;

    /**
     * 能分配的数组的最大大小。
     * 一些虚拟机在数组中保留一些头字。
     * 尝试分配更大的数组可能会导致  OutOfMemoryError:请求的数组大小超过VM限制
     */
    private static int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8;

    /**
     * 存储数据的内部缓冲区数组。
     * 必要时,可以用另一个大小不同的数组替换它。
     */
    protected volatile byte buf[];

    /**
     * 为buf提供compareAndSet的原子更新器。
     * 这是必要的,因为关闭可以是异步的。
     * 我们使用设置buf数组为null作为该流关闭的主要指示符。
     * (“in”字段在关闭时也为null。)
     */
    private static final
        AtomicReferenceFieldUpdater<BufferedInputStream, byte[]> bufUpdater =
        AtomicReferenceFieldUpdater.newUpdater
        (BufferedInputStream.class,  byte[].class, "buf");

    /**
     * 比缓冲区中最后一个有效字节的索引大1的索引。
     * 这个值总是在0到buf.length的范围内;
     * 元素buf[0]到buf[count-1]包含从底层输入流获得的缓冲输入数据。
     */
    protected int count;

    /**
     * 缓冲区中的当前位置。
     * 这是从buf数组中读取的下一个字符的索引。
     * <p>
     * 此值始终在0到count的范围内。
     * 如果它小于count,那么buf[pos]是下一个作为输入提供的字节;
     * 如果它等于count,那么下一个读操作或跳操作将需要从包含的输入流中提取更多字节。
     *
     * @see     java.io.BufferedInputStream#buf
     */
    protected int pos;

    /**
     * 调用最后一个mark方法时pos字段的值。
     * <p>
     * 这个值总是在-1到pos的范围内。如果在输入流中没有标记位置,这个字段是-1。
     * 如果在输入流中有一个标记位置,那么buf[markpos]是reset操作后作为输入提供的第一个字节。
     * 如果markpos不是-1,那么从位置 buf[markpos]到buf[pos -1]的所有字节必须保留在缓冲区数组中
     * (尽管它们可能会被分配到缓冲区数组中的另一个位置,并对count、pos和markpos的值进行适当的调整);
     * 除非和直到pos和markpos之间的差异超过marklimit,否则不能丢弃它们。
     *
     * @see     java.io.BufferedInputStream#mark(int)
     * @see     java.io.BufferedInputStream#pos
     */
    protected int markpos = -1;

    /**
     * 调用mark方法后在后续调用reset方法失败之前允许的最大预读量。
     * 每当pos和markpos之间的差异超过marklimit时,可以通过将markpos设置为-1来删除标记。
     *
     * @see     java.io.BufferedInputStream#mark(int)
     * @see     java.io.BufferedInputStream#reset()
     */
    protected int marklimit;

两个getXXXOpen方法,两个构造函数

    /**
     * 检查以确保底层输入流没有因关闭而被空;
     * 如果没有关闭,则返回底层输入流;
     */
    private InputStream getInIfOpen() throws IOException {
        InputStream input = in;
        if (input == null)
            throw new IOException("Stream closed");
        return input;
    }

    /**
     * 检查以确保缓存数组没有因关闭而被空;
     *
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值