Module java.base
Package java.io

Class BufferedInputStream

所有已实现的接口:
Closeable, AutoCloseable

public class BufferedInputStream extends FilterInputStream
BufferedInputStream 添加了对另一个输入流的功能,即缓冲输入并支持 markreset 方法。创建 BufferedInputStream 时,会创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区会根据需要从包含的输入流中以多个字节的方式进行填充。 mark 操作会记住输入流中的一个点,而 reset 操作会导致自最近的 mark 操作以来读取的所有字节在从包含的输入流中获取新字节之前重新读取。
自版本:
1.0
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected byte[]
    buf
    存储数据的内部缓冲区数组。
    protected int
    缓冲区中最后一个有效字节的索引加一。
    protected int
    在调用 mark 方法后,允许的最大预读量,在后续调用 reset 方法之前。
    protected int
    上次调用 mark 方法时的 pos 字段的值。
    protected int
    pos
    缓冲区中的当前位置。

    Fields declared in class java.io.FilterInputStream

    in
  • Constructor Summary

    Constructors
    Constructor
    Description
    创建一个 BufferedInputStream 并保存其参数,即输入流 in,以备后用。
    创建具有指定缓冲区大小的 BufferedInputStream,并保存其参数,即输入流 in,以备后用。
  • Method Summary

    Modifier and Type
    Method
    Description
    int
    返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
    void
    close()
    关闭此输入流并释放与流相关的任何系统资源。
    void
    mark(int readlimit)
    查看 InputStreammark 方法的一般约定。
    boolean
    测试此输入流是否支持 markreset 方法。
    int
    read()
    查看 InputStreamread 方法的一般约定。
    int
    read(byte[] b, int off, int len)
    从此字节输入流中读取字节到指定的字节数组中,从给定偏移量开始。
    void
    reset()
    查看 InputStreamreset 方法的一般约定。
    long
    skip(long n)
    查看 InputStreamskip 方法的一般约定。

    Methods declared in class java.io.FilterInputStream

    read

    Methods declared in class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • buf

      protected volatile byte[] buf
      存储数据的内部缓冲区数组。必要时,它可能会被不同大小的另一个数组替换。
    • count

      protected int count
      缓冲区中最后一个有效字节的索引加一。此值始终在范围 0buf.length 之间;元素 buf[0]buf[count-1] 包含从底层输入流获取的缓冲输入数据。
    • pos

      protected int pos
      缓冲区中的当前位置。这是要从 buf 数组中读取的下一个字节的索引。

      此值始终在范围 0count 之间。如果小于 count,则 buf[pos] 是要作为输入提供的下一个字节;如果等于 count,则下一个 readskip 操作将需要从包含的输入流中读取更多字节。

      另请参阅:
    • markpos

      protected int markpos
      上次调用 mark 方法时的 pos 字段的值。

      此值始终在范围 -1pos 之间。如果输入流中没有标记的位置,则此字段为 -1。如果输入流中有标记的位置,则 buf[markpos]reset 操作后要作为输入提供的第一个字节。如果 markpos 不是 -1,则从位置 buf[markpos]buf[pos-1] 的所有字节必须保留在缓冲区数组中(尽管它们可以移动到缓冲区数组中的另一个位置,并对 countposmarkpos 的值进行适当调整);除非 posmarkpos 之间的差异超过 marklimit,否则不能丢弃它们。

      另请参阅:
    • marklimit

      protected int marklimit
      在调用 mark 方法后,允许的最大预读量,在后续调用 reset 方法之前。每当 posmarkpos 之间的差异超过 marklimit 时,通过将 markpos 设置为 -1 可以丢弃标记。
      另请参阅:
  • Constructor Details

    • BufferedInputStream

      public BufferedInputStream(InputStream in)
      创建一个 BufferedInputStream 并保存其参数,即输入流 in,以备后用。创建一个内部缓冲区数组并将其存储在 buf 中。
      参数:
      in - 底层输入流。
    • BufferedInputStream

      public BufferedInputStream(InputStream in, int size)
      创建具有指定缓冲区大小的 BufferedInputStream,并保存其参数,即输入流 in,以备后用。创建一个长度为 size 的内部缓冲区数组并将其存储在 buf 中。
      参数:
      in - 底层输入流。
      size - 缓冲区大小。
      抛出:
      IllegalArgumentException - 如果 size <= 0
  • Method Details

    • read

      public int read() throws IOException
      查看 InputStreamread 方法的一般约定。
      覆盖:
      read 在类 FilterInputStream
      返回:
      下一个数据字节,如果达到流的末尾则返回 -1
      抛出:
      IOException - 如果通过调用其 close() 方法关闭了此输入流,或发生 I/O 错误。
      另请参阅:
    • read

      public int read(byte[] b, int off, int len) throws IOException
      从此字节输入流中读取字节到指定的字节数组中,从给定偏移量开始。

      此方法实现了 InputStream 类的相应 read 方法的一般约定。作为额外方便,它尝试通过重复调用底层流的 read 方法来读取尽可能多的字节。此迭代的 read 操作将继续,直到以下条件之一为真:

      • 已读取指定数量的字节,
      • 底层流的 read 方法返回 -1,表示文件结束,或
      • 底层流的 available 方法返回零,表示进一步的输入请求将被阻塞。
      如果底层流的第一个 read 返回 -1 表示文件结束,则此方法返回 -1。否则,此方法返回实际读取的字节数。

      鼓励但不要求此类的子类以相同方式尝试尽可能多地读取字节。

      覆盖:
      read 在类 FilterInputStream
      参数:
      b - 目标缓冲区。
      off - 开始存储字节的偏移量。
      len - 要读取的最大字节数。
      返回:
      读取的字节数,如果已到达流的末尾则返回 -1
      抛出:
      IOException - 如果通过调用其 close() 方法关闭了此输入流,或发生 I/O 错误。
      IndexOutOfBoundsException - 如果 off 为负数,len 为负数,或 len 大于 b.length - off
      另请参阅:
    • skip

      public long skip(long n) throws IOException
      查看 InputStreamskip 方法的一般约定。
      覆盖:
      skip 在类 FilterInputStream
      参数:
      n - 要跳过的字节数。
      返回:
      实际跳过的字节数。
      抛出:
      IOException - 如果通过调用其 close() 方法关闭了此输入流,in.skip(n) 抛出 IOException,或发生 I/O 错误。
      另请参阅:
    • available

      public int available() throws IOException
      返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。下一次调用可能是同一线程或另一个线程。读取或跳过这么多字节的单个操作不会阻塞,但可能读取或跳过更少的字节。

      此方法返回剩余要在缓冲区中读取的字节数(count - pos)和调用 in.available() 的结果的总和。

      覆盖:
      available 在类 FilterInputStream
      返回:
      可从此输入流中读取(或跳过)的字节数的估计,而不会阻塞。
      抛出:
      IOException - 如果通过调用其close()方法关闭了此输入流,或发生I/O错误。
    • mark

      public void mark(int readlimit)
      查看InputStreammark方法的一般约定。
      覆盖:
      mark 在类 FilterInputStream
      参数:
      readlimit - 在标记位置变为无效之前可以读取的字节数的最大限制。
      另请参见:
    • reset

      public void reset() throws IOException
      查看InputStreamreset方法的一般约定。

      如果markpos-1(未设置标记或标记已失效),则抛出IOException。否则,将pos设置为markpos

      覆盖:
      reset 在类 FilterInputStream
      抛出:
      IOException - 如果此流未被标记,或者如果标记已失效,或者通过调用其close()方法关闭了流,或发生I/O错误。
      另请参见:
    • markSupported

      public boolean markSupported()
      测试此输入流是否支持markreset方法。 BufferedInputStreammarkSupported方法返回true
      覆盖:
      markSupported 在类 FilterInputStream
      返回:
      一个boolean,指示此流类型是否支持markreset方法。
      另请参见:
    • close

      public void close() throws IOException
      关闭此输入流并释放与流关联的任何系统资源。一旦流被关闭,进一步的read()、available()、reset()或skip()调用将抛出IOException。关闭先前关闭的流没有任何效果。
      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Closeable
      覆盖:
      close 在类 FilterInputStream
      抛出:
      IOException - 如果发生I/O错误。
      另请参见: