在Scala中读取整个文件?

什么是在Scala中将整个文件读入内存的简单而规范的方法? (理想情况下,控制字符编码。)

我能想到的最好的是:

scala.io.Source.fromPath("file.txt").getLines.reduceLeft(_+_)

或者我应该使用Java的一个可怕的成语,其中最好的(不使用外部库)似乎是:

import java.util.Scanner
import java.io.File
new Scanner(new File("file.txt")).useDelimiter("Z").next()

从阅读邮件列表的讨论,我不清楚scala.io.Source甚至应该是规范的I / O库。 我完全不明白它的预期目的是什么。

...我想要一些简单而容易记住的事情。 例如,在这些语言中,很难忘记这个习语......

Ruby    open("file.txt").read
Ruby    File.read("file.txt")
Python  open("file.txt").read()

val lines = scala.io.Source.fromFile("file.txt").mkString

顺便说一句,“ scala. ”并不是真的有必要,因为它始终在范围内,当然,您可以完全或部分地导入io的内容,并避免必须添加“io”。 太。

但是,以上将文件打开。 为了避免问题,你应该像这样关闭它:

val source = scala.io.Source.fromFile("file.txt")
val lines = try source.mkString finally source.close()

上述代码的另一个问题是由于它的实现性质,它非常慢。 对于较大的文件应该使用:

source.getLines mkString "n"

为了扩展Daniel的解决方案,您可以通过将以下导入插入任何需要文件操作的文件中来大大缩短事情的发生:

import scala.io.Source._

有了这个,你现在可以做到:

val lines = fromFile("file.txt").getLines

我会警惕将整个文件读入单个String 。 这是一种非常不好的习惯,会比你想象的更快,更难咬你。 getLines方法返回一个类型为Iterator[String] 。 它实际上是一个懒惰的光标到文件中,允许您检查所需的数据而不会冒内存过剩的风险。

哦,并回答你对Source的隐含问题:是的,它是规范的I / O库。 大多数代码由于其较低级别的接口以及与现有框架的更好兼容性而最终使用java.io ,但任何有选择权的代码都应该使用Source ,特别是对于简单文件操作。


// for file with utf-8 encoding
val lines = scala.io.Source.fromFile("file.txt", "utf-8").getLines.mkString
链接地址: http://www.djcxy.com/p/68443.html

上一篇: Read entire file in Scala?

下一篇: Can't manage to get access token from linkedin api with oauth v2.0