Después de tanto batallar pudimos encontrar el resultado de esta cuestión que ciertos lectores de nuestro sitio web presentan. Si deseas compartir algún dato puedes aportar tu conocimiento.
Solución:
Esta es una de las características que faltan en Scala estándar y que he encontrado tan útil que la agrego a mi biblioteca personal. (Probablemente también debería tener una biblioteca personal). El código dice así:
def printToFile(f: java.io.File)(op: java.io.PrintWriter => Unit)
val p = new java.io.PrintWriter(f)
try op(p) finally p.close()
y se usa así:
import java.io._
val data = Array("Five","strings","in","a","file!")
printToFile(new File("example.txt")) p =>
data.foreach(p.println)
Edición 2019 (8 años después), Scala-IO no es muy activo, si lo hay, Li Haoyi sugiere su propia biblioteca lihaoyi/os-lib
que presenta a continuación.
Junio 2019, Xavier Guihot menciona en su respuesta la biblioteca Using
una utilidad para realizar la gestión automática de recursos.
Editar (septiembre de 2011): desde que Eduardo Costa pregunta sobre Scala2.9, y desde que Rick-777 comenta que el historial de confirmaciones de scalax.IO es prácticamente inexistente desde mediados de 2009…
Scala-IO ha cambiado de lugar: vea su repositorio de GitHub, de Jesse Eichar (también en SO):
El proyecto general Scala IO consta de algunos subproyectos para diferentes aspectos y extensiones de IO.
Hay dos componentes principales de Scala IO:
- Centro – El núcleo se ocupa principalmente de la lectura y escritura de datos hacia y desde fuentes y sumideros arbitrarios. Los rasgos fundamentales son
Input
,Output
ySeekable
que proporcionan la API central.
Otras clases de importancia sonResource
,ReadChars
yWriteChars
.- Archivo – El archivo es un
File
(llamadoPath
) API que se basa en una combinación del sistema de archivos Java 7 NIO y las API SBT PathFinder.Path
yFileSystem
son los principales puntos de entrada a Scala IO File API.
import scalax.io._
val output:Output = Resource.fromFile("someFile")
// Note: each write will open a new connection to file and
// each write is executed at the begining of the file,
// so in this case the last write will be the contents of the file.
// See Seekable for append and patching files
// Also See openOutput for performing several writes with a single connection
output.writeIntsAsBytes(1,2,3)
output.write("hello")(Codec.UTF8)
output.writeStrings(List("hello","world")," ")(Codec.UTF8)
Respuesta original (enero de 2011), con el antiguo lugar de scala-io:
Si no quiere esperar a Scala 2.9, puede usar la biblioteca scala-incubator / scala-io.
(como se menciona en “¿Por qué Scala Source no cierra el InputStream subyacente?”)
Ver las muestras
// several examples of writing data
import scalax.io.
FileOps, Path, Codec, OpenOption
// the codec must be defined either as a parameter of ops methods or as an implicit
implicit val codec = scalax.io.Codec.UTF8
val file: FileOps = Path ("file")
// write bytes
// By default the file write will replace
// an existing file with the new data
file.write (Array (1,2,3) map ( _.toByte))
// another option for write is openOptions which allows the caller
// to specify in detail how the write should take place
// the openOptions parameter takes a collections of OpenOptions objects
// which are filesystem specific in general but the standard options
// are defined in the OpenOption object
// in addition to the definition common collections are also defined
// WriteAppend for example is a List(Create, Append, Write)
file.write (List (1,2,3) map (_.toByte))
// write a string to the file
file.write("Hello my dear file")
// with all options (these are the default options explicitely declared)
file.write("Hello my dear file")(codec = Codec.UTF8)
// Convert several strings to the file
// same options apply as for write
file.writeStrings( "It costs" :: "one" :: "dollar" :: Nil)
// Now all options
file.writeStrings("It costs" :: "one" :: "dollar" :: Nil,
separator="
Similar a la respuesta de Rex Kerr, pero más genérica. Primero uso una función auxiliar:
/**
* Used for reading/writing to database, files, etc.
* Code From the book "Beginning Scala"
* http://www.amazon.com/Beginning-Scala-David-Pollak/dp/1430219890
*/
def using[A <: def close(): Unit, B](param: A)(f: A => B): B =
try f(param) finally param.close()
Entonces uso esto como:
def writeToFile(fileName:String, data:String) =
using (new FileWriter(fileName))
fileWriter => fileWriter.write(data)
y
def appendToFile(fileName:String, textData:String) =
using (new FileWriter(fileName, true))
fileWriter => using (new PrintWriter(fileWriter))
printWriter => printWriter.println(textData)
etc.
Recuerda que tienes la capacidad de agregar una reseña .