Leggere un file in Groovy

1. Panoramica

In questo rapido tutorial, esploreremo diversi modi di leggere un file in Groovy.

Groovy fornisce modi convenienti per gestire i file. Ci concentreremo sulla classe File che ha alcuni metodi di supporto per la lettura dei file.

Esploriamoli uno per uno nelle sezioni seguenti.

2. Lettura di un file riga per riga

Sono disponibili molti metodi Groovy IO come readLine e eachLine per leggere i file riga per riga.

2.1. Utilizzando File.withReader

Cominciamo con il metodo File .withReader . Crea un nuovo BufferedReader sotto le coperte che possiamo usare per leggere i contenuti usando il metodo readLine .

Ad esempio, leggiamo un file riga per riga e stampiamo ogni riga. Restituiremo anche il numero di righe:

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 }

Creiamo un file di testo semplice fileContent.txt con i seguenti contenuti e usiamolo per il test:

Line 1 : Hello World!!! Line 2 : This is a file content. Line 3 : String content

Proviamo il nostro metodo di utilità:

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 } 

Il metodo withReader può essere utilizzato anche con un parametro charset come UTF-8 o ASCII per leggere file codificati . Vediamo un esempio:

new File("src/main/resources/utf8Content.html").withReader('UTF-8') { reader -> def line while ((line = reader.readLine()) != null) { println "${line}" } }

2.2. Utilizzando File.eachLine

Possiamo anche usare il metodo eachLine :

new File("src/main/resources/fileContent.txt").eachLine { line -> println line } 

2.3. Utilizzo di File.newInputStream con InputStream.eachLine

Vediamo come possiamo usare InputStream con eachLine per leggere un file:

def is = new File("src/main/resources/fileContent.txt").newInputStream() is.eachLine { println it } is.close()

Quando usiamo il metodo newInputStream , dobbiamo occuparci della chiusura di InputStream .

Se usiamo invece il metodo withInputStream , gestirà la chiusura di InputStream per noi:

new File("src/main/resources/fileContent.txt").withInputStream { stream -> stream.eachLine { line -> println line } }

3. Lettura di un file in un elenco

A volte abbiamo bisogno di leggere il contenuto di un file in un elenco di righe.

3.1. Utilizzando File.readLines

Per questo, possiamo usare il metodo readLines che legge il file in un elenco di stringhe .

Diamo una rapida occhiata a un esempio che legge il contenuto del file e restituisce un elenco di righe:

List readFileInList(String filePath) { File file = new File(filePath) def lines = file.readLines() return lines }

Scriviamo un rapido test usando 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. Utilizzando File.collect

Possiamo anche leggere il contenuto del file in un elenco di stringhe utilizzando l' API collect :

def list = new File("src/main/resources/fileContent.txt").collect {it} 

3.3. Utilizzando l' operatore as

Possiamo anche sfruttare l' operatore as per leggere il contenuto del file in un array di stringhe :

def array = new File("src/main/resources/fileContent.txt") as String[]

4. Leggere un file in una singola stringa

4.1. Using File.text

We can read an entire file into a single String simply by using the text property of the File class.

Let's have a look at an example:

String readFileString(String filePath) { File file = new File(filePath) String fileContent = file.text return fileContent } 

Let's verify this with a unit test:

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. Using File.getText

If we use the getTest(charset) method, we can read the content of an encoded file into a String by providing a charset parameter like UTF-8 or ASCII:

String readFileStringWithCharset(String filePath) { File file = new File(filePath) String utf8Content = file.getText("UTF-8") return utf8Content }

Let's create an HTML file with UTF-8 content named utf8Content.html for the unit testing:

ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ 

Let's see the unit test:

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. Reading a Binary File with File.bytes

Groovy semplifica la lettura di file non di testo o binari. Utilizzando la proprietà bytes , possiamo ottenere il contenuto del File come un array di byte :

byte[] readBinaryFile(String filePath) { File file = new File(filePath) byte[] binaryContent = file.bytes return binaryContent }

Useremo un file immagine png, sample.png , con i seguenti contenuti per lo unit test:

Vediamo lo unit test:

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. Conclusione

In questo breve tutorial, abbiamo visto diversi modi di leggere un file in Groovy utilizzando vari metodi della classe File insieme a BufferedReader e InputStream .

Il codice sorgente completo di queste implementazioni e casi di unit test può essere trovato nel progetto GitHub.