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.