Leer y Escribir ficheros de texto en Groovy

De ChuWiki
Saltar a: navegación, buscar

Groovy nos ofrece varias posibilidades para leer y escribir ficheros de texto. Veamos algunos ejemplos

Leer fichero de texto

Leer línea a línea

La clase File tiene un método eachLine(), es una forma sencilla de ir leyendo línea a línea el fichero de texto

new File("un-fichero.txt").eachLine { 
   line -> println line
}

Vamos recibiendo en line cada una de las líneas de fichero y hacemos lo que queramos con ella, en este caso, sacarlas por pantalla con println

Usando los métodos que Groovy añade a las clase Java, como por ejemplo, el método eachLine(), no es necesario cerrar el fichero. Groovy se encarga automáticamente de hacerlo al terminar el fichero o si salta una excepción en nuestro código dentro de eachLine()

Meter las líneas en un array

Hay varias formas de hacerlo, ponemos dos de ellas.

En el siguiente trozo de código, simplemente "convirtiendo" el File a un array de String String [], ya está la magia hecha. En lines tendremos nuestro array de líneas de fichero ya preparadito.

String [] lines = new File('pom.xml') as String[]
println lines

Otra opción es usar el método collect()

def lines = new File('pom.xml').collect {it}
println lines

En it recibimos cada línea y nos basta "devolverla". Recuerda que en Groovy no es necesario el return.

Leer todo el fichero y meterlo en un String

También es posible, si el fichero no es muy grande, leerlo todo de golpe y meterlo en un único String. En el siguiente ejemplo, content contendrá el contenido completo del fichero como un String.

String content = new File("pom.xml").text

Juego de caracteres

Si el fichero tiene un juego de caracteres que no es el estándar usado por nuestro sistema operativo, podemos indicar cual queremos en algunos de los métodos anteriores. Por ejemplo, eachLine() admite como primer parámetro un juego de caracteres

new File("un-fichero.txt").eachLine ('utf-8') { 
   line -> println line
}

O bien, el método getText(), que antes hemos usado sin su "get" como new File("pom.xml").text, admite un parámetro con el charset

String content = new File("pom.xml").getText('utf-8')

Escribir fichero de texto

Al igual que para leer, hay muchas formas de escribir un fichero de texto en Groovy.

Escribir todo el fichero de golpe

Para escribir todo el contenido del fichero en una sola línea, podemos usar el método write

new File('target/output.txt').write 'One line of the file\nAnother line '

También podemos asignar el texto directamente al atributo text

new File('target/output.txt').text = 'One line of the file\nAnother line '

y otra alternativa sería usar el operador < en vez de el =

new File('target/output.txt').text < 'One line of the file\nAnother line '

Como en la lectura, no nos tenemos que preocupar de cerrar el fichero. Estas operaciones machacan el contenido del fichero y lo cierran automáticamente.

Escribir en el fichero poco a poco

Si no queremos escribirlo todo de golpe, debemos usar el método append() o el operador <<, que son equivalentes. Unicamente, hay que tener en cuenta que estos métodos no machacan el contenido del fichero, por lo que si el fichero ya existiera y tuviera contenido, estos métodos añaden nuevo contenido al final.

lines = ['one','two','three']
def file = new File('target/output.txt')

lines.each { line ->
   file << "$line\n"
}

debemos añadir nosotros el \n de cada línea. La otra opción sería con el método append() y también necesitamos añadir el retorno de carro

lines = ['one','two','three']
def file = new File('target/output.txt')

lines.each { line ->
   file.append "$line\n"
}

Estos métodos no son eficientes, cada llamada a uno de los métodos, abre el fichero, realiza la operación en él y cierra el fichero. Mejor usar un Writer

Usar un Writer, por ejemplo, PrintWriter

Si obtenemos el Writer con el método with*Writer(), el fichero se machacará el contenido del fichero y Groovy se encargará de cerrarlo automáticamente cuando acabemos de escribir en él.

lines = ['one','two','three']
def file = new File('target/output.txt')

file.withPrintWriter { writer ->
   lines.each { line ->
      writer.println line
   }
}

Este método trunca el fichero y añade el contenido. Si quisiéramos respetar el contenido original y añadir el nuevo contenido al final, deberíamos usar el método withWriterAppend.

Codificación de caracteres

Si queremos usar alguna codificación de caracteres que no sea la de defecto cuando escribimos en el fichero, basta añadir como primer parámetro dicha codificación en el método with*Writer

lines = ['one','two','three']
def file = new File('target/output.txt')

file.withPrintWriter('utf-8') { writer ->
   lines.each { line ->
      writer.println line
   }
}

Algunos enlaces

Tienes un tutorial completo en la documentación oficial de Groovy Working with I/O.

En la api de File de Groovy tienes todos los métodos que puedes usar sobre File. Algunos de estos métodos incluso traen algo de código de ejemplo si su uso no es trivial.