Recentemente, vi um código para ler todo o conteúdo de um InputStream
em uma String no Kotlin, como:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
E também:
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 até mesmo isso parece mais suave, pois fecha automaticamente InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
Ou ligeira variação desse:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
Então, esta dobra funcional:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Ou uma variação ruim que não fecha o InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Mas eles são todos desajeitados e eu continuo encontrando versões mais novas e diferentes do mesmo ... e alguns deles nunca fecham o InputStream
. O que é uma maneira não desajeitada (idiomática) de ler o InputStream
?
Observação: esta pergunta foi escrita e respondida intencionalmente pelo autor ( Perguntas auto-respondidas ), de modo que as respostas idiomáticas aos tópicos mais comuns do Kotlin estejam presentes no SO.
use
ouuseLines
que executa uma função de bloco sobre o que está sendo "usado". eginputStream.useText { text -> ... }
Por outro lado, quando eu li "ReadText" Espero uma função que retorna o texto:val inputAsString = inputStream.readText()
.