InputStream
java.lang.Object
|—java.io.InputStream
public abstract class InputStream
extends Object
implements Closeable
这个抽象类是代表字节输入流的所有类的超类。
需要定义 InputStream 子类的应用程序必须始终提供返回下一个输入字节的方法。
Since:
JDK1.0
构造函数摘要
构造函数 | 描述 |
---|---|
InputStream() |
方法总结
修饰符和类型 | 方法 | 描述 |
---|---|---|
int | available() | 返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。 |
void | close() | 关闭此输入流并释放与该流关联的所有系统资源。 |
void | mark(int readlimit) | 标记此输入流中的当前位置。 |
boolean | markSupported() | 测试此输入流是否支持 mark 和 reset 方法。 |
abstract int | read() | 从输入流中读取数据的下一个字节。 |
int | read(byte[] b) | 从输入流中读取一些字节并将它们存储到缓冲区数组 b. |
int | read(byte[] b, int off, int len) | 从输入流中读取最多 len 个字节的数据到一个字节数组中。 |
void | reset() | 将此流重新定位到最后一次在此输入流上调用标记方法时的位置。 |
long | skip(long n) | 跳过并丢弃此输入流中的 n 字节数据。 |
从类 java.lang.Object 继承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
构造函数详细信息
InputStream
public InputStream()
方法详情
read
public abstract int read() throws IOException
从输入流中读取数据的下一个字节。 值字节作为 int 返回,范围为 0 到 255。如果由于到达流的末尾而没有可用的字节,则返回值 -1。 此方法会一直阻塞,直到输入数据可用、检测到流结束或引发异常。
子类必须提供此方法的实现。
返回:
数据的下一个字节,如果到达流的末尾,则为 -1。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生 I/O 错误。 |
read
public int read(byte[] b) throws IOException
从输入流中读取一些字节并将它们存储到缓冲区数组 b. 实际读取的字节数以整数形式返回。 在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。
如果 b 的长度为零,则不读取任何字节并返回 0; 否则,将尝试读取至少一个字节。 如果由于流位于文件末尾而没有可用字节,则返回值 -1; 否则,至少读取一个字节并将其存储到 b 中。
读取的第一个字节存储在元素 b[0] 中,下一个字节存储在 b[1] 中,依此类推。 读取的字节数最多等于 b 的长度。 设 k 为实际读取的字节数; 这些字节将存储在元素 b[0] 到 b[k-1] 中,而元素 b[k] 到 b[b.length-1] 不受影响。
InputStream 类的 read(b) 方法与以下效果相同:
read(b, 0, b.length)
参数:
参数名称 | 参数描述 |
---|---|
b | 读取数据的缓冲区。 |
返回:
读入缓冲区的总字节数,如果由于到达流的末尾而没有更多数据,则为 -1。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果由于文件结尾以外的任何原因无法读取第一个字节,如果输入流已关闭,或者发生其他一些 I/O 错误。 |
NullPointerException | 如果 b 为空。 |
read
public int read(byte[] b, int off, int len) throws IOException
从输入流中读取最多 len 个字节的数据到一个字节数组中。尝试读取多达 len 个字节,但可能会读取较小的字节数。实际读取的字节数以整数形式返回。
在输入数据可用、检测到文件结尾或引发异常之前,此方法会一直阻塞。
如果 len 为零,则不读取任何字节并返回 0;否则,将尝试读取至少一个字节。如果由于流位于文件末尾而没有可用字节,则返回值 -1;否则,至少读取一个字节并将其存储到 b 中。
读取的第一个字节存储在元素 b[off] 中,下一个字节存储在 b[off+1] 中,依此类推。读取的字节数最多等于 len。设 k 为实际读取的字节数;这些字节将存储在元素 b[off] 到 b[off+k-1] 中,而元素 b[off+k] 到 b[off+len-1] 不受影响。
在每种情况下,元素 b[0] 到 b[off] 和元素 b[off+len] 到 b[b.length-1] 都不受影响。
InputStream 类的 read(b, off, len) 方法只是重复调用方法 read()。如果第一个此类调用导致 IOException,则该异常会从对 read(b, off, len) 方法的调用中返回。如果对 read() 的任何后续调用导致 IOException,则捕获该异常并将其视为文件结尾;到目前为止读取的字节存储在 b 中,并返回发生异常之前读取的字节数。此方法的默认实现会阻塞,直到读取了请求的输入数据量 len、检测到文件结尾或抛出异常。鼓励子类提供此方法的更有效实现。
参数:
参数名称 | 参数描述 |
---|---|
b | 读取数据的缓冲区。 |
off | 数组 b 中写入数据的起始偏移量。 |
len | 要读取的最大字节数。 |
返回:
读入缓冲区的总字节数,如果由于到达流的末尾而没有更多数据,则为 -1。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果由于文件结尾以外的任何原因无法读取第一个字节,或者输入流已关闭,或者发生其他一些 I/O 错误。 |
NullPointerException | 如果 b 为空。 |
IndexOutOfBoundsException | 如果 off 为负数,len 为负数,或者 len 大于 b.length – off |
skip
public long skip(long n) throws IOException
跳过并丢弃此输入流中的 n 字节数据。 由于各种原因,skip 方法最终可能会跳过一些较小的字节数,可能是 0。这可能是由许多条件中的任何一个引起的; 在跳过 n 个字节之前到达文件末尾只是一种可能性。 返回实际跳过的字节数。 如果 n 为负数,则 InputStream 类的 skip 方法始终返回 0,并且不跳过任何字节。 子类可能以不同方式处理负值。
此类的 skip 方法创建一个字节数组,然后重复读取它,直到读取 n 个字节或到达流的末尾。 鼓励子类提供此方法的更有效实现。 例如,实现可能取决于寻找的能力。
参数:
参数名称 | 参数描述 |
---|---|
n | 要跳过的字节数。 |
返回:
跳过的实际字节数。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果流不支持查找,或者发生其他一些 I/O 错误。 |
available
public int available() throws IOException
返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。下一次调用可能是同一个线程或另一个线程。单次读取或跳过这么多字节不会阻塞,但可能会读取或跳过更少的字节。
请注意,虽然 InputStream 的某些实现会返回流中的字节总数,但许多不会。使用此方法的返回值来分配旨在保存此流中所有数据的缓冲区是不正确的。
如果此输入流已通过调用 close() 方法关闭,则此方法的子类的实现可以选择抛出 IOException。
InputStream 类的可用方法总是返回 0。
这个方法应该被子类覆盖。
返回:
可以在没有阻塞的情况下从此输入流中读取(或跳过)的字节数的估计值,或者当它到达输入流的末尾时为 0。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生 I/O 错误。 |
close
public void close() throws IOException
关闭此输入流并释放与该流关联的所有系统资源。
InputStream 的 close 方法什么也不做。
指定者:
在接口 AutoCloseable 中关闭
指定者:
在接口Closeable中关闭
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果发生 I/O 错误。 |
mark
public void mark(int readlimit)
标记此输入流中的当前位置。 对 reset 方法的后续调用将此流重新定位到最后标记的位置,以便后续读取重新读取相同的字节。
readlimit 参数告诉此输入流允许在标记位置无效之前读取那么多字节。
mark 的一般约定是,如果方法 markSupported 返回 true,则流以某种方式记住调用 mark 之后读取的所有字节,并准备好在调用方法 reset 时再次提供这些相同的字节。 但是,如果在调用 reset 之前从流中读取了超过 readlimit 个字节,则流根本不需要记住任何数据。
标记关闭的流不应对流产生任何影响。
InputStream 的mark 方法什么都不做。
参数:
参数名称 | 参数描述 |
---|---|
readlimit | 在标记位置无效之前可以读取的最大字节数。 |
reset
public void reset() throws IOException
将此流重新定位到最后一次在此输入流上调用标记方法时的位置。
重置的一般合约是:
- 如果方法 markSupported 返回 true,则:
- 如果自创建流以来尚未调用方法标记,或者自上次调用标记以来从流中读取的字节数大于上次调用时标记的参数,则可能会引发 IOException。
- 如果没有抛出这样的 IOException,则流将被重置为这样的状态,即自最近一次调用 mark(或自文件开始,如果尚未调用 mark)读取的所有字节将被重新提供给后续 read 方法的调用者,后跟任何字节,否则在调用重置时将成为下一个输入数据。
- 如果方法 markSupported 返回 false,则:
- 对 reset 的调用可能会引发 IOException。
- 如果未抛出 IOException,则流将重置为固定状态,该状态取决于输入流的特定类型及其创建方式。 将提供给 read 方法的后续调用者的字节取决于输入流的特定类型。
InputStream 类的方法 reset 除了抛出一个 IOException 之外什么都不做。
Throws:
Throw名称 | Throw描述 |
---|---|
IOException | 如果此流尚未标记或标记已失效。 |
markSupported
public boolean markSupported()
测试此输入流是否支持 mark 和 reset 方法。 是否支持标记和重置是特定输入流实例的不变属性。 InputStream 的 markSupported 方法返回 false。
返回:
如果此流实例支持 mark 和 reset 方法,则为 true; 否则为 false。