Gần đây tôi đã thấy mã để đọc toàn bộ nội dung của InputStream
một chuỗi trong Kotlin, chẳng hạn như:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
Và ngoài ra:
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()
}
Và thậm chí điều này trông mượt mà hơn vì nó tự động đóng InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
Hoặc biến thể nhỏ trên cái đó:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
Sau đó, điều này gấp chức năng:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Hoặc một biến thể xấu không đóng InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Nhưng tất cả chúng đều rất khó hiểu và tôi tiếp tục tìm các phiên bản mới hơn và khác nhau của cùng một phiên bản ... và một số trong số chúng thậm chí không bao giờ đóng lại InputStream
. Cách đọc không rườm rà (thành ngữ) là InputStream
gì?
Lưu ý: câu hỏi này được tác giả viết và trả lời có chủ ý ( Câu hỏi tự trả lời ), vì vậy các câu trả lời thành ngữ cho các chủ đề Kotlin thường được hỏi đều có trong SO.
use
hoặcuseLines
thực thi một hàm khối trên những gì đang được "sử dụng". ví dụ nhưinputStream.useText { text -> ... }
Mặt khác, khi tôi đọc "readText" Tôi mong đợi một chức năng mà trả về văn bản:val inputAsString = inputStream.readText()
.