Lire un fichier dans Groovy

1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons explorer différentes façons de lire un fichier dans Groovy.

Groovy fournit des moyens pratiques de gérer les fichiers. Nous allons nous concentrer sur la classe File qui a des méthodes d'aide pour la lecture des fichiers.

Explorons-les un par un dans les sections suivantes.

2. Lecture d'un fichier ligne par ligne

Il existe de nombreuses méthodes Groovy IO comme readLine et eachLine disponibles pour lire des fichiers ligne par ligne.

2.1. Utilisation de File.withReader

Commençons par la méthode File .withReader . Il crée un nouveau BufferedReader sous les couvertures que nous pouvons utiliser pour lire le contenu à l'aide de la méthode readLine .

Par exemple, lisons un fichier ligne par ligne et imprimons chaque ligne. Nous retournerons également le nombre de lignes:

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 }

Créons un fichier de texte brut fileContent.txt avec le contenu suivant et utilisons-le pour les tests:

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

Testons notre méthode utilitaire:

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 } 

La méthode withReader peut également être utilisée avec un paramètre charset comme UTF-8 ou ASCII pour lire des fichiers encodés . Voyons un exemple:

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

2.2. Utilisation de File.eachLine

Nous pouvons également utiliser la méthode eachLine :

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

2.3. Utilisation de File.newInputStream avec InputStream.eachLine

Voyons comment nous pouvons utiliser InputStream avec eachLine pour lire un fichier:

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

Lorsque nous utilisons la méthode newInputStream , nous devons nous occuper de la fermeture de InputStream .

Si nous utilisons la méthode withInputStream à la place, elle gérera la fermeture de InputStream pour nous:

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

3. Lecture d'un fichier dans une liste

Parfois, nous devons lire le contenu d'un fichier dans une liste de lignes.

3.1. Utilisation de File.readLines

Pour cela, nous pouvons utiliser la méthode readLines qui lit le fichier dans une liste de chaînes .

Jetons un coup d'œil à un exemple qui lit le contenu du fichier et renvoie une liste de lignes:

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

Écrivons un test rapide en utilisant 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. Utilisation de File.collect

Nous pouvons également lire le contenu du fichier dans une liste de chaînes à l'aide de l' API de collecte :

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

3.3. Utilisation de comme opérateur

Nous pouvons même utiliser l' opérateur as pour lire le contenu du fichier dans un tableau String :

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

4. Lecture d'un fichier en une seule chaîne

4.1. Utilisation de File.text

Nous pouvons lire un fichier entier en une seule chaîne en utilisant simplement la propriété text de la classe File .

Jetons un œil à un exemple:

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

Vérifions cela avec un test unitaire:

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. Utilisation de File.getText

Si nous utilisons la méthode getTest (charset) , nous pouvons lire le contenu d'un fichier encodé dans une chaîne en fournissant un paramètre charset comme UTF-8 ou ASCII:

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

Créons un fichier HTML avec du contenu UTF-8 nommé utf8Content.html pour le test unitaire:

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

Voyons le test unitaire:

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. Lecture d'un fichier binaire avec File.bytes

Groovy facilite la lecture de fichiers non textuels ou binaires. En utilisant la propriété bytes , nous pouvons obtenir le contenu du fichier sous forme de tableau d' octets :

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

Nous utiliserons un fichier image png, sample.png , avec le contenu suivant pour les tests unitaires:

Voyons le test unitaire:

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

Dans ce rapide didacticiel, nous avons vu différentes façons de lire un fichier dans Groovy en utilisant diverses méthodes de la classe File avec BufferedReader et InputStream .

Le code source complet de ces implémentations et cas de test unitaires se trouve dans le projet GitHub.