ฉันเพิ่งเห็นรหัสสำหรับอ่านเนื้อหาทั้งหมดของInputStream
สตริงใน 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()
จากนั้นพับที่ใช้งานได้นี้:
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
คืออะไร?
หมายเหตุ: คำถามนี้เขียนและตอบโดยผู้เขียนโดยเจตนา ( คำถามที่ตอบด้วยตนเอง ) เพื่อให้คำตอบสำนวนสำหรับหัวข้อ Kotlin ที่ถามบ่อยมีอยู่ใน SO
use
หรือuseLines
ที่เรียกใช้ฟังก์ชันบล็อกกับสิ่งที่ "ใช้" อยู่ เช่นinputStream.useText { text -> ... }
บนมืออื่น ๆ เมื่อฉันอ่าน "readText"val inputAsString = inputStream.readText()
ผมคาดหวังว่าฟังก์ชั่นซึ่งจะส่งกลับข้อความ: