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.
sumber
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()
.use
fungsi dalam hal itu. setidaknya dalam konteks Tanya Jawab ini. mungkin kata kerja baru dapat ditemukan ...readTextAndClose()
contoh ini untuk menghindari konflik denganreadText()
pola tidak menutup, dan denganuse
pola yang menginginkan lambda, karena saya tidak mencoba memperkenalkan fungsi stdlib baru, saya tidak ingin melakukan lebih dari sekadar menjelaskan tentang penggunaan ekstensi untuk menghemat tenaga kerja di masa depan.Contoh yang membaca konten InputStream ke String
Untuk Referensi - Baca File Kotlin
sumber
Paths.get()
metode. 2) Untuk streaming - fitur coba-sumber daya (Dalam kotlin: .use {})