Advertising:
Leer y Escribir ficheros de texto en Groovy
Groovy nos ofrece varias posibilidades para leer y escribir ficheros de texto. Veamos algunos ejemplos
Leer fichero de texto[edit]
Leer línea a línea[edit]
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[edit]
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[edit]
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[edit]
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[edit]
Al igual que para leer, hay muchas formas de escribir un fichero de texto en Groovy.
Escribir todo el fichero de golpe[edit]
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[edit]
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[edit]
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[edit]
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[edit]
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.