開発者ドキュメント

groovy-file-read

Groovyでファイルを読み取る

  • link:/category/programming/ [プログラミング]

  • Groovy

1. 概要

このクイックチュートリアルでは、https://www.baeldung.com/groovy-language [Groovy]でファイルを読み取るさまざまな方法について説明します。
Groovyは、ファイルを処理する便利な方法を提供します。 ファイルを読み取るためのヘルパーメソッドを備えた_File_クラスに集中します。
次のセクションでそれらを1つずつ見ていきましょう。

2. _File_を1行ずつ読み込む

_readLine_ and _eachLine_のような行ごとに利用可能なhttp://docs.groovy-lang.org/2.4.7/html/gapi/org/codehaus/groovy/runtime/IOGroovyMethods.html[Groovy IOメソッド]が​​多数あります。 。

2.1. _File.withReader_の使用

http://docs.groovy-lang.org/next/html/groovy-jdk/java/io/File.html[_File_]__.withReader__メソッドから始めましょう。 * _readLine_メソッドを使用してコンテンツを読み取るために使用できるカバーの下に、新しい_BufferedReader_を作成します。*
たとえば、ファイルを1行ずつ読み取り、各行を印刷してみましょう。 行数も返します。
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. _InputStream.eachLine_で_File.newInputStream_を使用する

_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. _File_を_List_に読み込む

ファイルの内容を行のリストに読み込む必要がある場合があります。

3.1. _File.readLines_の使用

このために、ファイルを_Strings_の_List_に読み込む_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_の使用

content_collect_ APIを使用して、ファイルの内容を_Strings_のa__List_に読み込むこともできます。
def list = new File("src/main/resources/fileContent.txt").collect {it}

3.3. _as_演算子の使用

_as_ operatorを利用して、ファイルの内容を_String_配列に読み込むこともできます。
def array = new File("src/main/resources/fileContent.txt") as String[]

4. _File_を単一の_String_に読み込む

4.1. _File.text_を使用する

  • _File_クラスの_text_プロパティを使用するだけで、ファイル全体を1つの_String_に読み込むことができます*。

    例を見てみましょう:
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などの文字セットパラメーターを提供することで、エンコードされたファイルの内容をa_String_に読み込むことができます。
String readFileStringWithCharset(String filePath) {
    File file = new File(filePath)
    String utf8Content = file.getText("UTF-8")
    return utf8Content
}
単体テスト用に、_utf8Content.html_という名前のUTF-8コンテンツを含む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_プロパティを使用すると、_File_の内容を_byte_配列として取得できます*:
byte[] readBinaryFile(String filePath) {
    File file = new File(filePath)
    byte[] binaryContent = file.bytes
    return binaryContent
}
単体テスト用に次の内容のpng画像ファイル_sample.png_を使用します。
link:/uploads/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. 結論

このクイックチュートリアルでは、_File_クラスのさまざまなメソッドと_BufferedReader_および_InputStream_を使用して、Groovyでファイルを読み取るさまざまな方法を見てきました。
これらの実装と単体テストケースの完全なソースコードは、https://github.com/eugenp/tutorials/tree/master/core-groovy [GitHub]プロジェクトにあります。
モバイルバージョンを終了