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
of Strings
.
Давайте быстро рассмотрим пример, который считывает содержимое файла и возвращает список строк:
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
для чтения содержимого файла в массив строк :
def array = new File("src/main/resources/fileContent.txt") as String[]
4. Чтение файла
в одну строку
4.1. Использование файла.текст
Мы можем прочитать весь файл в одну строку
, просто используя свойство 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
, со следующим содержимым для модульного тестирования:
Давайте посмотрим модульный тест:
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 .