Son zamanlarda InputStream
bir Kotlin'de bir String'in tüm içeriğini okumak için kod gördüm , örneğin:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
Ve ayrıca:
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()
}
Ve otomatik olarak kapattığı için daha yumuşak görünen bu bile InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
Veya bunda küçük bir değişiklik:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
Sonra bu işlevsel katlama şeyi:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Veya şunu kapatmayan kötü bir varyasyon InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Ama hepsi hantal ve ben aynı şeyin daha yeni ve farklı versiyonlarını bulmaya devam ediyorum ... ve bazıları asla kapatmıyor bile InputStream
. Okumanın hantal olmayan (deyimsel) bir yolu InputStream
nedir?
Not: Bu soru yazar tarafından bilinçli olarak yazılır ve yanıtlanır ( Kendi Kendine Cevaplanan Sorular ), böylece yaygın olarak sorulan Kotlin konularına verilen deyimsel cevaplar SO'da mevcuttur.
use
veyauseLines
bir blok işlevi çalıştıran bir işlev bekliyorum . meselainputStream.useText { text -> ... }
ben "READTEXT" okurken, diğer yandan, metni döndüren bir işlev bekliyoruz:val inputAsString = inputStream.readText()
.