Title Image

Modified : 2023/10/01

テキストファイルからの読み込み

Kotlinでテキストファイルを読み込む方法、「文字コード(SJIS、UTF8)」の指定方法を紹介します。
主に、File.readText()、BufferedReader.readLines()、BufferedReader.use、BufferedReader.useLinesを紹介します。
[ホーム]

[記事の先頭]

File.readText()でテキストファイルを読み込む。

File.readText()を使うと、テキストファイルの内容をStringとして取得できます。
以下は、文字コードがUTF8の場合とSJISの場合のサンプルです。

文字コードがUTF8のファイルを読み込むサンプル

val file = File(textFilePath)
readedText = file.readText()

文字コードがSJISのファイルを読み込むサンプル

val file = File(textFilePath)
readedText = file.readText(Charset.forName("MS932"))
[記事の先頭]

BufferedReader.readLines()でテキストファイルの読み込む。

BufferedReader.readLines()を使うと、テキストファイルの内容をStream<String>として取得できます。
なお、BufferedReaderclose()を呼び出す必要があるので、忘れないように注意してください。

文字コードがUTF8のファイルを読み込むサンプル

val file = File(textFilePath)
val bufferedReader = file.bufferedReader()
var lineNo = 1
bufferedReader.readLines().forEach {
    println("$lineNo: $it")
    lineNo++
}
bufferedReader.close()

文字コードがSJISのファイルを読み込むサンプル

val file = File(textFilePath)
val bufferedReader = file.bufferedReader(Charset.forName("MS932"))
var lineNo = 1
bufferedReader.readLines().forEach {
    println("$lineNo: $it")
    lineNo++
}
bufferedReader.close()
[記事の先頭]

BufferedReader.useLinesでテキストファイルの読み込む。

 BufferedReader.useLinesを使うと、テキストファイルの内容をStream<String>として取得できます。
 Stream<String>として取得するとフィルタリングなどを容易に行えるため、便利です。
 なお、BufferedReader.useLinesは自動的にファイルを閉じてくれるため、 BufferedReaderclose()を呼び出す必要はありません。

文字コードがUTF8のファイルを読み込むサンプル

val file = File(textFilePath)
val bufferedReader = file.bufferedReader()
val result = bufferedReader.useLines {
    var lineNo = 1
    it.forEach {
        readedItems.add(it)
        println("$lineNo: $it")
        lineNo++
    }

    // ラムダ式は、kotlin.Unit型を返すことになっているため、今回は成功の「true」を返す。
    true
}
println("result : $result")

文字コードがSJISのファイルを読み込むサンプル

val file = File(textFilePath)
val bufferedReader = file.bufferedReader(Charset.forName("MS932"))
val result = bufferedReader.useLines {
    var lineNo = 1
    it.forEach {
        readedItems.add(it)
        println("$lineNo: $it")
        lineNo++
    }

    // ラムダ式は、kotlin.Unit型を返すことになっているため、今回は成功の「true」を返す。
    true
}
println("result : $result")
[記事の先頭]

BufferedReader.useでテキストファイルを一行ずつ読み込む。

 File.readText()BufferedReader.readLines()BufferedReader.useLinesでは、 テキストファイルを一度に読み込んでいるようです。よって、非常に大きなテキストファイルを 読み込む際にメモリが足りなくなる可能性があります。
 そんな時は、BufferedReader.useを使い、BufferedReader.readLine()で一行ずつ読み込み、 必要な情報のみをメモリ上に残すようにしましょう。
 なお、BufferedReader.useは自動的にファイルを閉じてくれるため、 BufferedReaderclose()を呼び出す必要はありません。

文字コードがUTF8のファイルを読み込むサンプル

val file = File(textFilePath)
val bufferedReader = file.bufferedReader()

val result = bufferedReader.use {
    var lineNo = 1
    var lineText: String?
    while (true) {
        // 一行ずつ読み込む。
        lineText = it.readLine()
        if (lineText == null) {
            break
        }

        readedItems.add(lineText)
        println("$lineNo: $lineText")
        lineNo++
    }

    // kotlin.Unit型を返すことになっているため、今回は成功の「true」を返す。
    true
}
println("result : $result")
[記事の先頭]

文字コードがSJISとなっているテキストファイルを読み込む。

 File.readText()File.bufferedReader()の引数にCharsetを指定することにより、 読み込むファイルの文字コードを指定できますが、ChsrsetsSJISが登録されていません。
 よって、以下のようにCharset.forName("MS932")と指定することにより、 SJISの文字コードのテキストファイルを読み込むことができるようになります。

File.readText()の場合

val text = File.readText(Charset.forName("MS932"))

File.bufferedReader()の場合

val bufferedReader = File(testFilePath).bufferedReader(Charset.forName("MS932"))
[記事の先頭]

関連記事

[記事の先頭]