在 Kotlin 中使用 BufferedReader 的最佳方式
Best way to use BufferedReader in Kotlin
所以我刚开始将 Kotlin 用于 Android,并将我的 Android Java 代码转换为 Kotlin。
在一次转换中,我偶然发现了一个 BufferedReader,我通常会在 Java 中编写如下:
String result = "";
String line = "";
BufferedReader reader = new BufferedReader(someStream);
while ( (line = reader.readLine()) != null ) {
result += line;
}
但是在Kotlin中,好像Kotlin不允许我在while条件下给变量赋值。
目前我写的代码如下:
val reader = BufferedReader(someStream)
var line : String? = ""
while (line != null) {
line = reader.readLine()
result += line
}
尽管使用了 Kotlin,但我并不觉得它很优雅,而且感觉上一代。
在 Kotlin 中使用 BufferedReader 的最佳方式是什么?
你可以像这样使用bufferedReader
val allText = inputStream.bufferedReader().use(BufferedReader::readText)
如果您仍然想逐行阅读它,您可以使用标准库中的一些扩展函数并按如下方式进行:
val reader = someStream.bufferedReader()
val iterator = reader.linesSequences().iterator()
while(iterator.hasNext()) {
val line = iterator.next()
// do something with line...
}
reader.close()
或者,使用 "functional" 方法:
val reader = someStream.bufferedReader()
reader.useLines {
it.map { line -> // do something with line }
}
通过使用 useLines,您无需在 reader 上显式调用 close,useLines 扩展函数将为您完成!
只是添加那些以供参考..干杯
像这样使用代码
val input = conn.inputStream
val allText = input.bufferedReader().use(BufferedReader::readText)
val result = StringBuilder()
result.append(allText)
return result.toString()
} else {
return "unsuccessful"
}
另一种方法是使用 for 循环:
val reader = BufferedReader(someStream)
for (line in reader.lines()) {
println(line)
}
虽然它不像接受的答案那么简洁,但它允许您循环并执行某种逻辑,而无需将所有内容都抽到一个字符串中,如下所示
val allText: String = inputStream.bufferedReader().use(BufferedReader::readText)
感谢 João Gonçalves 对 stdlib 的引用,我发现如果需要,您可以使用 forEachLine 遍历 reader。
您也可以尝试使用"forEachLine"方法。
val file = File("./folder/test.txt")
file.bufferedReader().forEachLine {
println("value = $it")
}
它也会在阅读最后一行后自动关闭流
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-reader/index.html
fun Reader.forEachLine(action: (String) -> Unit)
Iterates through each
line of this reader, calls action for each line read and closes the
Reader when it's completed.
当流有多行时,接受的答案失败。这是我的解决方案
val allText = inputStream.bufferedReader().use { it.readLines().joinToString("") }
您可以像这样使用 BufferReader :
val data = inputStream.bufferedReader().use(BufferedReader::readText)
所以我刚开始将 Kotlin 用于 Android,并将我的 Android Java 代码转换为 Kotlin。
在一次转换中,我偶然发现了一个 BufferedReader,我通常会在 Java 中编写如下:
String result = "";
String line = "";
BufferedReader reader = new BufferedReader(someStream);
while ( (line = reader.readLine()) != null ) {
result += line;
}
但是在Kotlin中,好像Kotlin不允许我在while条件下给变量赋值。
目前我写的代码如下:
val reader = BufferedReader(someStream)
var line : String? = ""
while (line != null) {
line = reader.readLine()
result += line
}
尽管使用了 Kotlin,但我并不觉得它很优雅,而且感觉上一代。
在 Kotlin 中使用 BufferedReader 的最佳方式是什么?
你可以像这样使用bufferedReader
val allText = inputStream.bufferedReader().use(BufferedReader::readText)
如果您仍然想逐行阅读它,您可以使用标准库中的一些扩展函数并按如下方式进行:
val reader = someStream.bufferedReader()
val iterator = reader.linesSequences().iterator()
while(iterator.hasNext()) {
val line = iterator.next()
// do something with line...
}
reader.close()
或者,使用 "functional" 方法:
val reader = someStream.bufferedReader()
reader.useLines {
it.map { line -> // do something with line }
}
通过使用 useLines,您无需在 reader 上显式调用 close,useLines 扩展函数将为您完成!
只是添加那些以供参考..干杯
像这样使用代码
val input = conn.inputStream val allText = input.bufferedReader().use(BufferedReader::readText) val result = StringBuilder() result.append(allText) return result.toString() } else { return "unsuccessful" }
另一种方法是使用 for 循环:
val reader = BufferedReader(someStream)
for (line in reader.lines()) {
println(line)
}
虽然它不像接受的答案那么简洁,但它允许您循环并执行某种逻辑,而无需将所有内容都抽到一个字符串中,如下所示
val allText: String = inputStream.bufferedReader().use(BufferedReader::readText)
感谢 João Gonçalves 对 stdlib 的引用,我发现如果需要,您可以使用 forEachLine 遍历 reader。
您也可以尝试使用"forEachLine"方法。
val file = File("./folder/test.txt")
file.bufferedReader().forEachLine {
println("value = $it")
}
它也会在阅读最后一行后自动关闭流
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-reader/index.html
fun Reader.forEachLine(action: (String) -> Unit)
Iterates through each line of this reader, calls action for each line read and closes the Reader when it's completed.
当流有多行时,接受的答案失败。这是我的解决方案
val allText = inputStream.bufferedReader().use { it.readLines().joinToString("") }
您可以像这样使用 BufferReader :
val data = inputStream.bufferedReader().use(BufferedReader::readText)