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 中 FileReader
和 BufferedReader
类的用途。
在 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?的主要内容,如果未能解决你的问题,请参考以下文章