什么是使用scala.io.Source的正确方法?

时间:2010-12-16 08:45:59

标签: scala scala-2.8

在许多示例中,描述了您可以使用scala.io.Source来读取整个文件:

val str = scala.io.Source.fromFile("test.txt").mkString()

但没有提到关闭基础流。

为什么Scala没有提供一种方便的方法来执行此操作,例如Python中的with子句?它看起来很有用但并不困难。

还有其他更好的方法在Scala中安全地执行此操作,我的意思是读取整个文件吗?

4 个答案:

答案 0 :(得分:23)

为了完整起见

val testTxtSource = scala.io.Source.fromFile("test.txt")
val str = testTxtSource.mkString()
testTxtSource.close()

应该完成任务。

答案 1 :(得分:22)

Scala的io库只是为了满足有限的需求而进行的。我们努力为Scala提供一个经过深思熟虑的io库,Scala目前托管在assembla,并且还有一个github存储库。

如果您打算将I / O用于读取短期进程上的临时文件,则最好使用Java库,或者查看编译器中现有的I / O支持(将要求scala-compiler.jar与app一起分发。

关于自动资源管理,请查看this questionthis library(在该问题的接受答案中有特色)。

答案 2 :(得分:6)

我推荐using the using,这会让您的代码更整洁,更可靠

using(Source.fromFile("test.txt")){ _.mkString()}

答案 3 :(得分:1)

Scala 2.13开始,标准库提供了专用的资源管理实用程序:Using

在这种情况下,它可以与scala.io.Source一起使用,因为它扩展了AutoCloseable以便从文件中读取,无论如何,之后都应关闭文件资源:

import scala.util.Using
import scala.io.Source

Using(Source.fromFile("file.txt")) { source => source.mkString }
// scala.util.Try[String] = Success("hello\nworld\n")