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

«