Ich benutze Scala Source.fromFile
aber ich kann nicht scheinen, eine nette Möglichkeit zu finden, es close
der zugrunde liegenden InputStream
zu bekommen, sobald die Datei gelesen worden ist.Warum schließt Scala Source den zugrunde liegenden InputStream nicht?
Hier ist mein Code, der mit einem AssertionError
fehlschlägt, weil die Datei nicht gelöscht werden kann.
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")
}
Quelle eine Methode hat reset
jedoch alle genannt, dass dies tut, ist die Quelle, aus der Datei neu zu erstellen.
Intern Source
erstellt eine zugrunde liegende BufferedSource
, die eine close
Methode hat. Dies wird jedoch nicht von der Quelle angezeigt.
Ich hoffe, dass Source das Datei-Handle freigeben würde, sobald der Inhalt der Datei gelesen wurde, aber das scheint das nicht zu tun.
Die beste Problemumgehung, die ich bis jetzt gesehen habe, besteht darin, die Source
zu einer BufferedSource
im Wesentlichen zu werfen und close
zu rufen.
try {
src.getLines.foreach(l => print(l))
}
finally src match { case b: scala.io.BufferedSource => b.close }
Alternativ könnte ich eine Source
von einem InputStream
erstellen und die Schließung selbst verwalten.
Allerdings scheint dies etwas schmutzig. Wie soll das Dateihandle freigegeben werden, wenn Source
verwendet wird?
@DCS ein Link zu oder Name der "laufenden Bemühungen Dritter"? –
@ C.W. HolemanII [Scala I/O] (https://github.com/scala-incubator/scala-io), die leider nach zweieinhalb Jahren immer noch nicht Teil der Standardbibliothek ist. –