最佳答案
最近,我在 Kotlin 看到了将 InputStream
的全部内容读入字符串的代码,例如:
// 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
的非笨拙(惯用)方法?
注: < em > 这个问题是作者(自我回答的问题)有意写作和回答的,因此常见的科特林问题的惯用答案在 SO 中出现。