1. 概要

この簡単なチュートリアルでは、 InputStream弦。

Kotlin は、変換を実行する簡単な方法を提供します。 ただし、リソースを操作する際に考慮すべき微妙な違いがまだいくつかあります。 さらに、ストップキャラクターまでの読み取りなどの特殊なケースについても説明します。

2. バッファリーダー

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

Computer programming can be a hassle
It's like trying to take a defended castle

私たちが試みるかもしれない最初の解決策は、ファイルを1行ずつ手動で読み取ることです。

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()関数を使用してスニペットを簡略化できます。 入力ストリームをStringとして完全に読み取ります。 したがって、スニペットを次のようにリファクタリングできます。

val reader = BufferedReader(inputStream.reader())
var content: String
try {
    content = reader.readText()
} finally {
    reader.close()
}

ただし、そのtry-finallyブロックはまだあります。 幸い、Kotlinではリソース管理を疑似自動で処理できます。 次のコード行を見てみましょう。

val content = inputStream.bufferedReader().use(BufferedReader::readText)
assertEquals(fileFullContent, content)

この1行のソリューションは単純に見えますが、内部で多くのことが起こっています。 上記のコードの重要なポイントの1つは、 use()関数の呼び出しです。 この拡張関数は、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でInputStreamStringに変換する方法を見てきました。 Kotlinは、データストリームを操作するための簡潔な方法を提供しますが、内部で何が起こっているかを常に知ることは価値があります。

いつものように、これらすべての例の実装は、Github以上です。