Wie lese ich eine Datei in Groovy in einen String?

309

Ich muss eine Datei aus dem Dateisystem lesen und den gesamten Inhalt in eine Zeichenfolge in einem groovigen Controller laden. Was ist der einfachste Weg, dies zu tun?

Raffian
quelle

Antworten:

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

Wenn Sie die Zeichenkodierung angeben müssen, verwenden Sie stattdessen Folgendes:

String fileContents = new File('/path/to/file').getText('UTF-8')
Dónal
quelle
6
Das ist die Schönheit von Groovy :)
Igor
1
Muss ich einige close () - Anweisungen ausführen oder wird der Reader durch die getText () -Methode geschlossen?
das Keks
6
@dasKeks Ich denke, es ist sicher anzunehmen, dass die Implementierung dieser Methode alle erforderlichen Ressourcen schließt. Wie auch immer, Sie haben keinen Zugriff auf einen Reader, der möglicherweise erstellt wird, sodass Sie ihn nicht schließen können
Dónal
Ich möchte erwähnen, dass dies auch dann funktioniert, wenn das FileObjekt aus einem gewöhnlichen Java-Glas stammt. Ich war mir nicht sicher, ob Groovy vielleicht eine eigene spezielle FileKlasse mit dem textAttribut oder so hatte, aber es scheint, dass es keine Rolle spielt, woher das FileObjekt kommt, ob es durch Groovy-Code oder Java-Code instanziiert wird.
ArtOfWarfare
1
@roens Das macht keinen Sinn. Ich vermute, es gibt noch einen anderen Faktor in der Mischung, als hätten Sie eine lokale Variable, die ein Feld oder ähnliches versteckt.
Jeff Scott Brown
77

Der kürzeste Weg ist in der Tat gerecht

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

In diesem Fall haben Sie jedoch keine Kontrolle darüber, wie die Bytes in der Datei als Zeichen interpretiert werden. AFAIK groovy versucht, die Codierung hier anhand des Dateiinhalts zu erraten.

Wenn Sie eine bestimmte Zeichenkodierung wünschen, können Sie einen Zeichensatznamen mit angeben

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

Weitere Informationen findenFile.getText(String) Sie in den API-Dokumenten .

Jaetzold
quelle
7
+1 für die Empfehlung der Version, die einen Codierungsparameter verwendet. Die Ebene someFile.textmacht keine intelligente Vermutung, sondern verwendet einfach die Standardcodierung der Plattform (normalerweise UTF-8 unter modernen Linuxen, aber so etwas wie Windows-1252 oder MacRoman unter Windows / Mac OS, es sei denn, Sie haben es überschrieben -Dfile.encoding=...)
Ian Roberts
Zumindest in neueren Versionen von Groovy wird das Erraten mit CharsetToolkit durchgeführt, das ein intelligentes Erraten ermöglicht.
Matthijs Bierman
53

Eine leichte Variation ...

new File('/path/to/file').eachLine { line ->
  println line
}
linus1412
quelle
5
Stimmt, aber es ist immer noch eine nützliche Redewendung, um "für die Aufzeichnung" zu erfassen.
Steve Byrne
Es ist eine gute Sache, dies zu sehen - macht die zeilenweise Verarbeitung einer Datei trivial.
Bill K
12

der einfachste Weg wäre

new File(filename).getText()

was bedeutet, dass Sie einfach tun könnten:

new File(filename).text

Reverend Gonzo
quelle
12

In meinem Fall new File()funktioniert es nicht, es führt zu einem FileNotFoundExceptionAusführen in einem Jenkins-Pipeline-Job. Der folgende Code hat dies gelöst und ist meiner Meinung nach noch einfacher:

def fileContents = readFile "path/to/file"

Ich verstehe diesen Unterschied immer noch nicht vollständig, aber vielleicht hilft es jedem anderen mit den gleichen Problemen. Möglicherweise wurde die Ausnahme verursacht, weil new File()auf dem System eine Datei erstellt wurde, die den groovigen Code ausführt. Dies war ein anderes System als das, das die Datei enthält, die ich lesen wollte.

P Kuijpers
quelle
Funktioniert der Schritt readFile für Sie? für mich funktioniert es, aber es macht '' einfache Anführungszeichen auf einige Wörter, ich verstehe nicht!
CodeGeass
Es funktioniert gut für mich und hat keine Anführungszeichen gefunden, die ich selbst nicht platziert habe (ich denke, Sie meinen Anführungszeichen im Dateiinhalt). Vielleicht lohnt es sich, dafür eine neue Frage zu stellen? Versuchen Sie in diesem Fall anzugeben, in welchen Fällen die Anführungszeichen erscheinen und wo genau.
P Kuijpers
2
Funktioniert für Jenkins. as readFile ist ein internes Schlüsselwort und benötigt keinen Import oder zusätzliche Genehmigung von jenkins-admin. Die gesamte Datei kann in String var gelesen und dann über den folgenden Code gedruckt werden: String fp_f = readFile("any_file") if (fp.length()) { currentBuild.description = fp } Wenn die Datei nicht gefunden wird, liegt ein Fehler vor.
Ashish
1
Übrigens. Der Grund dafür ist, dass new File () nach Dateien auf Ihrem Computer sucht, wie readFile in Jenkins in der groovigen Sandbox von Java VM sucht, in der Ihre Pipeline-Inhalte wahrscheinlich ausgeführt werden. Außerdem dürfen Sie readfile in Sandbox verwenden Pipelines, aber die Verwendung von File () ist standardmäßig nicht zulässig. File müssen Sie in den Jenkins-Einstellungen auf die Whitelist setzen, bevor Sie sie verwenden können.
Cyborg-X1
2

Hier finden Sie einen anderen Weg, um dasselbe zu tun.

Datei lesen.

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

Vollständige Datei lesen.

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

Datei lesen 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)

}

Erstellen Sie eine neue Datei.

new File("C:\Temp\FileName.txt").createNewFile();
Shashi Singh
quelle
Ich bin nicht sicher, ob Sie benötigen, defwenn Sie den Typ angeben.
Victor M Herasme Perez
Ohne die Verwendung von Def- Code funktioniert, habe ich die Angewohnheit, diese Variablen zu definieren!
Shashi Singh