daisuzz.log

Kotlinでjava.io.Fileを使ってファイルを読み込むときに便利な拡張関数

Kotlinのファイル読み込みの方法はいくつかありますが、今日はjava.io.Fileを使ったファイル読み込みでKotlinが提供している便利な関数について書いていきたいと思います。

java.io.Fileの拡張関数

Kotlinでは、java.io.Fileの拡張関数として便利な関数がkotlin.io.FileReadWrite.ktで定義されています。

以降では、その中で以下の関数を紹介していきます。

  • File.readText()

  • File.readLine()

  • File.readBytes()

  • File.forEachLine()

File.readText()

File.readText()はテキスト全体を読み込み、文字列として返す関数です。

val fileName = "sample.txt"
val text = File(fileName).readText()
print(text)

readText()に限ったことではないですが、Kotlinが提供している拡張関数では内部でuse()を用いているため、ファイルのclose処理を暗黙的に実行してくれます。 そのため、明示的にファイルのclose処理を実装する必要はありません。

また、readText()は以下のように引数としてファイル読み込み時の文字コードを指定することができます。

val text = File(fileName).readText(CharSets.UTF_16)

defaultではUTF-8が指定されています。

注意点としては、OutOfMemoryErrorが起こるため2Gbを超えるファイルサイズを読み込むことは非推奨となっています。

File.readLines()

ファイルの各行を要素としたListを返す関数です。

val fileName = "sample.txt"
val lines = File(fileName).readLines()
for (line in lines){
    println(line)
}

readText()と同様、引数で文字コードを指定することができたり、2Gbを超えるファイルサイズを読み込むことは非推奨となっています。

File.readBytes()

ファイルの中身をByteArrayとして返す関数です。

val fileName = "sample.txt"
val bytes = File(fileName).readBytes()

readText(), readLines()同様、2Gbを超えるファイルサイズを読み込むことは非推奨となっています。

File.forEachLine()

大きいサイズのファイルを行単位で読み込む場合に推奨されている関数です。 今まで紹介した関数と異なり、戻り値はUnitとなっていて、以下のように読み込んだ行に対してラムダを実行します。

val fileName = "sample.txt"
File(fileName).forEachLine { println(it) }

おわりに

今回は、新型コロナの対応で無料公開されていたjetbrains academyを受講する中で知ったKotlinのファイル読み込みの便利な拡張関数を紹介しました。 Kotlin以外にもPythonJavaなどの教材も公開されているので、気になる人がいればおうち時間のコンテンツとしてやってみることをおすすめします。