Een bestand lezen in Groovy

1. Overzicht

In deze korte tutorial onderzoeken we verschillende manieren om een ​​bestand in Groovy te lezen.

Groovy biedt handige manieren om met bestanden om te gaan. We zullen ons concentreren op de het dossier klasse die enkele hulpmethoden heeft voor het lezen van bestanden.

Laten we ze een voor een verkennen in de volgende secties.

2. Lezen van een het dossier Lijn bij lijn

Er zijn veel Groovy IO-methoden zoals Lees regel en elke regel beschikbaar voor het regel voor regel lezen van bestanden.

2.1. Gebruik makend van File.withReader

Laten we beginnen met de het dossier.withReader methode. Het creëert een nieuw BufferedReader onder de dekens die we kunnen gebruiken om de inhoud te lezen met behulp van de Lees regel methode.

Laten we bijvoorbeeld een bestand regel voor regel lezen en elke regel afdrukken. We retourneren ook het aantal regels:

int readFileLineByLine (String filePath) {File file = new File (filePath) def regel, noOfLines = 0; file.withReader {reader -> while ((line = reader.readLine ())! = null) {println "$ {line}" noOfLines ++}} return noOfLines}

Laten we een bestand met platte tekst maken fileContent.txt met de volgende inhoud en gebruik deze voor het testen:

Lijn 1: Hallo wereld !!! Regel 2: Dit is een bestandsinhoud. Regel 3: String-inhoud

Laten we onze hulpprogramma-methode testen:

def 'Moet aantal regels in Bestand gegeven filePath teruggeven' () {gegeven: def filePath = "src / main / resources / fileContent.txt" wanneer: def noOfLines = readFile.readFileLineByLine (filePath) dan: noOfLines noOfLines instantie van Integer beweren noOfLines , 3} 

De withReader methode kan ook worden gebruikt met een charset-parameter zoals UTF-8 of ASCII om gecodeerde bestanden te lezen. Laten we een voorbeeld bekijken:

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

2.2. Gebruik makend van Bestand.eachLine

We kunnen ook de elke regel methode:

nieuw bestand ("src / main / resources / fileContent.txt"). eachLine {regel -> println regel} 

2.3. Gebruik makend van File.newInputStream met InputStream.eachLine

Laten we eens kijken hoe we de InputStream met elke regel om een ​​bestand te lezen:

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

Wanneer we de newInputStream methode, hebben we te maken met het sluiten van de InputStream.

Als we de withInputStream methode in plaats daarvan, het zal het sluiten van de InputStream voor ons:

nieuw bestand ("src / main / resources / fileContent.txt"). withInputStream {stream -> stream.eachLine {regel -> println regel}}

3. Lezen van een het dossier in een Lijst

Soms moeten we de inhoud van een bestand in een lijst met regels lezen.

3.1. Gebruik makend van File.readLines

Hiervoor kunnen we de readLines methode die het bestand inleest in een Lijst van Snaren.

Laten we snel een voorbeeld bekijken dat bestandsinhoud leest en een lijst met regels retourneert:

Lijst readFileInList (String filePath) {File file = new File (filePath) def lines = file.readLines () retourregels}

Laten we een korte test schrijven met fileContent.txt:

def 'Moet bestandsinhoud retourneren in lijst met regels gegeven filePath' () {gegeven: def filePath = "src / main / resources / fileContent.txt" wanneer: def regels = readFile.readFileInList (filePath) dan: regels regels instantie van List assert lines.size (), 3}

3.2. Gebruik makend van File.collect

We kunnen de inhoud van het bestand ook lezen in een Lijst van Snaren de ... gebruiken verzamelen API:

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

3.3. De ... gebruiken net zo Operator

We kunnen zelfs gebruikmaken van de net zo operator om de inhoud van het bestand in een Draad matrix:

def array = nieuw bestand ("src / main / resources / fileContent.txt") als string []

4. Lezen van een het dossier in een single Draad

4.1. Gebruik makend van Bestand. Tekst

We kunnen een heel bestand in een enkel bestand lezen Draad gewoon door de tekst eigendom van de het dossier klasse.

Laten we een voorbeeld bekijken:

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

Laten we dit verifiëren met een unit-test:

def 'Moet bestandsinhoud teruggeven in string gegeven filePath' () {gegeven: def filePath = "src / main / resources / fileContent.txt" wanneer: def fileContent = readFile.readFileString (filePath) dan: fileContent fileContent instantie van String fileContent.contains ("" "Regel 1: Hallo wereld !!! Regel 2: Dit is de inhoud van een bestand. Regel 3: Tekenreeksinhoud" "")}

4.2. Gebruik makend van File.getText

Als we de getTest (karakterset) methode, kunnen we de inhoud van een gecodeerd bestand lezen in een Draad door een charset-parameter zoals UTF-8 of ASCII op te geven:

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

Laten we een HTML-bestand maken met UTF-8-inhoud met de naam utf8Content.html voor het testen van de unit:

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

Laten we eens kijken naar de unit-test:

def 'Moet UTF-8 gecodeerde bestandsinhoud teruggeven in string gegeven filePath' () {gegeven: def filePath = "src / main / resources / utf8Content.html" wanneer: def encodedContent = readFile.readFileStringWithCharset (filePath) dan: encodedContent encodedContent instanceof Draad }

5. Een binair bestand lezen met Bestand.bytes

Groovy maakt het gemakkelijk om niet-tekstuele of binaire bestanden te lezen. Door de bytes eigendom, kunnen we de inhoud van het het dossier als een byte array:

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

We gebruiken een png-afbeeldingsbestand, sample.png, met de volgende inhoud voor het testen van de unit:

Laten we eens kijken naar de unit-test:

def 'Moet binaire bestandsinhoud teruggeven in byte-array gegeven filePath' () {gegeven: def filePath = "src / main / resources / sample.png" wanneer: def binaryContent = readFile.readBinaryFile (filePath) dan: binaryContent binaryContent instantie van byte [ ] binaryContent.length == 329}

6. Conclusie

In deze korte tutorial hebben we verschillende manieren gezien om een ​​bestand in Groovy te lezen met behulp van verschillende methoden van het het dossier klasse samen met de BufferedReader en InputStream.

De volledige broncode van deze implementaties en unit-testcases is te vinden in het GitHub-project.