私は最近InputStream
、KotlinのStringにの内容全体を読み取るためのコードを見ました。
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
そしてまた:
val reader = BufferedReader(InputStreamReader(input))
try {
val results = StringBuilder()
while (true) {
val line = reader.readLine()
if (line == null) break
results.append(line)
}
val inputAsString = results.toString()
} finally {
reader.close()
}
そして、これも自動的に閉じるので、より滑らかに見えますInputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
またはそのわずかなバリエーション:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
次に、この機能的な折りたたみ機能:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
またはを閉じない悪いバリエーションInputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
しかし、それらはすべて不格好であり、私は同じものの新しい異なるバージョンを見つけ続けています...そしてそれらのいくつかはを閉じることすらありませんInputStream
。を読むための不格好な(慣用的な)方法はInputStream
何ですか?
注: この質問は作者が意図的に作成して回答したものであり(自己回答式の質問)、一般的に尋ねられるKotlinトピックに対する慣用的な回答がSOにあります。
use
か、useLines
「使用」されているもののブロック機能を実行します。たとえばinputStream.useText { text -> ... }
、一方で、「readText」を読んだ場合、テキストを返す関数が必要ですval inputAsString = inputStream.readText()
。