Kotlinでjava.io.FileをInputStream/OutputStreamやReader/Writerに変換する

Kotlinのコードレビューをしていて、java.io.File から InputStream に変換するとき、Javaっぽく Files#newInputStream を使っているコードがあった。

拡張関数で直接 File から変換できると指摘したら、知られていなかったのでメモ。

拡張関数の定義されたクラス

kotlin.io.FileReadWrite.kt に定義されている。

github.com

FileからInputStream/OutputStream

File#InputStream()FileInputStreamFile#outputStream()FileOutputStream に変換できる。

バッファリングはされていないが、Kotlinの InputStreamOutputStreamkotlin.io.IOStreams.kt に拡張関数が定義されており、 buffered(bufferSize: Int = DEFAULT_BUFFER_SIZE)BufferedInputStreamBufferedOutputStream で、バッファリングされた形式に変換できる。

// 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)BufferedReaderFile#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を行き来している身としては、両方の書き方を覚えないといけないのが面倒ではある。