Я использую 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")
}
В источнике есть метод с именем 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 }
В качестве альтернативы я мог бы создать Source
из InputStream
и самостоятельно управлять закрытием.
Однако это выглядит несколько грязно . Как вы должны освободить дескриптор файла при использовании Source
?