【发布时间】:2010-12-18 06:48:27
【问题描述】:
我正在使用 Scala Source.fromFile,但是一旦文件被读取,我似乎无法找到一个很好的方法将其发送到 close 底层 InputStream。
这是我的代码,由于无法删除该文件,该代码将失败并显示 AssertionError。
def main(args : Array[String]) : Unit = {
val myFile = new File("c:/tmp/doodah.txt")
var src = Source.fromFile(myFile)
src.getLines.foreach(l => print(l))
val deleted: Boolean = myFile.delete
assert (deleted , "File was not deleted - maybe the stream hasn't been closed in Source")
}
Source 有一个名为 reset 的方法,但它所做的只是从文件中重新创建源。
在内部Source 创建一个底层BufferedSource 具有close 方法。但是,这不会从 Source 公开。
我希望 Source 在读取文件内容后释放文件句柄,但它似乎没有这样做。
到目前为止,我见过的最好的解决方法是将Source 转换为BufferedSource 并调用close。
try {
src.getLines.foreach(l => print(l))
}
finally src match { case b: scala.io.BufferedSource => b.close }
或者,我可以从InputStream 创建一个Source 并自己管理关闭。
不过这似乎有点脏。使用Source时应该如何释放文件句柄?
【问题讨论】: