Læsning af en fil i Groovy

1. Oversigt

I denne hurtige vejledning udforsker vi forskellige måder at læse en fil i Groovy på.

Groovy giver praktiske måder at håndtere filer på. Vi koncentrerer os om Fil klasse, der har nogle hjælpemetoder til læsning af filer.

Lad os udforske dem en efter en i de følgende afsnit.

2. Læsning a Fil Linje for linje

Der er mange Groovy IO-metoder som readLine og hver linie tilgængelig til læsning af filer linje for linje.

2.1. Ved brug af File.withReader

Lad os starte med Fil.withReader metode. Det skaber et nyt BufferedReader under de omslag, som vi kan bruge til at læse indholdet ved hjælp af readLine metode.

Lad os for eksempel læse en fil linje for linje og udskrive hver linje. Vi returnerer også antallet af 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}

Lad os oprette en almindelig tekstfil fileContent.txt med følgende indhold og brug det til testningen:

Linje 1: Hej verden !!! Linje 2: Dette er et filindhold. Linje 3: Stringindhold

Lad os teste vores hjælpemetode:

def 'Skal returnere antallet af linjer i File given filePath' () {given: def filePath = "src / main / resources / fileContent.txt" når: def noOfLines = readFile.readFileLineByLine (filePath) så: noOfLines noOfLines instans af Integer hævder noOfLines , 3} 

Det withReader metoden kan også bruges med en charset-parameter som UTF-8 eller ASCII til at læse kodede filer. Lad os 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 brug af File.eachLine

Vi kan også bruge hver linie metode:

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

2.3. Ved brug af File.newInputStream med InputStream.eachLine

Lad os se, hvordan vi kan bruge InputStream med hver linie at læse en fil:

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

Når vi bruger newInputStream metode, skal vi beskæftige os med at lukke InputStream.

Hvis vi bruger medInputStream metode i stedet, vil det håndtere lukning af InputStream for os:

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

3. Læsning a Fil ind i en Liste

Nogle gange er vi nødt til at læse indholdet af en fil i en liste over linjer.

3.1. Ved brug af File.readLines

Til dette kan vi bruge readLines metode, der læser filen ind i en Liste af Strenge.

Lad os se hurtigt på et eksempel, der læser filindhold og returnerer en liste med linjer:

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

Lad os skrive en hurtig test ved hjælp af fileContent.txt:

def 'Skal returnere filindhold i listen over linjer givet filePath' () {given: def filePath = "src / main / resources / fileContent.txt" når: def lines = readFile.readFileInList (filePath) derefter: linjer linjer instans af Liste lines.size (), 3}

3.2. Ved brug af File.collect

Vi kan også læse filindholdet i en Liste af Strenge bruger indsamle API:

def liste = ny fil ("src / main / resources / fileContent.txt"). indsaml {it} 

3.3. Bruger som Operatør

Vi kan endda udnytte som operatør til at læse indholdet af filen i en Snor matrix:

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

4. Læsning a Fil ind i en single Snor

4.1. Ved brug af File.text

Vi kan læse en hel fil i en enkelt Snor blot ved hjælp af tekst ejendommen til Fil klasse.

Lad os se på et eksempel:

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

Lad os kontrollere dette med en enhedstest:

def 'Skal returnere filindhold i streng givet filePath' () {given: def filePath = "src / main / resources / fileContent.txt" når: def fileContent = readFile.readFileString (filePath) derefter: fileContent fileContent instans af streng filContent.contains ("" "Linie 1: Hej verden !!! Linje 2: Dette er et filindhold. Linie 3: Strengindhold" "")}

4.2. Ved brug af File.getText

Hvis vi bruger getTest (tegn) metode, kan vi læse indholdet af en kodet fil i en Snor ved at angive en tegnsætparameter som UTF-8 eller ASCII:

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

Lad os oprette en HTML-fil med UTF-8-indhold navngivet utf8Content.html til enhedstesten:

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

Lad os se enhedstesten:

def 'Skal returnere UTF-8-kodet filindhold i streng givet filePath' () {given: def filePath = "src / main / resources / utf8Content.html" når: def encodedContent = readFile.readFileStringWithCharset (filePath) derefter: encodedContent encodedContent instans af String}

5. Læsning af en binær fil med File.bytes

Groovy gør det let at læse filer, der ikke er tekst eller binære. Ved hjælp af bytes ejendom, kan vi få indholdet af Fil som en byte array:

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

Vi bruger en png-billedfil, sample.pngmed følgende indhold til enhedstesten:

Lad os se enhedstesten:

def 'Skal returnere binært filindhold i byte-array givet filePath' () {given: def filePath = "src / main / resources / sample.png" når: def binaryContent = readFile.readBinaryFile (filePath) derefter: binaryContent binaryContent instans af byte [ ] binaryContent.length == 329}

6. Konklusion

I denne hurtige vejledning har vi set forskellige måder at læse en fil i Groovy ved hjælp af forskellige metoder til Fil klasse sammen med BufferedReader og InputStream.

Den komplette kildekode til disse implementeringer og enhedstestsager kan findes i GitHub-projektet.