我最近看到的代码读取InputStream
的全部内容复制到在科特林一个字符串,如:在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
?
注:这个问题是故意写的,并回答了作者(Self-Answered Questions),从而使惯用解答常见科特林主题存在于SO。
我觉得 “READTEXT” 会比一个更好的名字“useText”用于您提出的扩展功能。当我读取“useText”时,我期望有一个像use或useLines这样的函数,它对正在使用的内容执行块函数。例如'inputStream.useText {text - > ...}另一方面,当我读取“readText”时,我期待一个返回文本的函数:'val inputAsString = inputStream.readText()'。 – mfulton26
确实如此,但readText已经有错误的含义,所以想要表示它更像是在这方面的'使用'功能。至少在这个问答环境中。也许可以找到一个新的动词...... –
@ mfulton26为了避免与'readText()'不关闭的模式冲突,并且''use''模式想要一个lambda,我使用'readTextAndClose我不想介绍一个新的stdlib函数,我不想做更多关于使用扩展来保存未来劳动力的观点。 –