模块 java.base
 java.io

类 BufferedReader

java.lang.Object
java.io.Reader
java.io.BufferedReader
所有已实现的接口:
Closeable , AutoCloseable , Readable
已知子类:
LineNumberReader

public class BufferedReader extends Reader
从字符输入流中读取文本,缓冲字符以便有效地读取字符、数组和行。

可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

通常,对 Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将 BufferedReader 包装在其 read() 操作可能代价高昂的任何 Reader 周围,例如 FileReaders 和 InputStreamReaders。例如,

 BufferedReader in
  = new BufferedReader(new FileReader("foo.in"));
 
将缓冲来自指定文件的输入。如果没有缓冲,每次调用 read() 或 readLine() 都可能导致从文件中读取字节,将其转换为字符,然后返回,这可能非常低效。

使用 DataInputStreams 进行文本输入的程序可以通过用适当的 BufferedReader 替换每个 DataInputStream 来本地化。

自从:
1.1
参见:
  • 构造方法详细信息

    • BufferedReader

      public BufferedReader(Reader  in, int sz)
      创建使用指定大小的输入缓冲区的缓冲字符输入流。
      参数:
      in - 读者
      sz - 输入缓冲区大小
      抛出:
      IllegalArgumentException - 如果 sz <= 0
    • BufferedReader

      public BufferedReader(Reader  in)
      创建使用默认大小输入缓冲区的缓冲字符输入流。
      参数:
      in - 读者
  • 方法详情

    • read

      public int read() throws IOException
      读取单个字符。
      重写:
      read 在类 Reader
      返回:
      读取的字符,作为 0 到 65535 (0x00-0xffff) 范围内的整数,如果已到达流的末尾,则为 -1
      抛出:
      IOException - 如果发生 I/O 错误
    • read

      public int read(char[] cbuf, int off, int len) throws IOException
      将字符读入数组的一部分。

      该方法实现了Reader 类对应的read 方法的通用契约。作为额外的便利,它会尝试通过重复调用底层流的 read 方法来读取尽可能多的字符。这种迭代 read 一直持续到以下条件之一变为真:

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

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

      通常,此方法从该流的字符缓冲区中获取字符,并根据需要从底层流中填充它。但是,如果缓冲区为空,标记无效,并且请求的长度至少与缓冲区一样大,则此方法将直接从底层流中读取字符到给定数组中。因此冗余的 BufferedReader 不会不必要地复制数据。

      指定者:
      read 在类 Reader
      参数:
      cbuf - 目标缓冲区
      off - 开始存储字符的偏移量
      len - 要读取的最大字符数
      返回:
      读取的字符数,如果已到达流末尾则为 -1
      抛出:
      IndexOutOfBoundsException - 如果 off 为负,或 len 为负,或 len 大于 cbuf.length - off
      IOException - 如果发生 I/O 错误
    • readLine

      public String  readLine() throws IOException
      读取一行文本。一行被认为是由换行符 ('\n')、回车符 ('\r')、紧跟换行符的回车符或到达文件末尾中的任何一个终止的(EOF)。
      返回:
      包含行内容的 String,不包括任何行终止字符,如果在未读取任何字符的情况下已到达流末尾,则为 null
      抛出:
      IOException - 如果发生 I/O 错误
      参见:
    • ready

      public boolean ready() throws IOException
      告知此流是否已准备好读取。如果缓冲区不为空,或者如果底层字符流准备就绪,则缓冲字符流准备就绪。
      重写:
      ready 在类 Reader
      返回:
      如果保证下一个 read() 不会阻塞输入,则为 True,否则为 false。请注意,返回 false 并不能保证下一次读取会阻塞。
      抛出:
      IOException - 如果发生 I/O 错误
    • markSupported

      public boolean markSupported()
      告知此流是否支持 mark() 操作,它支持。
      重写:
      markSupported 在类 Reader
      返回:
      当且仅当此流支持标记操作时才为真。
    • mark

      public void mark(int readAheadLimit) throws IOException
      标记流中的当前位置。对 reset() 的后续调用将尝试将流重新定位到这一点。
      重写:
      mark 在类 Reader
      参数:
      readAheadLimit - 限制在仍保留标记的情况下可以读取的字符数。在读取达到或超过此限制的字符后尝试重置流可能会失败。大于输入缓冲区大小的限制值将导致分配一个大小不小于限制的新缓冲区。因此,应谨慎使用大值。
      抛出:
      IllegalArgumentException - 如果 readAheadLimit < 0
      IOException - 如果发生 I/O 错误
    • reset

      public void reset() throws IOException
      将流重置为最近的标记。
      重写:
      reset 在类 Reader
      抛出:
      IOException - 如果流从未被标记过,或者标记已经失效
    • close

      public void close() throws IOException
      从类复制的描述:Reader
      关闭流并释放与其关联的任何系统资源。流关闭后,进一步的 read()、ready()、mark()、reset() 或 skip() 调用将抛出 IOException。关闭之前关闭的流没有任何效果。
      指定者:
      close 在接口 AutoCloseable
      指定者:
      close 在接口 Closeable
      指定者:
      close 在类 Reader
      抛出:
      IOException - 如果发生 I/O 错误
    • lines

      public Stream <String > lines()
      返回一个 Stream ,其元素是从此 BufferedReader 读取的行。 Stream 是延迟填充的,即只读发生在 终端流操作 期间。

      在执行终端流操作期间,不得对阅读器进行操作。否则,终端流操作的结果是未定义的。

      执行终端流操作后,无法保证读取器位于特定位置以读取下一个字符或行。

      如果在访问底层 BufferedReader 时抛出 IOException ,它会被包裹在 UncheckedIOException 中,后者将从导致读取发生的 Stream 方法中抛出。如果在关闭的 BufferedReader 上调用此方法,将返回一个 Stream。在该流关闭后需要从 BufferedReader 读取的任何操作都将导致抛出 UncheckedIOException。

      返回:
      a Stream<String> 提供此 BufferedReader 描述的文本行
      自从:
      1.8