JDK阅读之InputStream类

本文深入剖析Java中的InputStream类,包括其核心方法如read、skip等的功能与实现细节,并探讨了流的标记与重置机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDK阅读之InputStream类

因最近在研究excel导出的问题涉,及到了字节流的读取,不知道怎么用的,所以看了一下源码。觉得有所领悟,特此记录一下该类。

源码分析

这里附上我经常查看的源码JDK8的链接,供各位客官参考。

拓扑结构

继承拓扑结构如下图所示:

extends
implements
sub
sub
文件流
sub
线程管道通信
sub
sub
Object
InputStream类
Closeable
AudioInputStream
ByteArrayInputStream
FileInputStream
ObjectInputStream
PipedInputStream
SequenceInputStream
StringBufferInputStream
方法分析
修饰符方法名描述
intavailable()返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞
voidclose()关闭此输入流并释放与该流关联的所有系统资源。
voidmark(int readLimit)标记此输入流中的当前位置。
booleanmarkSupported()测试此输入流是否支持mark(int readLimit)和reset()方法。
abstract intread()从输入流中读取下一个数据字节。
intread(byte[] b)从输入流中读取一些字节数并将它们存储到缓冲区数组b中。
intread(byte[] b,int off,int len)将输入流中最多len个字节的数据读入一个字节数组。
voidreset()将此流重新定位到上次在此输入流上调用mark方法时的位置
longskip(long n)跳过并丢弃此输入流中的n个字节的数据。
从object继承的方法

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait。

方法解析
  • read

public abstract int read() throws IOException

描述
从输入流中读取下一个数据字节。 字节值作为int返回,范围为0到255.如果没有字节可用,因为已到达流的末尾,则返回值-1。 此方法将阻塞,直到输入数据可用,检测到流的末尾或抛出异常。

返回
数据的下一个字节,如果到达流的末尾,则返回-1。

  • read

public int read(byte[] b) throws IOException

描述
从输入流中读取一些字节数并将它们存储到缓冲区数组b中。 实际读取的字节数以整数形式返回。 此方法将阻塞,直到输入数据可用,检测到文件结尾或引发异常。

如果b的长度为零,则不读取任何字节,返回0; 否则,尝试读取至少一个字节。 如果没有字节可用,因为流位于文件的末尾,则返回值-1; 否则,至少读取一个字节并存储到b中。

读取的第一个字节存储在元素b [0]中,下一个存储到b [1]中,依此类推。

类InputStream的read(b)方法具有与以下相同的效果:read(b, 0, b.length)

返回
读入缓冲区的总字节数,如果由于已到达流末尾而没有更多数据,则返回-1。

  • 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]不受影响。

类InputStream的read(b,off,len)方法只是重复调用方法read()。如果第一个这样的调用导致IOException,则从对read(b,off,len)方法的调用返回该异常。如果对read()的任何后续调用导致IOException,则捕获该异常并将其视为文件结束;读取到该点的字节存储在b中,并返回在发生异常之前读取的字节数。此方法的默认实现将阻塞,直到读取了请求的输入数据len,检测到文件结尾或抛出异常为止。鼓励子类提供更有效的此方法实现

参数

b - 读取数据的缓冲区。
off - 数组b中写入数据的起始偏移量。
len - 要读取的最大字节数。

返回

读入缓冲区的总字节数,如果由于已到达流末尾而没有更多数据,则返回-1。

  • ship

public long skip(long n) throws IOException

描述
跳过并丢弃此输入流中的n个字节的数据。 由于各种原因,跳过方法可能最终跳过一些较小数量的字节,可能为0.这可能是由许多条件中的任何一个引起的; 在跳过n个字节之前到达文件末尾只有一种可能性。 返回跳过的实际字节数。 如果n为负数,则类InputStream的skip方法始终返回0,并且不跳过任何字节。 子类可以不同地处理负值。
此类的skip方法创建一个字节数组,然后重复读入它,直到读取了n个字节或者到达了流的末尾。 鼓励子类提供更有效的此方法实现。 例如,实施可能取决于寻求的能力。

参数
n - 要跳过的字节数。
返回
跳过的实际字节数。

  • available

public int available() throws IOException

描述

返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。 下一次调用可能是同一个线程或另一个线程。 单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。
请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会。 使用此方法的返回值来分配用于保存此流中所有数据的缓冲区绝对不正确。

如果通过调用close()方法关闭此输入流,则此方法的子类实现可以选择抛出IOException。

The available method for class InputStream always returns 0.

子类应该重写此方法。

返回

估计可以从此输入流中无阻塞地读取(或跳过)的字节数,或者当它到达输入流的末尾时为0。

  • close

public void close() throws IOException

描述
关闭此输入流并释放与该流关联的所有系统资源。

The close method of InputStream does nothing.

  • mark

public void mark(int readlimit)

描述
标记此输入流中的当前位置。 随后对reset方法的调用会在最后标记的位置重新定位此流,以便后续读取重新读取相同的字节。
readlimit参数告诉此输入流允许在标记位置失效之前读取许多字节。

标记的一般规则是,如果方法markSupported返回true,则流以某种方式记住在调用mark之后读取的所有字节,并且在调用方法重置时立即准备再次提供相同的字节。

Marking a closed stream should not have any effect on the stream.

The mark method of InputStream does nothing.

参数
readlimit - 标记位置变为无效之前可读取的最大字节数。

  • reset

public void reset() throws IOException

描述
将此流重新定位到上次在此输入流上调用mark方法时的位置。
一般的重置规则是:

如果方法markSupported返回true,则:

如果自创建流以来尚未调用方法标记,或者自上次调用标记以来从流中读取的字节数大于最后一次调用时标记的参数,则可能抛出IOException。
如果未抛出此类IOException,则将流重置为一种状态,以便从最近的标记调用(或自文件启动以来,如果尚未调用标记)读取的所有字节将重新提供给后续read方法的调用者,后跟任何字节,否则
这些字节将是重置调用时的下一个输入数据。

如果方法markSupported返回false,则:
对reset的调用可能会抛出IOException。
如果未抛出IOException,则将流重置为固定状态,该状态取决于输入流的特定类型及其创建方式。将提供给read方法的后续调用者的字节取决于输入流的特定类型。

The method reset for class InputStream does nothing except throw an IOException.

  • markSupported

public boolean markSupported()

描述
测试此输入流是否支持标记和重置方法。
返回
如果此流实例支持mark和reset方法,则为true;否则为false。

还请多多支持!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值