目录
字段DEFAULT_BUFFER_SIZE,MAX_BUFFER_SIZE,buf,bufUpdater,count,pos,markpos,marklimit
简介
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;
}
/**
* 检查以确保缓存数组没有因关闭而被空;
*