在Kotlin中使用BufferedReader的最佳方法

Aki*_*ido 26 java bufferedreader kotlin

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

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

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

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

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

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

尽管使用了Kotlin,但我并不觉得这么优雅而且感觉很流行.

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

mie*_*sol 56

您可以使用bufferedReader像这样

val allText = inputStream.bufferedReader().use(BufferedReader::readText)
Run Code Online (Sandbox Code Playgroud)

  • 说明:https://kotlinlang.org/docs/reference/idioms.html#java-7s-try-with-resources (2认同)

小智 16

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

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

或者,使用"功能"方法:

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

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

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


Ang*_*Koh 13

您也可以尝试使用“forEachLine”方法。

val file = File("./folder/test.txt")
file.bufferedReader().forEachLine {
    println("value = $it")
} 
Run Code Online (Sandbox Code Playgroud)

它还会在阅读最后一行后自动关闭流

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-reader/index.html

fun Reader.forEachLine(action: (String) -> Unit)
遍历此读取器的每一行,为读取的每一行调用操作并在完成时关闭读取器。


Chr*_*hie 5

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

val reader = BufferedReader(someStream)
for (line in reader.lines()) {
    println(line)
}
Run Code Online (Sandbox Code Playgroud)

虽然它不像公认的答案那么简洁,但它允许您循环并执行某种逻辑,而无需将所有内容都放入一个字符串中,如下所示

val allText: String = inputStream.bufferedReader().use(BufferedReader::readText)
Run Code Online (Sandbox Code Playgroud)

  • 请注意:您可以使用 useLines() 方法迭代行,该方法返回一个惰性 Sequence<String> 并随后为您关闭底层 BufferedReader。 (2认同)