我最近在 Kotlin 中看到了将 Dòng đầu vào
的全部内容读入 String 的代码,例如:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
还有:
val reader = BufferedReader(InputStreamReader(input))
thử {
val results = StringBuilder()
trong khi (đúng) {
val line = reader.readLine()
if (line == null) break
results.append(line)
}
val inputAsString = results.toString()
} Cuối cùng {
reader.close()
}
即使这样看起来也更流畅,因为它会自动关闭 Dòng đầu vào
:
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()
}
或不关闭 Dòng đầu vào
của bad 变体:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
但是它们都很笨重,我一直在寻找相同的更新和不同版本......其中一些甚至从未关闭 Dòng đầu vào
。什么是读取 Dòng đầu vào
的非笨重(惯用)方式?
Để ý: 作者有意编写并回答了这个问题 (Self-Answered Questions ),因此常见的 Kotlin 主题的惯用答案出现在 SO 中。
Kotlin 有一个专门用于此目的的扩展。
最简单的:
val inputAsString = input.bufferedReader().use { it.readText() } // defaults to UTF-8
在此示例中,您可以在 bufferedReader()
或仅 reader()
之间做出选择。函数调用Closeable.use()
将在 lambda 执行结束时自动关闭输入。
进一步阅读:
如果你经常做这种事情,你可以把它写成一个扩展函数:
fun InputStream.readTextAndClose(charset: Charset = Charsets.UTF_8): String {
return this.bufferedReader(charset).use { it.readText() }
}
然后您可以轻松调用:
val inputAsString = input.readTextAndClose() // defaults to UTF-8
附带说明,所有需要知道 bộ ký tự
的 Kotlin 扩展函数已经默认为 UTF-8
,因此如果您需要不同的编码,则需要调整上面的代码在调用中包含 reader(charset)
hoặc bufferedReader(charset)
的编码。
cảnh báo:您可能会看到更短的示例:
val inputAsString = input.reader().readText()
但是这些不会关闭流。确保检查 API documentation for all of the IO functions你用来确定哪些关闭,哪些不关闭。通常,如果它们包含单词 sử dụng
(例如 useLines()
hoặc use()
),它们会在之后关闭流。一个异常(exception)是 File.readText()
不同于 Reader.readText()
因为前者不会打开任何东西,而后者确实需要明确关闭。
另见: Kotlin IO related extension functions
Tôi là một lập trình viên xuất sắc, rất giỏi!