J'ai récemment vu du code pour lire le contenu entier d'un InputStreamdans une chaîne dans Kotlin, tel 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 celui-ci qui semble plus lisse car il ferme automatiquement le 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-là:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()   
Ensuite, ce truc de pli fonctionnel:
val inputString = input.bufferedReader().useLines { lines ->
    lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Ou une mauvaise variation qui ne ferme pas le InputStream:
val inputString = BufferedReader(InputStreamReader(input))
        .lineSequence()
        .fold(StringBuilder()) { buff, line -> buff.append(line) }
        .toString()
Mais ils sont tous maladroits et je continue à trouver des versions plus récentes et différentes du même ... et certains d'entre eux ne ferment même jamais le InputStream. Qu'est-ce qu'une façon non maladroite (idiomatique) de lire le InputStream?
Remarque: cette question est intentionnellement écrite et répondue par l'auteur ( Questions auto-répondues ), de sorte que les réponses idiomatiques aux sujets Kotlin fréquemment posées soient présentes dans SO.
useouuseLinesqui exécute une fonction de bloc sur ce qui est "utilisé". par exemple , d'inputStream.useText { text -> ... }autre part, quand je lis « readText » Je me attends à une fonction qui renvoie le texte:val inputAsString = inputStream.readText().