首页 > 解决方案 > 带有 FileReader 的 BufferedReader

问题描述

我对 BufferedReader 如何与 FileReader 一起工作有疑问。也研究了有关 stackoverflow 和 Google 的大部分帖子,但我的疑问仍未消除。这是我第三天穿上这个来理解..!:)

这里是:

我的理解说,当我们使用下面的代码片段时

 BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

FileReader 读取字节数据并放入缓冲区。这里缓冲区由 BufferedReader 创建,而 BufferedReader 的实例从该缓冲区读取。

这让我想到,因为这篇文章说了解 BufferedReader 在 Java中的工作原理, BufferedReader 本身不存储任何东西,因为如果是这种情况,那么我认为 BufferedReader 做了两件事,一是创建一个缓冲区,二是创建一个从中读取的 BufferedReader 实例缓冲...!说得通...?

我的第二个疑问是,BufferedReader 可用于避免 IO 操作,这意味着避免从磁盘读取字节然后转换为 Char 然后发出的耗时工作。因此,为了克服这个问题,可以使用 BufferedReader 来一次读取大量数据。这让我想到,当 BufferedReader 包裹在 FileReader 周围时,FileReader 流首先读取,然后将数据传递给 BufferedReader。那么它如何需要一大块......?

我的理解是,BufferedReader 阅读器很有帮助,因为它从作为内存的 Buffer 中读取数据,所以与其在从磁盘读取字节并同时进行转换的时候做同样的事情,不如先将所有字节放入缓冲区或内存中,然后再读取它从那里开始,因为它的读取速度很快,也可以转换为字符。这是我通过在线阅读得出的结论,但我不同意100%,因为即使放入缓冲区也没有跳过任何步骤,那么它如何减少时间范围......?:(

我真的对这些感到困惑,谁能帮助我更准确地理解这一点?

标签: java

解决方案


FileReader读取字节数据

不,它构造一个FileInputStreamand Input Reader,并从后者读取,作为字符。

并放入缓冲区

放入调用者的缓冲区。

这里的缓冲区是由BufferedReaderBufferedReader 的实例创建的,并且从该缓冲区中读取。

正确的。

这让我想到,因为这篇文章说了解 BufferedReader 如何在 Java中工作, BufferedReader 本身不存储任何东西

那篇文章中的声明是完整的,完全是胡说八道,任何其他这样说的消息来源也是如此。当然,它存储数据。它是一个缓冲区。请参阅 Javadoc,特别是以下语句:“从字符输入流中读取文本,缓冲字符[我的重点],以便高效读取字符、数组和行。”

因为如果是这样的话,那么我想做BufferedReader两件事,一是创建一个缓冲区,二是创建一个BufferedReader从该缓冲区读取的实例......!说得通...?

不,但您的消息来源也没有。你上面的第一个直觉是正确的。

我的第二个疑问是,BufferedReader可以用来避免 IO 操作,这意味着避免从磁盘读取字节然后转换为 Char 然后发出的耗时工作。因此,为了克服这个问题,可以使用 BufferedReader 来一次读取大量数据。这让我想到,当 BufferedReader 包裹在 FileReader 周围时,FileReader 流首先读取,然后将数据传递给 BufferedReader。那么它如何需要一大块......?

通过向FileReader.read().

我的理解是,BufferedReader 阅读器很有帮助,因为它从作为内存的 Buffer 中读取数据,所以与其在从磁盘读取字节并同时进行转换的时候做同样的事情,不如先将所有字节放入缓冲区或内存中,然后再读取它从那里开始,因为它的读取速度很快,也可以转换为字符。这是我通过在线阅读得出的结论,但我不同意100%,因为即使放入缓冲区也没有跳过任何步骤,那么它如何减少时间范围......?:(

跳过从磁盘逐字符读取的步骤。从磁盘文件中读取一个块或多或少与读取一个字节一样有效,而且系统调用本身也很昂贵。


推荐阅读