我正在使用斯卡拉Source.fromFile
但是,我似乎無法找到一個很好的方式,讓它close
底層InputStream
一旦該文件已被讀取。Scala Source爲什麼不關閉底層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")
}
源有一個名爲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
時釋放文件句柄?
@DCS是「正在進行的第三方努力」的鏈接或名稱? – 2012-04-12 20:43:19
@ C.W.HolemanII [斯卡拉I/O](https://github.com/scala-incubator/scala-io),遺憾的是,兩年半後,它仍然不是標準庫的一部分。 – 2012-04-13 12:45:57