だから私はちょうど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を使用する最良の方法は何ですか?
bufferedReader
を使用できます
val allText = inputStream.bufferedReader().use(BufferedReader::readText)
それでも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拡張機能が自動的に呼び出します。
参照用に追加するだけです。
「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)
このリーダーの各行を反復処理し、読み取った各行に対してアクションを呼び出し、完了したらリーダーを閉じます。
別の方法は、forループを使用することです。
val reader = BufferedReader(someStream)
for (line in reader.lines()) {
println(line)
}
受け入れられた答えほど簡潔ではありませんが、以下に示すように、すべてを1つの文字列にポンプすることなくループスルーして何らかのロジックを実行できます
val allText: String = inputStream.bufferedReader().use(BufferedReader::readText)
JoãoGonçalvesのstdlibへの参照のおかげで、必要に応じて forEachLine を使用してリーダーを走査できることがわかりました。
このようなコードを使用してください
val input = conn.inputStream val allText = input.bufferedReader()。use(BufferedReader :: readText) val result = StringBuilder() result.append(allText) return result.toString() } else { return "失敗しました」 }