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)}}
(正确的解决方案应该每秒打印一行罚款)