1. Übersicht
In diesem kurzen Tutorial werden wir verschiedene Möglichkeiten zum Lesen einer Datei in Groovy untersuchen.
Groovy bietet bequeme Möglichkeiten zum Umgang mit Dateien. Wir konzentrieren uns auf die File- Klasse, die einige Hilfsmethoden zum Lesen von Dateien enthält.
Lassen Sie uns sie in den folgenden Abschnitten einzeln untersuchen.
2. Zeile für Zeile eine Datei lesen
Es gibt viele Groovy IO-Methoden wie readLine und eachLine , mit denen Dateien zeilenweise gelesen werden können.
2.1. Verwenden von File.withReader
Beginnen wir mit der Methode File .withReader . Es wird ein neuer BufferedReader unter dem Deckblatt erstellt , mit dem wir den Inhalt mit der readLine- Methode lesen können .
Lassen Sie uns beispielsweise eine Datei Zeile für Zeile lesen und jede Zeile drucken. Wir geben auch die Anzahl der Zeilen zurück:
int readFileLineByLine(String filePath) { File file = new File(filePath) def line, noOfLines = 0; file.withReader { reader -> while ((line = reader.readLine()) != null) { println "${line}" noOfLines++ } } return noOfLines }
Erstellen wir eine Nur-Text-Datei fileContent.txt mit dem folgenden Inhalt und verwenden Sie sie zum Testen:
Line 1 : Hello World!!! Line 2 : This is a file content. Line 3 : String content
Testen wir unsere Utility-Methode:
def 'Should return number of lines in File given filePath' () { given: def filePath = "src/main/resources/fileContent.txt" when: def noOfLines = readFile.readFileLineByLine(filePath) then: noOfLines noOfLines instanceof Integer assert noOfLines, 3 }
Die withReader- Methode kann auch mit einem Zeichensatzparameter wie UTF-8 oder ASCII zum Lesen codierter Dateien verwendet werden . Sehen wir uns ein Beispiel an:
new File("src/main/resources/utf8Content.html").withReader('UTF-8') { reader -> def line while ((line = reader.readLine()) != null) { println "${line}" } }
2.2. Verwenden von File.eachLine
Wir können auch die eachLine- Methode verwenden:
new File("src/main/resources/fileContent.txt").eachLine { line -> println line }
2.3. Verwenden von File.newInputStream mit InputStream.eachLine
Mal sehen, wie wir den InputStream mit jeder Zeile verwenden können , um eine Datei zu lesen:
def is = new File("src/main/resources/fileContent.txt").newInputStream() is.eachLine { println it } is.close()
Wenn wir die newInputStream- Methode verwenden, müssen wir uns mit dem Schließen des InputStream befassen .
Wenn wir stattdessen die withInputStream- Methode verwenden, wird der InputStream für uns geschlossen:
new File("src/main/resources/fileContent.txt").withInputStream { stream -> stream.eachLine { line -> println line } }
3. Einlesen einer Datei in eine Liste
Manchmal müssen wir den Inhalt einer Datei in eine Liste von Zeilen einlesen.
3.1. Verwenden von File.readLines
Hierzu können wir die readLines- Methode verwenden, mit der die Datei in eine Liste von Zeichenfolgen eingelesen wird .
Lassen Sie uns einen kurzen Blick auf ein Beispiel werfen, das den Dateiinhalt liest und eine Liste von Zeilen zurückgibt:
List readFileInList(String filePath) { File file = new File(filePath) def lines = file.readLines() return lines }
Schreiben wir einen kurzen Test mit fileContent.txt :
def 'Should return File Content in list of lines given filePath' () { given: def filePath = "src/main/resources/fileContent.txt" when: def lines = readFile.readFileInList(filePath) then: lines lines instanceof List assert lines.size(), 3 }
3.2. Verwenden von File.collect
Wir können den Dateiinhalt auch mithilfe der Collect- API in eine Liste von Strings einlesen :
def list = new File("src/main/resources/fileContent.txt").collect {it}
3.3. Verwenden des als Operator
Wir können sogar den as- Operator nutzen, um den Inhalt der Datei in ein String- Array einzulesen :
def array = new File("src/main/resources/fileContent.txt") as String[]
4. Lesen einer Datei in eine einzelne Zeichenfolge
4.1. Verwenden von File.text
Wir können eine ganze Datei in einen einzelnen String lesen, indem wir einfach die text- Eigenschaft der File- Klasse verwenden .
Schauen wir uns ein Beispiel an:
String readFileString(String filePath) { File file = new File(filePath) String fileContent = file.text return fileContent }
Lassen Sie uns dies mit einem Unit-Test überprüfen:
def 'Should return file content in string given filePath' () { given: def filePath = "src/main/resources/fileContent.txt" when: def fileContent = readFile.readFileString(filePath) then: fileContent fileContent instanceof String fileContent.contains("""Line 1 : Hello World!!! Line 2 : This is a file content. Line 3 : String content""") }
4.2. Verwenden von File.getText
Wenn wir die Methode getTest (Zeichensatz) verwenden, können wir den Inhalt einer codierten Datei in einen String einlesen, indem wir einen Zeichensatzparameter wie UTF-8 oder ASCII bereitstellen:
String readFileStringWithCharset(String filePath) { File file = new File(filePath) String utf8Content = file.getText("UTF-8") return utf8Content }
Erstellen wir eine HTML-Datei mit UTF-8-Inhalt namens utf8Content.html für den Komponententest :
ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ
Sehen wir uns den Unit-Test an:
def 'Should return UTF-8 encoded file content in string given filePath' () { given: def filePath = "src/main/resources/utf8Content.html" when: def encodedContent = readFile.readFileStringWithCharset(filePath) then: encodedContent encodedContent instanceof String }
5. Lesen einer Binärdatei mit File.bytes
Groovy erleichtert das Lesen von Nicht-Text- oder Binärdateien. Mithilfe der bytes- Eigenschaft können wir den Inhalt der Datei als Byte- Array abrufen :
byte[] readBinaryFile(String filePath) { File file = new File(filePath) byte[] binaryContent = file.bytes return binaryContent }
Wir werden eine PNG-Bilddatei, sample.png , mit den folgenden Inhalten für den Unit-Test verwenden:

Sehen wir uns den Unit-Test an:
def 'Should return binary file content in byte array given filePath' () { given: def filePath = "src/main/resources/sample.png" when: def binaryContent = readFile.readBinaryFile(filePath) then: binaryContent binaryContent instanceof byte[] binaryContent.length == 329 }
6. Fazit
In diesem kurzen Tutorial haben wir verschiedene Möglichkeiten zum Lesen einer Datei in Groovy mit verschiedenen Methoden der File- Klasse zusammen mit BufferedReader und InputStream gesehen .
Den vollständigen Quellcode dieser Implementierungen und Unit-Testfälle finden Sie im GitHub-Projekt.