FileReader 和 BufferedReader 的作用——为啥要包装 FileReader?

Posted

技术标签:

【中文标题】FileReader 和 BufferedReader 的作用——为啥要包装 FileReader?【英文标题】:The role of FileReader and BufferedReader - why wrapp FileReader?FileReader 和 BufferedReader 的作用——为什么要包装 FileReader? 【发布时间】:2014-09-24 18:50:17 【问题描述】:

我无法真正理解 Java 中 FileReaderBufferedReader 类的用途。

在 docs.oracle 中,建议将缓冲阅读器包装在 FileReader 对象周围,因为直接使用 FileReader 效率不高。成本或间接费用从何而来?

假设我有一个文本文件,我想使用这些类将其读入我的 java 程序:

我使用 FileReader 和 BufferedReader

FileReader fileReader = new FileReader(new File("text.txt)"); // probably correct???
BufferedReader bufferedReader = new BufferedReader(fileReader);

1) FileReader 对象在这里的任务是什么?它是否负责通过操作系统向文件发出 I/O 请求,然后读取字节?这样做的成本是多少? FileReader 发出多个 I/O 请求是真的吗?还是FileReader 对象必须逐个字符地将字节转换为字符时的成本?

2) BufferedReader-object的任务——参考上面最后一句话。 - BufferedReader 对象的作用是简单地缓冲传入字节数组,然后将它们转换为字符?

非常感谢您的回答

编辑:首先感谢收到的答案。但我应该提到它正是我研究过的这个文档。称我为愚蠢之类的 - 但“每个读取请求”是什么意思。 每个读取请求何时发出?多久一次?

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

这主要是为什么提出这个问题 - 听起来 FileReader 会导致大量 I/O 请求,这会减慢 erverthing 的速度。

【问题讨论】:

Possible Answer 【参考方案1】:

来自 oracle 文档:

一般情况下,Reader 发出的每个读取请求都会导致相应的 对底层字符或字节流的读取请求。它 因此建议将 BufferedReader 包裹在任何 Reader 周围 其 read() 操作可能代价高昂,例如 FileReaders 和 输入流读取器。例如,

BufferedReader in = new BufferedReader(new FileReader("foo.in")); 将缓冲来自指定文件的输入。没有缓冲,每个 调用 read() 或 readLine() 可能会导致从 文件,转换成字符,然后返回,可以是 非常低效。

因此,正如文档清楚地表明的那样,将 BufferedReader 包裹在 FileReader 周围可以防止一遍又一遍地从文件中读取数据。 BufferedReader 缓冲输入。

【讨论】:

【参考方案2】:

Java 有许多可以组合的 I/O 类。所以你可能会看到类似的东西:

BufferedReader in = new BufferedReader(new InputStreamReader(
    new FileInputStream(new File("..."), "UTF-8"));
...
in.close(); // Closes all.

这允许灵活组合。因此 XML 解析器可以使用 Reader,而不关心文本来自何处:文件、URL、内存。这与“更简单”的语言相反,后者没有选择实现(带有实现 HashMap、TreeMap 的 Map)。

现在,FileReader 和 FileWriter 是旧的实用程序类,用于以默认操作系统编码读取和写入文件。所以对于本地文件。 不可移植 (!) 到其他操作系统,或需要固定编码。

为此,FileReader 扩展了 InputStreamReader,后者使用 FileInputStream 读取二进制数据(InputStream)。它就是这样做的。

但是使用更大的内存缓冲区来读取是有意义的,因此建议;这也是长期存在的。请记住,性能在 Java 早期是一个问题。 FileReader-standalone 的唯一优势是在内存紧张的情况下,可能在智能手机上。

【讨论】:

Files 有很多有用的功能,还可以创建多个 Readers 和 Writers。

以上是关于FileReader 和 BufferedReader 的作用——为啥要包装 FileReader?的主要内容,如果未能解决你的问题,请参考以下文章

IO流FileReader和FileWriter

FileReader和FileInputStream的区别

bufferedreader 和 filereader 的具体区别

FileReader和FileWriter文件复制

day 21FileWriter 和FileReader

我是不是需要同时关闭() FileReader 和 BufferedReader?