Estoy usando Scala Source.fromFile
sin embargo, parece que no puedo encontrar una buena manera de obtenerlo close
subyacente InputStream
una vez que el archivo ha sido leído.¿Por qué Scala Source no cierra el InputStream subyacente?
Aquí está mi código que fallará con un AssertionError
porque el archivo no se puede eliminar.
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")
}
Fuente tiene un método llamado reset
sin embargo todo lo que esto hace es recrear la fuente del archivo.
Internamente Source
crea un BufferedSource
subyacente que tiene un método close
. Sin embargo, esto no está expuesto desde la Fuente.
Espero que Source suelte el identificador del archivo una vez que se haya leído el contenido del archivo, pero parece que no lo hace.
La mejor solución que he visto hasta ahora es esencialmente lanzar el Source
a un BufferedSource
y llamar al close
.
try {
src.getLines.foreach(l => print(l))
}
finally src match { case b: scala.io.BufferedSource => b.close }
alternativa que podría crear un Source
de un InputStream
y gestionar el mismo cierre.
Sin embargo, esto parece un poco sucio. ¿Cómo se supone que debe liberar el controlador del archivo cuando usa Source
?
@DCS ¿un enlace o nombre del "esfuerzo de terceros en curso"? –
@ C.W.HolemanII [Scala I/O] (https://github.com/scala-incubator/scala-io), que, por desgracia, después de dos años y medio, todavía no es parte de la biblioteca estándar. –