Lese en fil i Groovy

1. Oversikt

I denne raske opplæringen vil vi utforske forskjellige måter å lese en fil i Groovy på.

Groovy gir praktiske måter å håndtere filer på. Vi konsentrerer oss om Fil klasse som har noen hjelpemetoder for å lese filer.

La oss utforske dem en etter en i de følgende avsnittene.

2. Lesing a Fil Linje for linje

Det er mange Groovy IO-metoder som readLine og eachLine tilgjengelig for å lese filer linje for linje.

2.1. Ved hjelp av File.withReader

La oss starte med Fil.withReader metode. Det skaper et nytt BufferedReader under dekslene som vi kan bruke til å lese innholdet ved hjelp av readLine metode.

La oss for eksempel lese en fil linje for linje og skrive ut hver linje. Vi returnerer også antall linjer:

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

La oss lage en ren tekstfil fileContent.txt med følgende innhold og bruk det til testingen:

Linje 1: Hei verden !!! Linje 2: Dette er et filinnhold. Linje 3: strenginnhold

La oss teste ut verktøymetoden vår:

def 'Skal returnere antall linjer i File given filePath' () {gitt: def filePath = "src / main / resources / fileContent.txt" når: def noOfLines = readFile.readFileLineByLine (filePath) da: noOfLines noOfLines forekomst av Integer hevder noOfLines , 3} 

De withReader metoden kan også brukes med en charset-parameter som UTF-8 eller ASCII for å lese kodede filer. La oss se et eksempel:

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

2.2. Ved hjelp av File.eachLine

Vi kan også bruke eachLine metode:

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

2.3. Ved hjelp av File.newInputStream med InputStream.eachLine

La oss se hvordan vi kan bruke InputStream med eachLine å lese en fil:

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

Når vi bruker newInputStream metoden, må vi forholde oss til å lukke InputStream.

Hvis vi bruker medInputStream metoden i stedet, vil den håndtere å lukke InputStream for oss:

ny fil ("src / main / resources / fileContent.txt"). medInputStream {stream -> stream.eachLine {line -> println line}}

3. Lesing a Fil inn i en Liste

Noen ganger trenger vi å lese innholdet i en fil i en liste over linjer.

3.1. Ved hjelp av File.readLines

For dette kan vi bruke readLines metode som leser filen inn i en Liste av Strenger.

La oss se raskt på et eksempel som leser filinnhold og returnerer en liste med linjer:

Liste readFileInList (String filePath) {File file = new File (filePath) def lines = file.readLines () retur linjer}

La oss skrive en rask test ved hjelp av fileContent.txt:

def 'Skal returnere filinnhold i listen over linjer gitt filePath' () {gitt: def filePath = "src / main / resources / fileContent.txt" når: def linjer = readFile.readFileInList (filePath) deretter: linjer linjer forekomst av Liste påstand lines.size (), 3}

3.2. Ved hjelp av File.collect

Vi kan også lese filinnholdet i en Liste av Strenger bruker samle inn API:

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

3.3. Bruker som Operatør

Vi kan til og med utnytte som operatøren for å lese innholdet av filen i en String matrise:

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

4. Lesing a Fil inn i en singel String

4.1. Ved hjelp av File.text

Vi kan lese en hel fil i en enkelt String ganske enkelt ved å bruke tekst eiendommen til Fil klasse.

La oss se på et eksempel:

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

La oss verifisere dette med en enhetstest:

def 'Bør returnere filinnhold i streng gitt filePath' () {gitt: def filePath = "src / main / resources / fileContent.txt" når: def fileContent = readFile.readFileString (filePath) deretter: fileContent fileContent instans av streng fileContent.contains ("" "Linje 1: Hello World !!! Linje 2: Dette er et filinnhold. Linje 3: Strenginnhold" "")}

4.2. Ved hjelp av File.getText

Hvis vi bruker getTest (charset) metode, kan vi lese innholdet i en kodet fil i en String ved å gi en tegnparameter som UTF-8 eller ASCII:

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

La oss lage en HTML-fil med UTF-8-innhold som heter utf8Content.html for enhetstesting:

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

La oss se enhetstesten:

def 'Bør returnere UTF-8-kodet filinnhold i streng gitt filePath' () {gitt: def filePath = "src / main / resources / utf8Content.html" når: def encodedContent = readFile.readFileStringWithCharset (filePath) deretter: encodedContent kodetContent forekomst av Streng}

5. Lese en binær fil med File.bytes

Groovy gjør det enkelt å lese filer som ikke er tekst eller binære. Ved å bruke byte eiendom, kan vi få innholdet i Fil som en byte array:

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

Vi bruker en png-bildefil, sample.png, med følgende innhold for enhetstesting:

La oss se enhetstesten:

def 'Bør returnere binært filinnhold i byte-array gitt filePath' () {gitt: def filePath = "src / main / resources / sample.png" når: def binaryContent = readFile.readBinaryFile (filePath) deretter: binaryContent binaryContent forekomst av byte [ ] binaryContent.length == 329}

6. Konklusjon

I denne raske opplæringen har vi sett forskjellige måter å lese en fil i Groovy på ved hjelp av forskjellige metoder for Fil klasse sammen med BufferedReader og InputStream.

Den komplette kildekoden til disse implementeringene og enhetstesttilfellene finner du i GitHub-prosjektet.


$config[zx-auto] not found$config[zx-overlay] not found