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

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

【问题讨论】:

  • 如果你必须阅读一个文件你可以使用apache commons io:String string = FileUtils.readFileToString(file);这样你就不用担心读者了。

标签: java java.util.scanner bufferedreader filereader


【解决方案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)

【讨论】:

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