在Kotlin中使用BufferedReader的最佳方法

问题描述 投票:19回答:6

所以我刚开始使用Kotlin for Android,并将我的Android Java代码转换为Kotlin。

在其中一次转换中,我偶然发现了一个BufferedReader,我通常用Java编写如下:

String result = "";
String line = "";
BufferedReader reader = new BufferedReader(someStream);
while ( (line = reader.readLine()) != null ) {
    result += line;
}

但是在Kotlin中,似乎Kotlin不允许我在条件的同时为变量赋值。

目前,我已经编写了如下代码:

val reader = BufferedReader(someStream)
var line : String? = ""
while (line != null) {
    line = reader.readLine()
    result += line
}

虽然使用Kotlin,但我发现它并不那么优雅并且感觉很流行。

在Kotlin中使用BufferedReader的最佳方法是什么?

java bufferedreader kotlin
6个回答
49
投票

您可以像这样使用bufferedReader

val allText = inputStream.bufferedReader().use(BufferedReader::readText)

10
投票

如果您仍想逐行阅读,可以使用std lib中的一些扩展函数,并按如下方式执行:

val reader = someStream.bufferedReader()
val iterator = reader.linesSequences().iterator()
while(iterator.hasNext()) {
    val line = iterator.next()
    // do something with line...
}
reader.close()

或者,使用“功能”方法:

val reader = someStream.bufferedReader()
reader.useLines {
    it.map { line -> // do something with line }
}

通过使用useLines,您不需要在阅读器上显式调用close,useLines扩展函数将为您完成!

只是添加那些参考..干杯


1
投票

感谢JoãoGonçalves对stdlib的引用我发现如果需要你可以使用forEachLine来遍历读者。


1
投票

您也可以尝试使用“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

有趣的Reader.forEachLine(动作:(String) - >单位) 迭代读取器的每一行,调用每行读取的操作,并在读取器完成时关闭读取器。


0
投票

使用这样的代码


    val input = conn.inputStream
    val allText = input.bufferedReader().use(BufferedReader::readText)
    val result = StringBuilder()                   

    result.append(allText)
    return result.toString()

    } else {

    return "unsuccessful"

    }


0
投票

另一种方法是使用for循环:

val reader = BufferedReader(someStream)
for (line in reader.lines()) {
    println(line)
}

虽然它不像接受的答案那样简洁,但它允许你循环并执行某种逻辑而不将所有内容都抽成一个字符串,如下所示

val allText: String = inputStream.bufferedReader().use(BufferedReader::readText)
© www.soinside.com 2019 - 2024. All rights reserved.