Skip to content

I/O相互運用性

Ktorは、基本的なI/Oプリミティブを提供するマルチプラットフォームKotlinライブラリであるkotlinx-ioを基盤として構築された、非ブロッキングかつ非同期のI/Oをサポートしています。これにより、HTTPリクエストおよびレスポンスボディのストリーミング、ファイルの読み書き、およびすべてのデータをメモリにロードすることなくインクリメンタルなデータ処理が可能になります。

異なるI/Oモデルを使用する外部ライブラリやプラットフォームと連携する場合、アダプター群を使用して以下の型と相互運用できます。

  • RawSourceRawSink のような kotlinx-io
  • OutputStream のようなJava I/O型

このページでは、KtorのI/Oプリミティブ( ByteReadChannelByteWriteChannel)とこれらの外部型との間で変換する方法を説明します。

ByteReadChannelをRawSourceに変換する

ByteReadChannelRawSource に変換するには、.asSource() 拡張関数を使用します。

kotlin
val channel: ByteReadChannel = response.bodyAsChannel()
val source: RawSource = channel.asSource()

ByteWriteChannelをRawSinkに変換する

サスペンディングな ByteWriteChannelRawSink に変換するには、.asSink() 拡張関数を使用します。

kotlin
val channel: ByteWriteChannel = ...
val sink: RawSink = channel.asSink()

このアダプターによって生成される RawSink は、データをフラッシュする際に内部的に runBlocking を使用するため、フラッシュ操作は呼び出し元のスレッドをブロックする可能性があります。

RawSinkをByteWriteChannelに変換する

RawSink をサスペンディングな ByteWriteChannel としてラップするには、.asByteWriteChannel() 拡張関数を使用します。

kotlin
val sink: RawSink = ...
val channel: ByteWriteChannel = sink.asByteWriteChannel()

channel.writeByte(42)
channel.flushAndClose()

これにより、サスペンディング関数からシンクへの非同期書き込みが可能になります。返されるチャネルはバッファリングされます。すべてのデータが確実に書き込まれるようにするには、.flush() または .flushAndClose() を使用してください。

OutputStreamをByteWriteChannelに変換する

Javaの OutputStreamByteWriteChannel に変換するには、.asByteWriteChannel() 拡張関数を使用します。

kotlin
val outputStream: OutputStream = FileOutputStream("output.txt")
val channel: ByteWriteChannel = outputStream.asByteWriteChannel()

channel.writeFully("Hello, World!".toByteArray())
channel.flushAndClose()

ByteWriteChannel でのすべての操作はバッファリングされます。基になる OutputStream は、ByteWriteChannel.flush() が呼び出された場合にのみデータを受け取ります。