Čitanje datoteke u Groovyju
1. Pregled
U ovom brzom vodiču istražit ćemo različite načine čitanja datoteke u Groovyju.
Groovy pruža prikladne načine za rukovanje datotekama. Koncentrirat ćemo se na Datoteka klase koja ima neke pomoćne metode za čitanje datoteka.
Istražimo ih jednog po jednog u sljedećim odjeljcima.
2. Čitanje a Datoteka Red po redak
Postoje mnoge Groovy IO metode poput readLine i svakiLine dostupno za čitanje datoteka redak po redak.
2.1. Koristeći File.withReader
Počnimo s Datoteka.sa čitačem metoda. Stvara novo BufferedReader ispod pokrivača koje možemo koristiti za čitanje sadržaja pomoću readLine metoda.
Na primjer, pročitajmo datoteku redak po redak i ispišite svaki redak. Vratit ćemo i broj redaka:
int readFileLineByLine (String filePath) {Datoteka datoteke = nova datoteka (filePath) def line, noOfLines = 0; file.withReader {čitač -> while ((line = reader.readLine ())! = null) {println "$ {line}" noOfLines ++}} return noOfLines}
Stvorimo običnu tekstualnu datoteku fileContent.txt sa sljedećim sadržajima i upotrijebite ga za testiranje:
1. redak: Pozdrav svijetu !!! Redak 2: Ovo je sadržaj datoteke. Redak 3: Sadržaj niza
Isprobajmo našu korisnu metodu:
def 'Treba vratiti broj redaka u datoteci datoj filePath' () {dato: def filePath = "src / main / resources / fileContent.txt" kada je: def noOfLines = readFile.readFileLineByLine (filePath) tada: noOfLines noOfLines instanceof Integer assert noOfLines , 3}
The withReader metoda se također može koristiti s parametrom znaka kao što je UTF-8 ili ASCII za čitanje kodiranih datoteka. Pogledajmo primjer:
nova datoteka ("src / main / resources / utf8Content.html"). withReader ('UTF-8') {čitač -> def line while ((line = reader.readLine ())! = null) {println "$ { crta}" } }
2.2. Koristeći Datoteka.eachLine
Također možemo koristiti svakiLine metoda:
nova datoteka ("src / main / resources / fileContent.txt"). eachLine {line -> println line}
2.3. Koristeći File.newInputStream s InputStream.eachLine
Pogledajmo kako možemo koristiti InputStream s svakiLine za čitanje datoteke:
def je = nova datoteka ("src / main / resources / fileContent.txt"). newInputStream () is.eachLine {println it} is.close ()
Kada koristimo newInputStream metodu, moramo se pozabaviti zatvaranjem InputStream.
Ako koristimo withInputStream umjesto toga, obradit će zatvaranje InputStream za nas:
nova datoteka ("src / main / resources / fileContent.txt"). withInputStream {stream -> stream.eachLine {line -> println line}}
3. Čitanje a Datoteka u a Popis
Ponekad moramo pročitati sadržaj datoteke u popis redaka.
3.1. Koristeći File.readLines
Za to možemo koristiti readLines metoda koja čita datoteku u Popis od Žice.
Kratko ćemo pogledati primjer koji čita sadržaj datoteke i vraća popis redaka:
Popis readFileInList (String filePath) {File file = new File (filePath) def lines = file.readLines () return lines}
Napišimo brzi test pomoću fileContent.txt:
def 'Trebao bi vratiti sadržaj datoteke na popisu redaka datog filePath' () {dato: def filePath = "src / main / resources / fileContent.txt" kada je: def lines = readFile.readFileInList (filePath) then: lines lines instanceof List assert lines.size (), 3}
3.2. Koristeći File.collect
Sadržaj datoteke također možemo pročitati u Popis od Žice koristiti prikupiti API:
def list = nova datoteka ("src / main / resources / fileContent.txt"). prikupite {it}
3.3. Koristiti kao Operater
Možemo čak i iskoristiti kao operator za čitanje sadržaja datoteke u Niz niz:
def niz = nova datoteka ("src / main / resources / fileContent.txt") kao niz []
4. Čitanje a Datoteka u Samca Niz
4.1. Koristeći Datoteka.tekst
Možemo čitati cijelu datoteku u jednu Niz jednostavno pomoću tekst vlasništvo Datoteka razred.
Pogledajmo primjer:
String readFileString (String filePath) {File file = nova datoteka (filePath) String fileContent = file.text return fileContent}
Provjerimo to jedinstvenim testom:
def 'Treba vratiti sadržaj datoteke u niz datog filePath' () {dato: def filePath = "src / main / resources / fileContent.txt" kada je: def fileContent = readFile.readFileString (filePath) tada: fileContent fileContent instanceof String fileContent.contens ("" "Redak 1: Zdravo, svijet !!! Red 2: Ovo je sadržaj datoteke. Redak 3: Sadržaj niza" "")}
4.2. Koristeći File.getText
Ako koristimo getTest (charset) metodom možemo pročitati sadržaj kodirane datoteke u Niz pružanjem parametra znaka kao što su UTF-8 ili ASCII:
Niz readFileStringWithCharset (String filePath) {File file = nova datoteka (filePath) String utf8Content = file.getText ("UTF-8") return utf8Content}
Stvorimo HTML datoteku s imenovanim sadržajem UTF-8 utf8Content.html za jedinično ispitivanje:
ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾ ᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ
Pogledajmo jedinični test:
def 'Treba vratiti sadržaj datoteke kodirane UTF-8 u nizu datoj filePath' () {dato: def filePath = "src / main / resources / utf8Content.html" kada je: def encodedContent = readFile.readFileStringWithCharset (filePath), a zatim: encodedContent encodedContent instanceof Niz}
5. Čitanje binarne datoteke s Datoteka.bajtova
Groovy olakšava čitanje netekstualnih ili binarnih datoteka. Korištenjem bajtova svojstvo, možemo dobiti sadržaj Datoteka kao bajt niz:
byte [] readBinaryFile (String filePath) {File file = new File (filePath) byte [] binaryContent = file.bytes return binaryContent}
Koristit ćemo png slikovnu datoteku, sample.png, sa sljedećim sadržajem za jedinično ispitivanje:

Pogledajmo jedinični test:
def 'Treba vratiti sadržaj binarne datoteke u bajt-polju navedenom filePath' () {dato: def filePath = "src / main / resources / sample.png" kada: def binaryContent = readFile.readBinaryFile (filePath) tada: binaryContent binaryContent instanceof byte [ ] binaryContent.length == 329}
6. Zaključak
U ovom smo brzom vodiču vidjeli različite načine čitanja datoteke u Groovyju pomoću različitih metoda Datoteka razred zajedno s BufferedReader i InputStream.
Kompletni izvorni kod ovih implementacija i primjeri jediničnih testova mogu se naći u projektu GitHub.