Saltar al contenido

¿Cómo escribir en un archivo en Scala?

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-libque presenta a continuación.

Junio ​​2019, Xavier Guihot menciona en su respuesta la biblioteca Usinguna 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 y Seekable que proporcionan la API central.
    Otras clases de importancia son Resource, ReadChars y WriteChars.
  • Archivo – El archivo es un File (llamado Path) API que se basa en una combinación del sistema de archivos Java 7 NIO y las API SBT PathFinder.
    Path y FileSystem 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 .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *