J'ai récemment vu le code de lecture de tout le contenu d'un InputStream
dans une Chaîne de Kotlin, tels que:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
Et aussi:
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()
}
Et même ce qui est plus lisse depuis l'auto-ferme l' InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
Ou une légère variation sur celui-ci:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
Alors cette fois fonctionnelle truc:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Ou un mauvais variation qui ne ferme pas l' InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Mais ils sont tous maladroit et je continue de trouver les plus récents et les différentes versions de la même chose... et certains d'entre eux n'a même jamais fermer l' InputStream
. Ce qui est un non-maladroit (idiomatiques) façon de lire l' InputStream
?
Remarque: cette question est volontairement écrit et répondu par l'auteur (Auto-Répondu aux Questions), de sorte que le idiomatiques les questions les plus fréquemment posées Kotlin thèmes sont présents dans la.