Saya baru-baru ini melihat kode untuk membaca seluruh konten an InputStream
menjadi String di Kotlin, seperti:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
Dan juga:
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()
}
Dan bahkan ini yang terlihat lebih halus karena menutup otomatis InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
Atau sedikit variasi yang satu itu:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
Kemudian lipat fungsional ini:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Atau variasi buruk yang tidak menutup InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Tapi mereka semua kikuk dan saya terus menemukan versi yang lebih baru dan berbeda dari yang sama ... dan beberapa dari mereka bahkan tidak pernah menutup InputStream
. Apa cara non-kikuk (idiomatik) untuk membaca InputStream
?
Catatan: pertanyaan ini sengaja ditulis dan dijawab oleh penulis ( Pertanyaan yang Dijawab Sendiri ), sehingga jawaban idiomatis untuk topik Kotlin yang sering ditanyakan ada di SO.
use
atauuseLines
yang menjalankan fungsi blok pada apa yang sedang "digunakan". misalnyainputStream.useText { text -> ... }
Di sisi lain, ketika saya membaca "readText" Saya berharap fungsi yang mengembalikan teks:val inputAsString = inputStream.readText()
.