web-dev-qa-db-ja.com

KotlinでBufferedReaderを使用する最良の方法

だから私はちょうどAndroid用のKotlinを使い始め、私のAndroid JavaコードをKotlinに変換しました。

変換の1つで、私は通常、次のようにJavaで書き込むBufferedReaderを見つけました。

String result = "";
String line = "";
BufferedReader reader = new BufferedReader(someStream);
while ( (line = reader.readLine()) != null ) {
    result += line;
}

しかし、Kotlinでは、Kotlinではwhile条件で変数に値を割り当てることが許可されていないようです。

現在、私は次のようにコードを書いています:

val reader = BufferedReader(someStream)
var line : String? = ""
while (line != null) {
    line = reader.readLine()
    result += line
}

kotlinを使用しているにもかかわらず、エレガントでprev-genを感じない。

KotlinでBufferedReaderを使用する最良の方法は何ですか?

23
Akira Kido

bufferedReader を使用できます

val allText = inputStream.bufferedReader().use(BufferedReader::readText)
54
miensol

それでも1行ずつ読みたい場合は、std libの拡張機能を使用して、次のように実行できます。

val reader = someStream.bufferedReader()
val iterator = reader.linesSequences().iterator()
while(iterator.hasNext()) {
    val line = iterator.next()
    // do something with line...
}
reader.close()

または、「機能的な」アプローチを使用します。

val reader = someStream.bufferedReader()
reader.useLines {
    it.map { line -> // do something with line }
}

useLinesを使用すると、リーダーでcloseを明示的に呼び出す必要はありません。useLines拡張機能が自動的に呼び出します。

参照用に追加するだけです。

13

「forEachLine」メソッドを使用して試すこともできます。

val file = File("./folder/test.txt")
file.bufferedReader().forEachLine {
    println("value = $it")
} 

また、最後の行を読み取った後、自動的にストリームを閉じます

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/Java.io.-reader/index.html

fun Reader.forEachLine(action:(String)-> Unit)
このリーダーの各行を反復処理し、読み取った各行に対してアクションを呼び出し、完了したらリーダーを閉じます。

3
Angel Koh

別の方法は、forループを使用することです。

val reader = BufferedReader(someStream)
for (line in reader.lines()) {
    println(line)
}

受け入れられた答えほど簡潔ではありませんが、以下に示すように、すべてを1つの文字列にポンプすることなくループスルーして何らかのロジックを実行できます

val allText: String = inputStream.bufferedReader().use(BufferedReader::readText)
2
Chris Ritchie

JoãoGonçalvesのstdlibへの参照のおかげで、必要に応じて forEachLine を使用してリーダーを走査できることがわかりました。

1
Alejandro Moya

このようなコードを使用してください

 
 val input = conn.inputStream 
 val allText = input.bufferedReader()。use(BufferedReader :: readText)
 val result = StringBuilder()
 
 result.append(allText)
 return result.toString()
 
} else {
 
 return "失敗しました」
 
} 
 
1
reza rahmad