Kotlinのコードレビューをしていて、java.io.File
から InputStream
に変換するとき、Javaっぽく Files#newInputStream
を使っているコードがあった。
拡張関数で直接 File
から変換できると指摘したら、知られていなかったのでメモ。
拡張関数の定義されたクラス
kotlin.io.FileReadWrite.kt
に定義されている。
FileからInputStream/OutputStream
File#InputStream()
で FileInputStream
、 File#outputStream()
で FileOutputStream
に変換できる。
バッファリングはされていないが、Kotlinの InputStream
や OutputStream
も kotlin.io.IOStreams.kt に拡張関数が定義されており、 buffered(bufferSize: Int = DEFAULT_BUFFER_SIZE)
で BufferedInputStream
や BufferedOutputStream
で、バッファリングされた形式に変換できる。
// InputStream file.inputStream().buffered().use { ... } // OutputStream file.outputStream().buffered().use { ... }
FileからReader/Writer
File#bufferedReader(charset: Charset = Charsets.UTF_8, bufferSize: Int = DEFAULT_BUFFER_SIZE)
で BufferedReader
、 File#bufferedWriter(charset: Charset = Charsets.UTF_8, bufferSize: Int = DEFAULT_BUFFER_SIZE)
で BufferedWriter
で、直接バッファリングされた形式に変換できる。
// Reader file.bufferedReader().use { ... } // Writer file.bufferedWriter().use { ... }
振り返り
JavaだとNIOを使うのがいいだろうが、Kotlinだと java.io.File
への拡張関数が便利なので、 java.io.File
ベースで実装していくのがよさそう。
JavaとKotlinを行き来している身としては、両方の書き方を覚えないといけないのが面倒ではある。