최근 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
무엇입니까?
참고 : 이 질문은 작성자 ( Self-Answered Questions ) 가 의도적으로 작성하고 답변 하므로 일반적으로 묻는 Kotlin 주제에 대한 관용적 답변이 SO에 있습니다.
use
하거나 같은 함수를 기대합니다useLines
. 예를 들어inputStream.useText { text -> ... }
"readText"를 읽을 때 텍스트를 반환하는 함수를 기대합니다val inputAsString = inputStream.readText()
..