Четене на файл в Groovy

1. Общ преглед

В този бърз урок ще проучим различни начини за четене на файл в Groovy.

Groovy предоставя удобни начини за обработка на файлове. Ще се концентрираме върху класа File, който има някои помощни методи за четене на файлове.

Нека ги изследваме един по един в следващите раздели.

2. Четене на файл по ред

Има много методи на Groovy IO като readLine и eachLine, налични за четене на файлове ред по ред.

2.1. Използване на File.withReader

Нека започнем с метода File .withReader . Той създава нов BufferedReader под кориците, който можем да използваме за четене на съдържанието, използвайки метода readLine .

Например, нека прочетем файл ред по ред и отпечатаме всеки ред. Ще върнем и броя на редовете:

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

Нека създадем обикновен текстов файл fileContent.txt със следното съдържание и да го използваме за тестване:

Line 1 : Hello World!!! Line 2 : This is a file content. Line 3 : String content

Нека изпробваме нашия полезен метод:

def 'Should return number of lines in File given filePath' () { given: def filePath = "src/main/resources/fileContent.txt" when: def noOfLines = readFile.readFileLineByLine(filePath) then: noOfLines noOfLines instanceof Integer assert noOfLines, 3 } 

Методът withReader може да се използва и с параметър на символи като UTF-8 или ASCII за четене на кодирани файлове . Да видим пример:

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

2.2. Използване на File.eachLine

Можем да използваме и метода eachLine :

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

2.3. Използване на File.newInputStream с InputStream.eachLine

Нека да видим как можем да използваме InputStream с eachLine за четене на файл:

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

Когато използваме метода newInputStream , трябва да се справим със затварянето на InputStream .

Ако вместо това използваме метода withInputStream , той ще се справи със затварянето на InputStream за нас:

new File("src/main/resources/fileContent.txt").withInputStream { stream -> stream.eachLine { line -> println line } }

3. Четене на файл в списък

Понякога трябва да прочетем съдържанието на файл в списък с редове.

3.1. Използване на File.readLines

За това можем да използваме метода readLines , който чете файла в Списък на низове .

Нека да разгледаме набързо пример, който чете съдържанието на файла и връща списък с редове:

List readFileInList(String filePath) { File file = new File(filePath) def lines = file.readLines() return lines }

Нека напишем бърз тест, използвайки fileContent.txt :

def 'Should return File Content in list of lines given filePath' () { given: def filePath = "src/main/resources/fileContent.txt" when: def lines = readFile.readFileInList(filePath) then: lines lines instanceof List assert lines.size(), 3 }

3.2. Използване на File.collect

Също така можем да прочетем съдържанието на файла в Списък на низове, използвайки API за събиране :

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

3.3. Използване на оператора като

Можем дори да използваме оператора as , за да четем съдържанието на файла в String масив:

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

4. Четене на файл в един низ

4.1. Използване на File.text

Можем да прочетем цял файл в един низ, просто като използваме свойството text на класа File .

Нека да разгледаме един пример:

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

Нека проверим това с единичен тест:

def 'Should return file content in string given filePath' () { given: def filePath = "src/main/resources/fileContent.txt" when: def fileContent = readFile.readFileString(filePath) then: fileContent fileContent instanceof String fileContent.contains("""Line 1 : Hello World!!! Line 2 : This is a file content. Line 3 : String content""") }

4.2. Използване на File.getText

Ако използваме метода getTest (charset) , можем да прочетем съдържанието на кодиран файл в String, като предоставим параметър на charset като UTF-8 или ASCII:

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

Нека създадем HTML файл с UTF-8 съдържание, наречен utf8Content.html за модулното тестване:

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

Нека видим единичния тест:

def 'Should return UTF-8 encoded file content in string given filePath' () { given: def filePath = "src/main/resources/utf8Content.html" when: def encodedContent = readFile.readFileStringWithCharset(filePath) then: encodedContent encodedContent instanceof String }

5. Четене на двоичен файл с File.bytes

Groovy улеснява четенето на нетекстови или двоични файлове. Използвайки свойството bytes , можем да получим съдържанието на файла като масив от байтове :

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

Ще използваме png файл с изображения, sample.png , със следното съдържание за модулното тестване:

Нека видим единичния тест:

def 'Should return binary file content in byte array given filePath' () { given: def filePath = "src/main/resources/sample.png" when: def binaryContent = readFile.readBinaryFile(filePath) then: binaryContent binaryContent instanceof byte[] binaryContent.length == 329 }

6. Заключение

В този бърз урок видяхме различни начини за четене на файл в Groovy, използвайки различни методи от класа File, заедно с BufferedReader и InputStream .

Пълният изходен код на тези имплементации и казуси за единични тестове може да се намери в проекта GitHub.