2010-12-16 44 views
20

En muchos ejemplos, se describe que se puede utilizar scala.io.Source para leer un archivo completo de esta manera:¿Cuál es la forma correcta de usar scala.io.Source?

val str = scala.io.Source.fromFile("test.txt").mkString() 

Pero el cierre de la secuencia subyacente no se menciona. ¿Por qué Scala no proporciona una manera conveniente de hacerlo, como con cláusula en Python? Parece útil pero no difícil.

¿Hay alguna otra forma mejor de hacerlo de forma segura en Scala, es decir, leer un archivo completo?

+0

Es correcto utilizar el origen de esta manera no cerrar la secuencia subyacente? – woods

+4

Si lee el código de scala.io.Source, encontrará que, de hecho, le deja el trabajo de cerrar la transmisión subyacente. ¡Asombroso! – woods

Respuesta

18

La biblioteca de Scala io se ha pirateado para proporcionar asistencia para necesidades limitadas. Hubo un esfuerzo por proporcionar una biblioteca bien pensada a Scala, que actualmente está alojada en el assembla, con un repositorio github también.

Si va a utilizar E/S para algo más que leer el archivo ocasional en procesos de corta duración, será mejor que use bibliotecas Java, o consulte la compatibilidad de E/S actualmente disponible en el compilador (que requerirá scala-compiler.jar para ser distribuido con la aplicación).

En cuanto a la administración automática de recursos, mira this question, o al this library (que aparece en la respuesta aceptada a esa pregunta).

+1

¿Todavía recomendaría no usar scala.io a partir de 2016? – knub

+3

@knub No he mirado a Scala 2.12 para ver si algo mejoró allí, pero, de lo contrario, sí, mantengo la misma recomendación. –

20

En aras de la exhaustividad

val testTxtSource = scala.io.Source.fromFile("test.txt") 
val str = testTxtSource.mkString() 
testTxtSource.close() 

En caso de hacer las cosas.

+5

¿No debería estar en un bloque 'try' y' close() 'en el bloque' finally'? – robinst

+1

@robinst Eso sería algo bueno y estoy de acuerdo con la respuesta de Daniel (es decir, no use scala.io.Source en absoluto) Sin embargo, ha sido útil en nuestros Dojos donde no escribimos código de producción. Además, usaría una biblioteca ARM (en lugar de 'try'' catch') porque 'close()' también podría arrojar una excepción y me resulta incómodo tener un 'try'' catch' 'finally' dentro de un' finally '. – matyjas

2

recomiendo using the using, lo que hace que su código más limpio y más fiable

using(Source.fromFile("test.txt")){ _.mkString()} 
Cuestiones relacionadas