我最近看到了用于读取 InputStream
在Kotlin中入String的,例如:
// 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()
。