Č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.