Недавно я видел код для чтения всего содержимого InputStream
в String в Kotlin, например:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
А также:
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()
}
И даже это выглядит более плавным, так как оно автоматически закрывает InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
Или небольшое отклонение от этого:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
Тогда эта функциональная складка thingy:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Или параметр bad, который не закрывает InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Но все они неуклюжи, и я продолжаю находить новые и разные версии того же... и некоторые из них даже не закрывают InputStream
. Что такое неудобный (идиоматический) способ читать InputStream
?
Примечание: этот вопрос намеренно написан автором и автору (Автоответчик), так что идиоматические ответы обычно спросила темы Котлина в SO.