Come leggere un file in Groovy in una stringa?


309

Devo leggere un file dal file system e caricare l'intero contenuto in una stringa in un controller groovy, qual è il modo più semplice per farlo?

Risposte:


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

Se è necessario specificare la codifica dei caratteri, utilizzare invece quanto segue:

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

6
Questa è la bellezza di Groovy :)
Igor,

1
Devo eseguire alcune istruzioni close () o il lettore verrà chiuso con il metodo getText ()?
das Keks,

6
@dasKeks Penso che sia sicuro presumere che l'implementazione di questo metodo chiuda tutte le risorse necessarie. Ad ogni modo, non hai accesso a nessun lettore che può essere creato, quindi non puoi chiuderlo
Dónal

Vorrei menzionare che funziona anche se l' Fileoggetto proviene da un normale vaso Java. Non ero sicuro che forse Groovy avesse una sua Fileclasse speciale con l' textattributo o qualcosa del genere, ma sembra che non abbia importanza da dove Fileprovenga l' oggetto, che sia istanziato dal codice Groovy o dal codice Java.
ArtOfWarfare il

1
@roens Non ha senso. Sospetto che ci siano altri fattori nel mix come se tu avessi una variabile locale che nascondeva un campo o qualcosa del genere.
Jeff Scott Brown,

77

Il modo più breve è davvero giusto

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

ma in questo caso non hai alcun controllo su come i byte nel file vengono interpretati come caratteri. AFAIK groovy prova a indovinare la codifica qui guardando il contenuto del file.

Se si desidera una codifica di caratteri specifici, è possibile specificare un nome di set di caratteri con

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

Consulta i documenti API suFile.getText(String) per ulteriori riferimenti.


7
+1 per consigliare la versione che accetta un parametro di codifica. La pianura someFile.textnon fa un'ipotesi intelligente, usa semplicemente la codifica predefinita della piattaforma (di solito UTF-8 su Linux moderni, ma qualcosa come windows-1252 o MacRoman su Windows / Mac OS, a meno che tu non l'abbia ignorato -Dfile.encoding=...)
Ian Roberts,

Almeno nelle recenti versioni di Groovy, l'ipotesi è fatta usando CharsetToolkit che fa un'ipotesi intelligente.
Matthijs Bierman

53

Una leggera variazione ...

new File('/path/to/file').eachLine { line ->
  println line
}

5
Vero, ma è ancora un linguaggio utile da catturare "per la cronaca".
Steve Byrne,

È una buona cosa vedere questo - rende banale l'elaborazione di un file riga per riga.
Bill K,


12

Nel mio caso new File()non funziona, causa un errore FileNotFoundExceptionquando viene eseguito in un processo di pipeline Jenkins. Il seguente codice ha risolto questo problema ed è ancora più facile secondo me:

def fileContents = readFile "path/to/file"

Non capisco ancora completamente questa differenza, ma forse aiuterà chiunque altro con lo stesso problema. Forse l'eccezione è stata causata perché new File()crea un file sul sistema che esegue il codice groovy, che era un sistema diverso da quello che contiene il file che volevo leggere.


Il passo readFile funziona bene per te? per me funziona ma fa '' virgolette singole su alcune parole, non capisco!
codeGeass

Funziona bene per me e non ho trovato virgolette che non ho inserito (suppongo che tu intenda le virgolette nel contenuto del file). Forse vale la pena di creare una nuova domanda per questo? In tal caso, prova a specificare in quali casi compaiono le virgolette e dove esattamente.
P Kuijpers,

2
Funziona per jenkins. poiché readFile è una parola chiave interna e non necessita di alcuna importazione o approvazione aggiuntiva da jenkins-admin. L'intero file può essere letto in String var e quindi stampato tramite il codice seguente: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } Inoltre, se il file non viene trovato, si verifica un errore.
ashish,

1
Btw. la ragione di ciò è che il nuovo File () cerca i file sul tuo computer, come readFile in Jenkins guarda nella sandbox groovy della java vm dove probabilmente è in esecuzione la tua pipeline ... Inoltre ti è permesso usare readfile in sandboxed pipeline ma l'utilizzo di File () non è consentito per impostazione predefinita, File sarà necessario autorizzare le impostazioni Jenkins prima di poterlo utilizzare.
Cyborg-X1,

2

Qui puoi trovare un altro modo per fare lo stesso.

Leggi il file.

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

Leggi il file completo.

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

Leggi il file 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 nuovo file.

new File("C:\Temp\FileName.txt").createNewFile();

Non sono sicuro che sia necessario defquando si specifica il tipo.
Victor M Herasme Perez,

Senza usare il codice def funzionerà, ho l'abitudine di definire quelle variabili!
Shashi Singh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.