【问题标题】:What does a BufferedReader constructor expect a FileReaderBufferedReader 构造函数期望 FileReader 什么
【发布时间】:2012-01-10 13:45:10
【问题描述】:

我需要了解这两个类之间的区别以及它们如何相互协作。我知道 FileReader 一次从文件中读取一个字符,而 BufferedReader 读取大量数据并将其存储在缓冲区中,从而使其速度更快。

为了使用 BufferedReader,我必须为其提供 FileReader。如果 BufferedReader 类以不同方式读取文件,它如何使用 FileReader?这是否意味着 BufferedReader 使用 FileReader,因此在幕后仍然一次读取一个字符?我想我的问题是 BufferedReader 类如何使用 FileReader 类。

【问题讨论】:

  • 你不应该关心它是如何工作的。知道它确实如此,而且它很可能比你自己想出的任何东西都更有效率。如果您坚持要详细了解它的工作原理,请继续查看源代码。

标签: java file file-io io


【解决方案1】:

BufferedReader 使用FileReader.read(char[] cbuf, int off, int len) 方法,如果您想一次获取多个字符,也可以读取该方法。

BufferedReader 可以更轻松地读取您想要的大小并且仍然高效。如果您总是阅读大块,则删除 BufferedReader 可能会更有效。

【讨论】:

    【解决方案2】:

    首先,BufferedReader 采用 Reader,而不是 FileReader(尽管接受后者)。

    Reader 抽象类有几个 read() 方法。有一个读取一个字符的版本以及两个将一个字符块读入数组的版本。

    仅当您一次读取单个字符或小块时,使用BufferedReader 才有意义。

    考虑以下两个请求:

    char ch1 = fileReader.read();
    char ch2 = bufferedReader.read()
    

    第一个将转到底层文件,而第二个很可能会从BufferedReader 的内部缓冲区中得到满足。

    【讨论】:

      【解决方案3】:

      FileReader 能够读取块,而不仅仅是一次读取 1 个字符。它从Reader 继承了 read(char[]) 方法,因此您可以读取传入的 char[] 数组的大小。BufferedReader 只是包装了 FileReader,因此当您在 BufferedReader 上调用 read() 方法时,它在内部处理缓冲区并在其底层 Reader 上调用 read() 方法。您使用 BufferedReader 的主要原因之一是您可以使用 readLine() 方法。 BufferedReader 可以包装除 FileReader 之外的其他 Reader(如 InputStreamReader)。

      【讨论】:

      • BufferedReader '包装' FileReader 的概念很重要。如上一行所述,BufferedReader 还可以包装其他类型的 Reader,例如 InputStreamReader 也可以自己包装。这称为Decorator Pattern 它允许将额外的功能/行为动态添加到对象中。
      【解决方案4】:

      BufferedReader 在任何阅读器之上添加一层缓冲。与以无缓冲方式读取文件、套接字或其他内容相比,重点是使读取更加优化。 它还添加了一些方便的方法,除非它为您预取了一个块,否则这些方法不会很好地工作。在 FileReader 的情况下,您必须读取一大块数据,直到找到 '\n' 才能执行类似 BufferedReader.readLine() 之类的操作,然后您必须保留其余数据以进行下一次读取操作(更不用说当您必须等待缓慢的数据源将其全部交付给您时所需的工作)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多