Para leer archivos en Scala, hay
Source.fromFile("file.txt").mkString
¿Hay una manera concisa y equivalente de escribir una cadena en el archivo?
La mayoría de los idiomas admiten algo así. Mi favorito es Groovy:
def f = new File("file.txt")
// Read
def s = f.text
// Write
f.text = "file contents"
Me gustaría usar el código para programas que van desde una sola línea hasta una página corta de código. Tener que usar tu propia biblioteca no tiene sentido aquí. Espero que un lenguaje moderno me permita escribir algo en un archivo convenientemente.
Hay publicaciones similares a esta, pero no responden a mi pregunta exacta o se centran en versiones anteriores de Scala.
Por ejemplo:
Respuestas:
Una línea concisa:
fuente
write()
,close
nunca se llamará y el archivo no se cerrará.PrintWriter
también usa la codificación predeterminada del sistema, que es muy mala para la portabilidad. Y finalmente, este enfoque genera una clase separada específicamente para esta línea (sin embargo, dado que Scala ya genera toneladas de clases incluso para un código simple, esto no es un inconveniente en sí mismo).new PrintWriter(tmpFile) { try {write(debugmsg)} finally {close} }
close()
, creonew java.io.PrintWriter("/tmp/hello") { write("file contents"); close }
Es extraño que nadie haya sugerido operaciones NIO.2 (disponible desde Java 7):
Creo que esta es, con mucho, la forma más simple, fácil e idiomática, y no necesita ninguna dependencia sin Java.
fuente
reflect.io.File.writeAll(contents)
. ¿Por qué? Tres líneas cuando incluye las dos declaraciones de importación. Tal vez el IDE lo haga por usted automáticamente, pero si en el REPL no es tan fácil.Files.write
también acepta unjava.lang.Iterable
como el segundo argumento, y podemos obtenerlo de una ScalaIterable
, es decir, casi cualquier tipo de colección, utilizando un convertidor:import java.nio.file.{Files, Paths}; import scala.collection.JavaConverters.asJavaIterableConverter; val output = List("1", "2", "3"); Files.write(Paths.get("output.txt"), output.asJava)
Aquí hay una línea concisa que usa reflect.io.file, esto funciona con Scala 2.12:
Alternativamente, si desea utilizar las bibliotecas de Java, puede hacer este truco:
fuente
Some
/foreach
combo es un poco funky, pero viene con el beneficio de no intentar / atrapar / finalmente.Some
/foreach
hack es exactamente por qué muchas personas odian a Scala por el código ilegible que hace que los hackers produzcan.scala.tootls.nsc.io.File
es un alias para elreflect.io.File
. Todavía API interna, pero al menos un poco más corta.Si le gusta la sintaxis de Groovy, puede usar el patrón de diseño Pimp-My-Library para llevarlo a Scala:
Funcionará como se esperaba:
fuente
fuente
#>
, qué hace!
?echo
herramienta de línea de comandos.Una micro biblioteca que escribí: https://github.com/pathikrit/better-files
o
fuente
Puede usar fácilmente Apache File Utils . Mira la función
writeStringToFile
. Usamos esta biblioteca en nuestros proyectos.fuente
Uno también tiene este formato, que es conciso y la biblioteca subyacente está bellamente escrita (vea el código fuente):
fuente
Esto es bastante conciso, supongo:
fuente
Puede hacer esto con una combinación de bibliotecas Java y Scala. Tendrá control total sobre la codificación de caracteres. Pero desafortunadamente, los identificadores de archivo no se cerrarán correctamente.
fuente
Sé que no es una línea, pero resuelve los problemas de seguridad por lo que puedo ver;
Si no le importó el manejo de excepciones, puede escribir
fuente
ACTUALIZACIÓN: desde entonces he creado una solución más efectiva sobre la cual he elaborado aquí: https://stackoverflow.com/a/34277491/501113
Me encuentro trabajando cada vez más en la Hoja de trabajo de Scala dentro del IDE de Scala para Eclipse (y creo que hay algo equivalente en IntelliJ IDEA). De todos modos, necesito poder hacer una línea para generar algunos de los contenidos a medida que obtengo el mensaje "La salida excede el límite de corte". mensaje si estoy haciendo algo significativo, especialmente con las colecciones Scala.
Se me ocurrió una línea que inserto en la parte superior de cada nueva hoja de trabajo de Scala para simplificar esto (y, por lo tanto, no tengo que hacer todo el ejercicio de importación de la biblioteca externa para una necesidad muy simple). Si eres un fanático y notas que técnicamente son dos líneas, es solo para hacerlo más legible en este foro. Es una sola línea en mi Hoja de trabajo de Scala.
Y el uso es simplemente:
Esto me permite proporcionar opcionalmente el nombre del archivo si deseo tener archivos adicionales más allá del valor predeterminado (que sobrescribe completamente el archivo cada vez que se llama al método).
Entonces, el segundo uso es simplemente:
¡Disfrutar!
fuente
Utilice la biblioteca de operaciones de ammonite . La sintaxis es muy mínima, pero la amplitud de la biblioteca es casi tan amplia como lo que cabría esperar al intentar tal tarea en un lenguaje de scripting de shell como bash.
En la página a la que enlacé, muestra numerosas operaciones que uno puede hacer con la biblioteca, pero para responder a esta pregunta, este es un ejemplo de cómo escribir en un archivo
fuente
A través de la magia del punto y coma, puedes hacer lo que quieras con un solo trazo.
fuente