gpt4 book ai didi

inputstream - 在 Kotlin 中,如何将 InputStream 的全部内容读入字符串?

转载 作者:IT老高 更新时间:2023-10-28 13:26:06 37 4
gpt4 key购买 nike

我最近在 Kotlin 中看到了将 InputStream 的全部内容读入 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()
}

或不关闭 InputStreambad 变体:

val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()

但是它们都很笨重,我一直在寻找相同的更新和不同版本......其中一些甚至从未关闭 InputStream。什么是读取 InputStream 的非笨重(惯用)方式?

注意: 作者有意编写并回答了这个问题 (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

附带说明,所有需要知道 charset 的 Kotlin 扩展函数已经默认为 UTF-8,因此如果您需要不同的编码,则需要调整上面的代码在调用中包含 reader(charset)bufferedReader(charset) 的编码。

警告:您可能会看到更短的示例:

val inputAsString = input.reader().readText() 

但是这些不会关闭流。确保检查 API documentation for all of the IO functions你用来确定哪些关闭,哪些不关闭。通常,如果它们包含单词 use(例如 useLines()use()),它们会在之后关闭流。一个异常(exception)是 File.readText()不同于 Reader.readText()因为前者不会打开任何东西,而后者确实需要明确关闭。

另见: Kotlin IO related extension functions

关于inputstream - 在 Kotlin 中,如何将 InputStream 的全部内容读入字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39500045/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com