缓冲阅读器和文件阅读器以及扫描仪类之间的区别[重复]
Posted
技术标签:
【中文标题】缓冲阅读器和文件阅读器以及扫描仪类之间的区别[重复]【英文标题】:Difference between buffered reader and file reader and scanner class [duplicate] 【发布时间】:2014-01-17 06:17:32 【问题描述】:谁能解释一下BufferedReader
、FileReader
和Scanner
类之间的区别?当我想读取文本文件时使用哪一个?
【问题讨论】:
如果你必须阅读一个文件你可以使用apache commons io:String string = FileUtils.readFileToString(file);
这样你就不用担心读者了。
【参考方案1】:
嗯:
FileReader
只是一个 Reader
,它使用平台默认编码 (urgh) 读取文件
BufferedReader
是另一个 Reader
的包装器,增加了缓冲和一次读取一行的能力
Scanner
从各种不同的来源读取,但通常用于交互式输入。我个人觉得Scanner
的 API 非常痛苦和晦涩。
要读取文本文件,我建议使用 FileInputStream
包裹在 InputStreamReader
中(以便您可以指定编码),然后包裹在 BufferedReader
中用于缓冲和读取一行的能力时间。
或者,您可以使用更简单的第三方库,例如Guava:
File file = new File("foo.txt");
List<String> lines = Files.readLines(file, Charsets.UTF_8);
或者,如果您使用的是 Java 7,那么您已经可以在 java.nio.file.Files
中使用它:
Path path = FileSystems.getDefault().getPath("foo.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
【讨论】:
Java 7 也有同样的东西:Files.readAllLines
.
@dbw 相对于... Guava 的readLines
?
@MarkoTopolnik:谢谢,没见过。将其添加到答案中。
readLines
是否有能力获取所需的行数或者只是在n
行之后停止,我认为它也会将所有行加载到内存中,因此对于大文件来说这将是个问题。 ...
@dbw:如果你只想处理一些行,Guava中还有CharStreams.readLines(InputSupplier, LineProcessor)
方法等替代方案。【参考方案2】:
根据您阅读文本文件的问题,您应该使用BufferedReader
,因为Scanner
隐藏IOException,而BufferedReader
立即抛出。
BufferedReader
是同步的,而Scanner
不是。
Scanner
用于从流的内容中解析令牌。
BufferedReader
只是读取流。
更多信息请点击链接 (http://en.allexperts.com/q/Java-1046/2009/2/Difference-Scanner-Method-Buffered.htm)
【讨论】:
感谢您的回答。我看不出需要同步读取操作的原因。您了解此设计决策背后的原因吗?以上是关于缓冲阅读器和文件阅读器以及扫描仪类之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章