¿Cómo leer un archivo en Groovy en una cadena?

309

Necesito leer un archivo del sistema de archivos y cargar todo el contenido en una cadena en un controlador maravilloso, ¿cuál es la forma más fácil de hacerlo?

rafiano
fuente

Respuestas:

507
String fileContents = new File('/path/to/file').text

Si necesita especificar la codificación de caracteres, utilice lo siguiente:

String fileContents = new File('/path/to/file').getText('UTF-8')
Dónal
fuente
66
Esa es la belleza de Groovy :)
Igor
1
¿Tengo que ejecutar algunas declaraciones close () o el lector se cerrará con el método getText ()?
das Keks
66
@dasKeks Creo que es seguro asumir que la implementación de este método cierra los recursos necesarios. De todos modos, no tienes acceso a ningún lector que se pueda crear, por lo que no puedes cerrarlo
Dónal
Me gustaría mencionar que esto funciona incluso si el Fileobjeto se originó a partir de un jar de Java común. No estaba seguro de si Groovy tenía su propia Fileclase especial con el textatributo, o algo así, pero parece que no importa de dónde Fileprovenga el objeto, ya sea instanciado por el código Groovy o el código Java.
ArtOfWarfare
1
@roens Eso no tiene sentido. Sospecho que hay otro factor en la mezcla como si tuvieras una variable local que estaba ocultando un campo o algo así.
Jeff Scott Brown el
77

El camino más corto es de hecho solo

String fileContents = new File('/path/to/file').text

pero en este caso no tiene control sobre cómo los bytes del archivo se interpretan como caracteres. AFAIK groovy intenta adivinar la codificación aquí mirando el contenido del archivo.

Si desea una codificación de caracteres específica, puede especificar un nombre de conjunto de caracteres con

String fileContents = new File('/path/to/file').getText('UTF-8')

Consulte los documentos de API enFile.getText(String) para obtener más información.

jaetzold
fuente
77
+1 para recomendar la versión que toma un parámetro de codificación. La llanura someFile.textno hace una suposición inteligente, simplemente usa la codificación predeterminada de la plataforma (generalmente UTF-8 en Linux modernos, pero algo como Windows-1252 o MacRoman en Windows / Mac OS, a menos que lo haya anulado -Dfile.encoding=...)
Ian Roberts
En versiones recientes de Groovy, al menos, la suposición se realiza utilizando CharsetToolkit, lo que hace una suposición inteligente.
Matthijs Bierman
53

Una ligera variación ...

new File('/path/to/file').eachLine { line ->
  println line
}
linus1412
fuente
55
Es cierto, pero sigue siendo un lenguaje útil para capturar "para el registro".
Steve Byrne
Es bueno ver esto: hace que el procesamiento de un archivo línea por línea sea trivial.
Bill K
12

En mi caso new File()no funciona, provoca un FileNotFoundExceptioncuando se ejecuta en un trabajo de tubería de Jenkins. El siguiente código resolvió esto, y es aún más fácil en mi opinión:

def fileContents = readFile "path/to/file"

Todavía no entiendo esta diferencia por completo, pero tal vez ayude a cualquier otra persona con el mismo problema. Posiblemente, la excepción fue causada porque new File()crea un archivo en el sistema que ejecuta el código maravilloso, que era un sistema diferente al que contiene el archivo que quería leer.

P Kuijpers
fuente
¿El paso readFile funciona bien para usted? para mí funciona pero hace '' comillas simples en algunas palabras, ¡no entiendo!
codeGeass
Funciona bien para mí, y no encontré ninguna cita que no coloqué (supongo que te refieres a citas en el contenido del archivo). ¿Quizás valga la pena crear una nueva pregunta para esto? En ese caso, intente especificar en qué casos aparecen las comillas y dónde exactamente.
P Kuijpers
2
Funciona para Jenkins. ya que readFile es una palabra clave interna y no necesita ninguna importación o aprobación adicional de jenkins-admin. Todo el archivo puede leerse en String var y luego imprimirse mediante el siguiente código: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } Además, si no se encuentra el archivo, entonces hay un error.
ashish
1
Por cierto. La razón de esto es que ese nuevo archivo () busca archivos en su computadora, como readFile en Jenkins busca en el maravilloso sandbox de Java VM donde probablemente se está ejecutando su material de tubería ... También se le permite usar readfile en sandboxed las tuberías, pero el uso de Archivo () no está permitido de forma predeterminada. El archivo deberá incluirse en la lista blanca en la configuración de Jenkins antes de poder usarlo.
Cyborg-X1
2

Aquí puede encontrar otra forma de hacer lo mismo.

Leer archivo

File file1 = new File("C:\Build\myfolder\myTestfile.txt");
def String yourData = file1.readLines();

Leer el archivo completo.

File file1 = new File("C:\Build\myfolder\myfile.txt");
def String yourData= file1.getText();

Leer el archivo Line Bye Line.

File file1 = new File("C:\Build\myfolder\myTestfile.txt");
for (def i=0;i<=30;i++) // specify how many line need to read eg.. 30
{
 log.info file1.readLines().get(i)

}

Crea un nuevo archivo.

new File("C:\Temp\FileName.txt").createNewFile();
shashi singh
fuente
No estoy seguro de que lo necesite defcuando especifique el tipo.
Victor M Herasme Perez
¡Sin usar el código de def funcionará, tengo la costumbre de definir esas variables!
shashi singh