Eine Datei in Groovy lesen

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.