Recentemente ho visto il codice per leggere l'intero contenuto di un InputStream
in una stringa in Kotlin, come ad esempio:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
E anche:
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()
}
E anche questo sembra più fluido poiché chiude automaticamente InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
O una leggera variazione su quello:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
Quindi questa cosa pieghevole funzionale:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
O una brutta variazione che non chiude il InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Ma sono tutti goffi e continuo a trovare versioni nuove e diverse dello stesso ... e alcuni di loro non chiudono nemmeno il file InputStream
. Qual è un modo non goffo (idiomatico) di leggere il InputStream
?
Nota: questa domanda è stata scritta intenzionalmente e l'autore ha risposto ( Self-Answered Questions ), in modo che le risposte idiomatiche agli argomenti di Kotlin più comuni siano presenti in SO.
use
ouseLines
che esegue una funzione di blocco su ciò che viene "utilizzato". ad esempioinputStream.useText { text -> ... }
D'altra parte, quando ho letto "READTEXT" Mi aspetto una funzione che restituisce il testo:val inputAsString = inputStream.readText()
.