缓冲阅读器和文件阅读器以及扫描仪类之间的区别[重复]

Posted

技术标签:

【中文标题】缓冲阅读器和文件阅读器以及扫描仪类之间的区别[重复]【英文标题】:Difference between buffered reader and file reader and scanner class [duplicate] 【发布时间】:2014-01-17 06:17:32 【问题描述】:

谁能解释一下BufferedReaderFileReaderScanner 类之间的区别?当我想读取文本文件时使用哪一个?

【问题讨论】:

如果你必须阅读一个文件你可以使用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)

【讨论】:

感谢您的回答。我看不出需要同步读取操作的原因。您了解此设计决策背后的原因吗?

以上是关于缓冲阅读器和文件阅读器以及扫描仪类之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

mmap()与阅读块

接口和抽象之间有啥区别以及依赖注入如何[重复]

List 和 IEnumerable 之间的实际区别 [重复]

单例对象和基类对象之间的区别是啥[重复]

char * 和 char[] 的区别 [重复]

np.matmul 和 PEP 465 之间的区别 [重复]