Kotlinの文字列へのInputStream

1. 概要

この短いチュートリアルでは、_InputStream_を_String._に読み込む方法を説明します。
link:/kotlin[Kotlin]は、変換を実行する簡単な方法を提供します。 ただし、リソースを操作する際に考慮すべきいくつかのニュアンスがまだあります。 さらに、*停止文字まで読む*などの特殊なケースもカバーします。

2. バッファリーダー

  • _InputStream_は、バイトの順序付けされたストリームを抽象化したものです*。 基になるデータソースは、ファイル、ネットワーク接続、またはバイトを放出する他のソースです。 次のデータを含む単純なファイルを使用してみましょう。

Computer programming can be a hassle
It's like trying to take a defended castle
私たちが試みるかもしれない最初の解決策は、https://www.baeldung.com/kotlin-read-file [ファイルを読む]行ごとに手動ですることです:
val reader = BufferedReader(inputStream.reader())
val content = StringBuilder()
try {
    var line = reader.readLine()
    while (line != null) {
        content.append(line)
        line = reader.readLine()
    }
} finally {
    reader.close()
}
最初に、_BufferedReader_クラスを使用して__InputStream __をラップし、ストリームに行がなくなるまで読み取りました。 さらに、読み取りのロジックを_try-finally_ステートメントで囲んで、*最終的にストリームを閉じます*。 全体として、定型的なコードがたくさんあります。
もっとコンパクトで読みやすいものにできますか?
絶対に! 最初に、_readText()_関数を使用してスニペットを単純化できます。 入力ストリームを_https://www.baeldung.com/kotlin-string-comparison [String] _として完全に読み取ります。 したがって、スニペットを次のようにリファクタリングできます。
val reader = BufferedReader(inputStream.reader())
var content: String
try {
    content = reader.readText()
} finally {
    reader.close()
}
ただし、_try-finally_ブロックはまだあります。 幸いなことに、Kotlinでは、https://www.baeldung.com/kotlin-try-with-resources [リソース管理]を疑似自動方式で処理できます。 次のコード行を見てみましょう。
val content = inputStream.bufferedReader().use(BufferedReader::readText)
assertEquals(fileFullContent, content)
この1行のソリューションはシンプルに見えますが、内部では多くのことが行われています。 上記のコードで重要な点の1つは、_use()_関数の呼び出しです。 このlink:/kotlin-extension-methods[extension function]は、_Closable_インターフェイスを実装するリソースでブロックを実行します。 最後に、ブロックが実行されると、* Kotlinはリソースを閉じます。*

3. ストップキャラクター

同時に、*特定の文字までコンテンツを読む必要がある場合があります*。 _InputStream_クラスの拡張関数を定義しましょう:
fun InputStream.readUpToChar(stopChar: Char): String {
    val stringBuilder = StringBuilder()
    var currentChar = this.read().toChar()
    while (currentChar != stopChar) {
        stringBuilder.append(currentChar)
        currentChar = this.read().toChar()
        if (this.available() <= 0) {
            stringBuilder.append(currentChar)
            break
        }
    }
    return stringBuilder.toString()
}
*この関数は、停止文字が表示されるまで入力ストリームからバイトを読み取ります*。 同時に、*無限ループを防ぐために、_available()_メソッド*を呼び出して、ストリームにデータが残っているかどうかを確認します。 したがって、ストリームにストップ文字がない場合、ストリーム全体が読み取られます。
一方、_InputStream_クラスのすべてのサブクラスが_available()_メソッドの実装を提供するわけではありません。 そのため、拡張機能を使用する前に、メソッドが正しく実装されていることを確認する必要があります。
例に戻って、*最初の空白文字までテキストを読みましょう*(「」):
val content = inputStream.use { it.readUpToChar(' ') }
assertEquals("Computer", content)
その結果、ストップキャラクターまでテキストを取得します。 同様に、ブロックを_use()_関数でラップしてストリームを自動的に閉じることを忘れないでください*。

4. 結論

この記事では、Kotlinで_InputStream_を_String_に変換する方法を見てきました。 Kotlinは、データストリームを操作するための簡潔な方法を提供しますが、内部で何が起こっているかを常に知る価値があります。
いつものように、これらすべての例の実装はhttps://github.com/eugenp/tutorials/tree/master/core-kotlin-io[Github上]です。