Нещодавно я побачив код для читання всього вмісту InputStream
в String у Котліні, наприклад:
// 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()
Тоді ця функціональна складка:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Або поганий варіант, який не закриває InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Але всі вони незграбні, і я постійно знаходжу новіші та різні версії одного і того ж ... а деякі з них навіть не закривають InputStream
. Що таке неясний (ідіоматичний) спосіб читання InputStream
?
Примітка: це запитання навмисно написано та відповіло автором ( запитання з самовідповіддю ), так що ідіоматичні відповіді на поширені теми Котліна присутні в ТА.
use
абоuseLines
яка виконує функцію блоку щодо того, що "використовується". наприклад ,inputStream.useText { text -> ... }
З іншого боку, коли я прочитав «READTEXT» Я очікую , що функція , яка повертає текст:val inputAsString = inputStream.readText()
.