在许多示例中,描述了您可以使用scala.io.Source
来读取整个文件:
val str = scala.io.Source.fromFile("test.txt").mkString()
但没有提到关闭基础流。
为什么Scala没有提供一种方便的方法来执行此操作,例如Python中的with子句?它看起来很有用但并不困难。
还有其他更好的方法在Scala中安全地执行此操作,我的意思是读取整个文件吗?
答案 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 question或this 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")