BufferedInputStream
java.lang.Object
|—java.io.InputStream
|—|—java.io.FilterInputStream
|—|—|—java.io.BufferedInputStream
public class BufferedInputStream
extends FilterInputStream
BufferedInputStream 向另一个输入流添加了功能,即缓冲输入并支持标记和重置方法的能力。 创建 BufferedInputStream 时,会创建一个内部缓冲区数组。 当流中的字节被读取或跳过时,内部缓冲区会根据需要从包含的输入流中重新填充,一次很多字节。 标记操作会记住输入流中的一个点,并且重置操作会导致在从包含的输入流中获取新字节之前重新读取自最近一次标记操作以来读取的所有字节。
Since:
JDK1.0
字段摘要
修饰符和类型 | 字段 | 描述 |
---|---|---|
protected byte[] | buf | 存储数据的内部缓冲区数组。 |
protected int | count | 比缓冲区中最后一个有效字节的索引大一的索引。 |
protected int | marklimit | 在随后调用 reset 方法失败之前调用 mark 方法后允许的最大预读。 |
protected int | markpos | 调用最后一个标记方法时 pos 字段的值。 |
protected int | pos | 缓冲区中的当前位置。 |
从类 java.io.FilterInputStream 继承的字段 |
---|
in |
构造函数摘要
构造函数 | 描述 |
---|---|
BufferedInputStream(InputStream in) | 创建一个 BufferedInputStream 并保存其参数,即输入流,以供以后使用。 |
BufferedInputStream(InputStream in, int size) | 创建具有指定缓冲区大小的 BufferedInputStream,并保存其参数,即输入流,以供以后使用。 |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
int | available() | 返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。 |
void | close() | 关闭此输入流并释放与该流关联的所有系统资源。 |
void | mark(int readlimit) | 参见 InputStream 的 mark 方法的通用约定。 |
boolean | markSupported() | 测试此输入流是否支持 mark 和 reset 方法。 |
int | read() | 参见 InputStream 的 read 方法的通用约定。 |
int | read(byte[] b, int off, int len) | 从此字节输入流中将字节读取到指定的字节数组中,从给定的偏移量开始。 |
void | reset() | 参见 InputStream 的 reset 方法的通用约定。 |
long | skip(long n) | 参见 InputStream 的 skip 方法的通用约定。 |
从类 java.io.FilterInputStream 继承的方法 |
---|
read |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
字段详细信息
buf
protected volatile byte[] buf
存储数据的内部缓冲区数组。 必要时,它可以被另一个不同大小的数组替换。
count
protected int count
比缓冲区中最后一个有效字节的索引大一的索引。 该值始终在 0 到 buf.length 的范围内; 元素 buf[0] 到 buf[count-1] 包含从底层输入流获得的缓冲输入数据。
marklimit
protected int marklimit
在随后调用 reset 方法失败之前调用 mark 方法后允许的最大预读。 每当 pos 和 markpos 之间的差值超过 marklimit 时,可以通过将 markpos 设置为 -1 来删除该标记。
markpos
protected int markpos
调用最后一个标记方法时 pos 字段的值。
该值始终在 -1 到 pos 的范围内。 如果输入流中没有标记位置,则该字段为-1。 如果输入流中有标记位置,则 buf[markpos] 是复位操作后作为输入提供的第一个字节。 如果 markpos 不是 -1,则从位置 buf[markpos] 到 buf[pos-1] 的所有字节都必须保留在缓冲区数组中(尽管它们可以移动到缓冲区数组中的另一个位置,并适当调整 计数、位置和标记位置); 除非且直到 pos 和 markpos 之间的差异超过 marklimit,否则它们可能不会被丢弃。
pos
protected int pos
缓冲区中的当前位置。 这是要从 buf 数组中读取的下一个字符的索引。
该值始终在 0 到 count 的范围内。 如果它小于 count,则 buf[pos] 是作为输入提供的下一个字节; 如果它等于 count,那么下一次读取或跳过操作将需要从包含的输入流中读取更多字节。
构造函数详细信息
BufferedInputStream
public BufferedInputStream(InputStream in)
创建一个 BufferedInputStream 并保存其参数,即输入流,以供以后使用。 创建一个内部缓冲区数组并将其存储在 buf 中。
参数:
参数名称 | 参数描述 |
---|---|
in | 底层输入流。 |
BufferedInputStream
public BufferedInputStream(InputStream in, int size)
创建具有指定缓冲区大小的 BufferedInputStream,并保存其参数,即输入流,以供以后使用。 创建一个长度大小的内部缓冲区数组并将其存储在 buf 中。
参数:
参数名称 | 参数描述 |
---|---|
in | 底层输入流。 |
size | 缓冲区大小。 |
Throws:
Throw名称 | Throw描述 |
---|---|
IllegalArgumentException | 如果 size <= 0. |
方法详情
read
public int read() throws IOException
参见 InputStream 的 read 方法的通用约定。
覆盖:
读入类 FilterInputStream
返回:
数据的下一个字节,如果到达流的末尾,则为 -1。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果此输入流已通过调用其 close() 方法关闭,或者发生 I/O 错误。 |
read
public int read(byte[] b, int off, int len) throws IOException
从此字节输入流中将字节读取到指定的字节数组中,从给定的偏移量开始。
该方法实现了 InputStream 类对应的 [InputStream#read(byte], int, int) 方法的通用约定。 作为额外的便利,它尝试通过重复调用底层流的读取方法来读取尽可能多的字节。 此迭代读取将继续,直到满足以下条件之一:
- 已读取指定数量的字节,
- 底层流的read方法返回-1,表示文件结束,或者
- 底层流的可用方法返回零,表示进一步的输入请求将阻塞。
如果对底层流的第一次读取返回 -1 以指示文件结束,则此方法返回 -1。 否则,此方法返回实际读取的字节数。
鼓励但不要求此类的子类尝试以相同方式读取尽可能多的字节。
覆盖:
读入类 FilterInputStream
参数:
参数名称 | 参数描述 |
---|---|
b | 目标缓冲区。 |
off | 开始存储字节的偏移量。 |
len | 要读取的最大字节数。 |
返回:
读取的字节数,如果已到达流的末尾,则为 -1。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果此输入流已通过调用其 close() 方法关闭,或者发生 I/O 错误。 |
skip
public long skip(long n) throws IOException
参见 InputStream 的 skip 方法的通用约定。
覆盖:
跳过类 FilterInputStream
参数:
参数名称 | 参数描述 |
---|---|
n | 要跳过的字节数。 |
返回:
跳过的实际字节数。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果流不支持查找,或者此输入流已通过调用其 close() 方法关闭,或者发生 I/O 错误。 |
available
public int available() throws IOException
返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。 下一次调用可能是同一个线程或另一个线程。 单次读取或跳过这么多字节不会阻塞,但可能会读取或跳过更少的字节。
此方法返回缓冲区中要读取的剩余字节数 (count – pos) 和调用 in.available() 的结果之和。
覆盖:
在类 FilterInputStream 中可用
返回:
估计可以从该输入流中读取(或跳过)而不阻塞的字节数。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果此输入流已通过调用其 close() 方法关闭,或者发生 I/O 错误。 |
mark
public void mark(int readlimit)
参见 InputStream 的 mark 方法的通用约定。
覆盖:
在类 FilterInputStream 中标记
参数:
参数名称 | 参数描述 |
---|---|
readlimit | 在标记位置无效之前可以读取的最大字节数。 |
reset
public void reset() throws IOException
参见 InputStream 的 reset 方法的通用约定。
如果 markpos 为 -1(未设置标记或标记已失效),则抛出 IOException。 否则,将 pos 设置为等于 markpos。
覆盖:
在类 FilterInputStream 中重置
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果此流尚未被标记,或者如果标记已失效,或者流已通过调用其 close() 方法关闭,或者发生 I/O 错误。 |
markSupported
public boolean markSupported()
测试此输入流是否支持 mark 和 reset 方法。 BufferedInputStream 的 markSupported 方法返回 true。
覆盖:
类 FilterInputStream 中的 markSupported
返回:
一个布尔值,指示此流类型是否支持标记和重置方法。
close
public void close() throws IOException
关闭此输入流并释放与该流关联的所有系统资源。 关闭流后,进一步的 read()、available()、reset() 或 skip() 调用将引发 IOException。 关闭以前关闭的流没有效果。
指定者:
在接口 AutoCloseable 中关闭
指定者:
在接口Closeable中关闭
覆盖:
在类 FilterInputStream 中关闭
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生 I/O 错误。 |