在Kotlin中使用BufferedReader的最佳方式

umuewwlo  于 2022-11-30  发布在  Kotlin
关注(0)|答案(9)|浏览(208)

所以我刚刚开始使用Kotlinfor 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
}

我不觉得它很优雅,感觉像是prev-gen,尽管使用了Kotlin。
在Kotlin中使用BufferedReader的最佳方式是什么?

2jcobegt

2jcobegt1#

您可以像这样使用bufferedReader

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

63lcw9qa2#

如果你仍然想逐行读取它,你可以使用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扩展函数将为您执行此操作!
只是添加这些作为参考..干杯

8ljdwjyq

8ljdwjyq3#

您也可以尝试使用“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
有趣的阅读器。forEachLine(操作:(字符串)-〉单位)
循环访问此读取器的每一行,为读取的每一行调用操作,并在完成时关闭读取器。

ldioqlga

ldioqlga4#

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

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

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

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

5lwkijsr5#

多亏了João Gonçalves对stdlib的引用,我发现如果需要的话,可以使用forEachLine遍历阅读器。

iqxoj9l9

iqxoj9l96#

使用如下代码

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

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

    } else {

    return "unsuccessful"

    }
bt1cpqcv

bt1cpqcv7#

当流有多行时,接受的答案失败。这是我的解决方案

val allText = inputStream.bufferedReader().use { it.readLines().joinToString("") }
3bygqnnd

3bygqnnd8#

您可以像这样使用BufferReader:

val data = inputStream.bufferedReader().use(BufferedReader::readText)
enxuqcxy

enxuqcxy9#

此解决方案在每行后包含字符\n

val fileInputStream = context.openFileInput(fileName)
val reader = BufferedReader(InputStreamReader(fileInputStream))
val line = reader.buffered().use { it.readText() }

相关问题