Kotlin大文件过滤行输出为单流时StackOverFlow异常如何解决
解决方案
核心思路是避免SequenceInputStream的深层嵌套,直接调用其接收Enumeration参数的构造方法,全程保持流式处理,不会加载全量文件数据到内存。
实现代码
import java.io.File import java.io.InputStream import java.io.SequenceInputStream import java.util.Enumeration fun getFilteredFileStream(filename: String): InputStream { // 原有的行处理逻辑保持不变 val lineStreamIterator = File(filename).bufferedReader() .lineSequence() .filter { meetsSomeCondition(it) } .map { (it + "\n").byteInputStream() } .iterator() // 将Kotlin迭代器适配为Enumeration接口,无需预加载所有流实例 val streamEnumeration = object : Enumeration<InputStream> { override fun hasMoreElements(): Boolean = lineStreamIterator.hasNext() override fun nextElement(): InputStream = lineStreamIterator.next() } return SequenceInputStream(streamEnumeration) }
原理解析
Enumeration是一个极简易的迭代接口,不需要提前把所有元素加载到集合中,我们只需要做一层简单的接口适配,就能把Kotlin序列的迭代能力直接暴露给SequenceInputStream,全程都是按需读取,内存占用始终维持在常量级别。- 这种实现方式彻底避免了原来用
reduce嵌套SequenceInputStream的问题,无论文件多大都不会出现栈溢出异常,完全符合你要求的全程以Stream/Sequence形式操作、返回单个stream/sequence的需求。
可选优化
如果对性能要求更高,可以避免为每一行单独生成ByteArrayInputStream,直接自定义InputStream实现类在字节流层面完成过滤逻辑,进一步降低对象创建开销,上述实现已经可以稳定解决你当前遇到的问题。
内容的提问来源于stack exchange,提问作者J-bob
相关产品推荐
相关产品推荐

