Module java.base
Package java.io

Class BufferedReader

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

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

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

通常,对Reader发出的每个读取请求都会导致对底层字符流或字节流发出相应的读取请求。因此,建议在可能成本高昂的Reader周围包装一个BufferedReader,例如FileReaders和InputStreamReaders。例如,

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

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

自版本:
1.1
参见:
  • Field Summary

    Fields declared in class java.io.Reader

    lock
  • Constructor Summary

    Constructors
    Constructor
    Description
    创建使用默认大小输入缓冲区的缓冲字符输入流。
    BufferedReader(Reader in, int sz)
    创建使用指定大小的输入缓冲区的缓冲字符输入流。
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    close()
    关闭流并释放与其关联的任何系统资源。
    lines()
    返回一个Stream,其元素是从此BufferedReader中读取的行。
    void
    mark(int readAheadLimit)
    标记流中的当前位置。
    boolean
    告知此流是否支持mark()操作,它支持。
    int
    read()
    读取单个字符。
    int
    read(char[] cbuf, int off, int len)
    将字符读入数组的一部分。
    读取一行文本。
    boolean
    ready()
    告知此流是否准备好进行读取。
    void
    reset()
    将流重置为最近的标记。

    Methods declared in class java.io.Reader

    nullReader, read, read, skip, transferTo

    Methods declared in class java.lang.Object

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

    • BufferedReader

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

      public BufferedReader(Reader in)
      创建使用默认大小输入缓冲区的缓冲字符输入流。
      参数:
      in - 一个Reader
  • Method Details

    • 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方法返回-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)中的任何一个终止的。
      返回:
      包含行内容(不包括任何行终止字符)的字符串,如果已到达流的末尾而没有读取任何字符,则为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
      返回:
      如果此流支持标记操作,则为true。
    • 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。

      返回:
      提供由这个BufferedReader描述的文本行的Stream<String>
      自版本:
      1.8