将Scala中BufferedReader的所有行读入字符串

Posted

技术标签:

【中文标题】将Scala中BufferedReader的所有行读入字符串【英文标题】:Read All Lines of BufferedReader in Scala into a String 【发布时间】:2013-09-26 06:15:14 【问题描述】:

如何读取BufferedReader所有行并将其存储到字符串中?

 val br = new BufferedReader(...)
 val str: String = getAllLines(br) // getAllLines() -- is where I need help

类似于这个question。

【问题讨论】:

一定要用BufferedReader吗?为什么不用Source.fromFile("myfile.txt").getLines() 或类似的? 我需要使用BufferedReader,因为我从这里使用UnicodeBOMInputStream - ***.com/questions/1835430/…。 那么Source.fromInputStream(myUnicodeBOMInputStream).getLines() 可能会更容易。 【参考方案1】:

这就是我在 Scala 中处理BufferedReader 的方式:

val br:BufferedReader = ???
val strs = Stream.continually(br.readLine()).takeWhile(_ != null)

阅读器的每一行都会有一个字符串。如果你想在一个字符串中:

val str = Stream.continually(br.readLine()).takeWhile(_ != null).mkString("\n")

【讨论】:

continually 的使用非常棒。我还不知道。谢谢! 我建议根据Java API docs 直接调用BufferedReader.close()。请确保在您使用数据后调用它,因为Stream 是懒惰的。例如,使用mkString("\n") 的建议将强制评估Streamforce 也是如此。但是如果您在val strs = ... 行之后调用close(),您将无法读取任何行。 有没有办法避免在您的解决方案中使用null @kfkhalili,一种方法是:val str = Stream.continually(reader.readLine()).takeWhile(Option(_).nonEmpty).mkString("\n")

以上是关于将Scala中BufferedReader的所有行读入字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何逐行拆分scala中的文本

java:如何使用 bufferedreader 读取特定行

如何将火花行(StructType)投射到scala案例类

通过Map Spark Scala循环

Java 中 BufferedReader.readLine() 的最大行长?

在scala中读取文本文件,一行接一行,不迭代