Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 将输入流转换为流_Kotlin_Kotlin Coroutines_Kotlin Flow_Kotlin Coroutines Flow - Fatal编程技术网

Kotlin 将输入流转换为流

Kotlin 将输入流转换为流,kotlin,kotlin-coroutines,kotlin-flow,kotlin-coroutines-flow,Kotlin,Kotlin Coroutines,Kotlin Flow,Kotlin Coroutines Flow,我想读取一个文件的内容,并为它的每一行内容发出一个流。因此,我必须实现一个具有以下签名的函数: fun InputStream.linesToFlow():Flow 有没有办法实现此功能?您可以这样做 fun InputStream.linesToFlow(): Flow<String> = channelFlow<String> { reader().forEachLine { line -> offer(line) } }

我想读取一个文件的内容,并为它的每一行内容发出一个流。因此,我必须实现一个具有以下签名的函数:

fun InputStream.linesToFlow():Flow
有没有办法实现此功能?

您可以这样做

fun InputStream.linesToFlow(): Flow<String> = channelFlow<String> {
    reader().forEachLine { line -> 
        offer(line)
    }
}
fun InputStream.linesToFlow():Flow=channelFlow{
reader().forEachLine{line->
报价(行)
}
}

我还找到了以下解决方案:

fun InputStream.linesToFlow()=bufferedReader().lineSequence().asFlow().floon(Dispatchers.IO)

您可能希望在末尾添加
.flow(Dispatchers.IO)
,以确保它不会意外地阻塞一些有用的线程。我在kotlin slack中也看到了这一建议。但我想写一个更好的理由。你能描述一下为什么需要将它作为文档放在这里吗?创建一个scratch项目,并尝试按照以下要点运行代码:现在,添加
.flowOn(Dispatchers.IO)
,看看它有什么区别。当收集器运行缓慢时,它会删除行。拿一些文本文件,看看如果执行
文件(“text.txt”).inputStream()会发生什么。使用{it.linesToFlow{line->println(line);delay(1000)}}
(正确的解决方案应该每秒打印一行罚款)