Niedawno widziałem kod do wczytywania całej zawartości an InputStream
into a String w Kotlinie, taki jak:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
I również:
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()
}
I nawet to wygląda płynniej, ponieważ automatycznie zamyka InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
Lub niewielka zmiana tego:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
Następnie ten funkcjonalny skład:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Lub zła odmiana, która nie zamyka InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Ale wszystkie są niezgrabne i ciągle znajduję nowsze i różne wersje tego samego ... a niektóre z nich nawet nie zamykają InputStream
. Jaki jest niezgrabny (idiomatyczny) sposób czytania InputStream
?
Uwaga: to pytanie jest celowo napisany i odpowiedział przez autora ( Self-odpowiedziało na pytania ), tak że idiomatyczne odpowiedzi na najczęściej zadawane tematy Kotlin są obecne w tak.
use
lub,useLines
która wykonuje funkcję blokową na tym, co jest „używane”. npinputStream.useText { text -> ... }
Z drugiej strony, kiedy czytam „READTEXT” Spodziewam funkcję, która zwraca tekst:val inputAsString = inputStream.readText()
.