manejo - Scala: escribe cadena en archivo en una declaración
que es string en java (13)
Para leer archivos en Scala, hay
Source.fromFile("file.txt").mkString
¿Hay una forma equivalente y concisa de escribir una cadena en un archivo?
La mayoría de los lenguajes 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 utilizar el código para programas que van desde una sola línea a 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 antiguas de Scala.
Por ejemplo:
A través de la magia del punto y coma, puedes hacer todo lo que quieras con un solo trazo.
import java.io.PrintWriter
import java.nio.file.Files
import java.nio.file.Paths
import java.nio.charset.StandardCharsets
import java.nio.file.StandardOpenOption
val outfile = java.io.File.createTempFile("", "").getPath
val outstream = new PrintWriter(Files.newBufferedWriter(Paths.get(outfile)
, StandardCharsets.UTF_8
, StandardOpenOption.WRITE)); outstream.println("content"); outstream.flush(); outstream.close()
ACTUALIZACIÓN: Desde entonces he creado una solución más efectiva sobre la que he elaborado aquí: https://.com/a/34277491/501113
Me encuentro trabajando cada vez más en la hoja de trabajo de Scala dentro del Scala IDE para Eclipse (y creo que hay algo equivalente en IntelliJ IDEA). De todos modos, necesito poder hacer un trazador de líneas para producir algunos de los contenidos a medida que obtengo la "Salida excede el límite de corte". mensaje si estoy haciendo algo significativo, especialmente con las colecciones de Scala.
Se me ocurrió una línea que inserté en la parte superior de cada nueva hoja de trabajo de Scala para simplificar esto (y así 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 observas 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.
def printToFile(content: String, location: String = "C:/Users/jtdoe/Desktop/WorkSheet.txt") =
Some(new java.io.PrintWriter(location)).foreach{f => try{f.write(content)}finally{f.close}}
Y el uso es simple:
printToFile("A fancy test string/ncontaining newlines/nOMG!/n")
Esto me permite opcionalmente proporcionar el nombre del archivo si quiero tener archivos adicionales más allá del predeterminado (que sobrescribe completamente el archivo cada vez que se llama al método).
Entonces, el segundo uso es simplemente:
printToFile("A fancy test string/ncontaining newlines/nOMG!/n", "C:/Users/jtdoe/Desktop/WorkSheet.txt")
¡Disfrutar!
Aquí hay un resumen conciso utilizando la biblioteca del compilador de Scala:
scala.tools.nsc.io.File("filename").writeAll("hello world")
Alternativamente, si quiere usar las bibliotecas de Java puede hacer esto:
Some(new PrintWriter("filename")).foreach{p => p.write("hello world"); p.close}
Es extraño que nadie haya sugerido operaciones NIO.2 (disponibles desde Java 7):
import java.nio.file.{Paths, Files}
import java.nio.charset.StandardCharsets
Files.write(Paths.get("file.txt"), "file contents".getBytes(StandardCharsets.UTF_8))
Creo que esta es, de lejos, la forma más simple, fácil y idiomática, y no necesita ninguna dependencia sin Java.
Esto es lo suficientemente conciso, supongo:
scala> import java.io._
import java.io._
scala> val w = new BufferedWriter(new FileWriter("output.txt"))
w: java.io.BufferedWriter = java.io.BufferedWriter@44ba4f
scala> w.write("Alice/r/nBob/r/nCharlie/r/n")
scala> w.close()
Puede usar Apache File Utils fácilmente. Mira la función writeStringToFile
. Usamos esta biblioteca en nuestros proyectos.
Puedes hacer esto con una mezcla de bibliotecas de Java y Scala. Tendrás control total sobre la codificación de caracteres. Desafortunadamente, los identificadores de archivo no se cerrarán correctamente.
scala> import java.io.ByteArrayInputStream
import java.io.ByteArrayInputStream
scala> import java.io.FileOutputStream
import java.io.FileOutputStream
scala> BasicIO.transferFully(new ByteArrayInputStream("test".getBytes("UTF-8")), new FileOutputStream("test.txt"))
Sé que no es una línea, pero resuelve los problemas de seguridad hasta donde sé;
// This possibly creates a FileWriter, but maybe not
val writer = Try(new FileWriter(new File("filename")))
// If it did, we use it to write the data and return it again
// If it didn''t we skip the map and print the exception and return the original, just in-case it was actually .write() that failed
// Then we close the file
writer.map(w => {w.write("data"); w}).recoverWith{case e => {e.printStackTrace(); writer}}.map(_.close)
Si no le importó el manejo de excepciones, puede escribir
writer.map(w => {w.writer("data"); w}).recoverWith{case _ => writer}.map(_.close)
Si le gusta la sintaxis de Groovy, puede usar el patrón de diseño de Pimp-My-Library para llevarlo a Scala:
import java.io._
import scala.io._
class RichFile( file: File ) {
def text = Source.fromFile( file )(Codec.UTF8).mkString
def text_=( s: String ) {
val out = new PrintWriter( file , "UTF-8")
try{ out.print( s ) }
finally{ out.close }
}
}
object RichFile {
implicit def enrichFile( file: File ) = new RichFile( file )
}
Funcionará como se espera:
scala> import RichFile.enrichFile
import RichFile.enrichFile
scala> val f = new File("/tmp/example.txt")
f: java.io.File = /tmp/example.txt
scala> f.text = "hello world"
scala> f.text
res1: String =
"hello world
Una línea concisa:
import java.io.PrintWriter
new PrintWriter("filename") { write("file contents"); close }
Una micro biblioteca que escribí: https://github.com/pathikrit/better-files
file.write("Hi!")
o
file << "Hi!"
Uno también tiene este formato, que es a la vez conciso y la biblioteca subyacente está bellamente escrita (ver el código fuente):
import scalax.io.Codec
import scalax.io.JavaConverters._
implicit val codec = Codec.UTF8
new java.io.File("hi-file.txt").asOutput.write("I''m a hi file! ... Really!")
import sys.process._
"echo hello world" #> new java.io.File("/tmp/example.txt") !