«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<String> 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<String>
assert lines.size(), 3
}
3.2. Использование File.collect
Мы также можем прочитать содержимое файла в список строк, используя API сбора:
def list = new File("src/main/resources/fileContent.txt").collect {it}
3.3. Использование оператора as
Мы можем даже использовать оператор as для чтения содержимого файла в массив строк:
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), мы можем прочитать содержимое закодированного файла в строку, указав параметр набора символов, такой как 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, со следующим содержимым для модульного тестирования:
Давайте посмотрим модульный тест:
6. Заключение
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
}
В этом кратком руководстве мы рассмотрели различные способы чтения файла в Groovy с использованием различных методов класса File вместе с BufferedReader и Входной поток.
Полный исходный код этих реализаций и модульных тестов можно найти в проекте GitHub.
«