Я использую 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
от BufferedSource
и вызвать close
.
try {
src.getLines.foreach(l => print(l))
}
finally src match { case b: scala.io.BufferedSource => b.close }
В качестве альтернативы я мог бы создать Source
из InputStream
и управлять закрытием себя.
Однако это кажется несколько грязным. Как вы должны освобождать дескриптор файла при использовании Source
?