Comment lire un fichier dans Groovy dans une chaîne?

309

J'ai besoin de lire un fichier du système de fichiers et de charger tout le contenu dans une chaîne dans un contrôleur groovy, quelle est la façon la plus simple de le faire?

raphian
la source

Réponses:

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

Si vous devez spécifier l'encodage des caractères, utilisez plutôt ce qui suit:

String fileContents = new File('/path/to/file').getText('UTF-8')
Dónal
la source
6
C'est la beauté de Groovy :)
Igor
1
Dois-je exécuter des instructions close () ou le lecteur sera-t-il fermé par la méthode getText ()?
das Keks
6
@dasKeks Je pense qu'il est prudent de supposer que la mise en œuvre de cette méthode ferme toutes les ressources nécessaires. Quoi qu'il en soit, vous n'avez accès à aucun lecteur qui pourrait être créé, vous ne pouvez donc pas le fermer
Dónal
Je voudrais mentionner que cela fonctionne même si l' Fileobjet provient d'un pot de java ordinaire. Je ne savais pas si Groovy avait peut-être sa propre Fileclasse spéciale avec l' textattribut, ou quelque chose, mais il semble que peu importe d'où Filevient l' objet, qu'il soit instancié par du code Groovy ou du code Java.
ArtOfWarfare
1
@roens Cela n'a aucun sens. Je soupçonne qu'il y a un autre facteur dans le mélange comme si vous aviez une variable locale qui masquait un champ ou quelque chose comme ça.
Jeff Scott Brown
77

Le chemin le plus court est en effet juste

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

mais dans ce cas, vous n'avez aucun contrôle sur la façon dont les octets du fichier sont interprétés comme des caractères. AFAIK groovy essaie de deviner l'encodage ici en regardant le contenu du fichier.

Si vous souhaitez un codage de caractères spécifique, vous pouvez spécifier un nom de jeu de caractères avec

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

Voir la documentation de l'API surFile.getText(String) pour plus de référence.

jaetzold
la source
7
+1 pour recommander la version qui prend un paramètre d'encodage. La plaine someFile.textne fait pas de supposition intelligente, elle utilise simplement l'encodage par défaut de la plateforme (généralement UTF-8 sur les Linux modernes, mais quelque chose comme windows-1252 ou MacRoman sur Windows / Mac OS, sauf si vous l'avez remplacé -Dfile.encoding=...)
Ian Roberts
Dans les versions récentes de Groovy au moins, la supposition se fait en utilisant CharsetToolkit qui fait une supposition intelligente.
Matthijs Bierman
53

Une légère variation ...

new File('/path/to/file').eachLine { line ->
  println line
}
linus1412
la source
5
C'est vrai, mais c'est toujours un idiome utile pour capturer "pour l'enregistrement".
Steve Byrne
C'est une bonne chose de voir cela - rend le traitement d'un fichier ligne par ligne trivial.
Bill K
12

la façon la plus simple serait

new File(filename).getText()

ce qui signifie que vous pouvez simplement faire:

new File(filename).text

Révérend Gonzo
la source
12

Dans mon cas, new File()cela ne fonctionne pas, il provoque une FileNotFoundExceptionexécution dans un travail de pipeline Jenkins. Le code suivant a résolu ce problème et est encore plus facile à mon avis:

def fileContents = readFile "path/to/file"

Je ne comprends toujours pas complètement cette différence, mais peut-être que cela aidera quelqu'un d'autre avec le même problème. Peut-être que l'exception a été provoquée car new File()crée un fichier sur le système qui exécute le code groovy, qui était un système différent de celui qui contient le fichier que je voulais lire.

P Kuijpers
la source
Est-ce que l'étape readFile fonctionne bien pour vous? pour moi ça marche mais ça fait '' des guillemets simples sur certains mots, je ne comprends pas!
codeGeass
Cela fonctionne très bien pour moi, et n'a rencontré aucune citation que je ne me suis pas placée (je suppose que vous voulez dire des citations dans le contenu du fichier). Peut-être la peine de créer une nouvelle question pour cela? Dans ce cas, essayez de spécifier dans quels cas les guillemets apparaissent et où exactement.
P Kuijpers
2
Fonctionne pour jenkins. as readFile est un mot-clé interne et ne nécessite aucune importation ni approbation supplémentaire de la part de jenkins-admin. Le fichier entier peut être lu dans String var puis imprimé via le code ci-dessous: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } De plus, si le fichier n'est pas trouvé, il y a une erreur.
ashish
1
Btw. la raison en est que ce nouveau fichier () recherche des fichiers sur votre ordinateur, comme readFile dans Jenkins regarde dans le sandbox groovy de la java vm où votre truc de pipeline est probablement en cours d'exécution ... Vous êtes également autorisé à utiliser readfile dans sandboxed les pipelines mais l'utilisation de File () n'est pas autorisée par défaut, File vous devrez mettre la liste blanche dans les paramètres Jenkins avant de pouvoir l'utiliser.
Cyborg-X1
2

Ici, vous pouvez trouver une autre façon de faire de même.

Lire le fichier.

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

Lire le fichier complet.

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

Lire le fichier 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)

}

Créez un nouveau fichier.

new File("C:\Temp\FileName.txt").createNewFile();
shashi singh
la source
Je ne suis pas sûr que vous ayez besoin deflorsque vous spécifiez le type.
Victor M Herasme Perez
Sans utiliser le code def fonctionnera, j'ai l'habitude de définir ces variables!
shashi singh