sequenceinputstream 是 java 中按顺序合并多个 inputstream 的工具类,支持 enumeration 或两个流构造,需手动管理流关闭,适合线性拼接场景。

SequenceInputStream 是 Java IO 中用于按顺序合并多个输入流的工具类,它把多个 InputStream 串成一个逻辑上的单一输入流,读取时依次从第一个流读完,再自动切换到下一个,直到全部读完。
核心用法:传入 Enumeration 或两个 InputStream
它主要有两种构造方式:
- 接收一个
Enumeration<inputstream></inputstream>(最常用,适合动态多个流) - 接收两个
InputStream(a 和 b),内部将 a 作为主流、b 作为后备流
推荐使用 Enumeration 方式,因为更灵活。Java 提供了 Collections.enumeration() 快速把 List<inputstream></inputstream> 转为 Enumeration。
典型合并步骤(以合并三个文件为例)
假设要合并 a.txt、b.txt、c.txt 的内容:
- 分别创建对应文件的
FileInputStream - 放入
ArrayList<inputstream></inputstream> - 用
Collections.enumeration(list)转成Enumeration - 传入
SequenceInputStream构造器 - 像普通流一样读取(如用
BufferedInputStream包装后逐字节或按块读)
注意:每个被合并的流需确保已打开且可读;SequenceInputStream 不会自动关闭它们,关闭责任在调用方(建议用 try-with-resources 分别关闭源流 + 合并流)。
读取行为与边界处理
它严格按顺序消费:只有当前流 read() 返回 -1(表示结束),才会切换到下一个流。因此:
- 中间某个流提前关闭或抛异常,会导致整个合并流中断
- 不会跳过空流,如果某流一开始就返回 -1,会立即进入下一个
- 不支持随机访问或倒回,只支持单向顺序读取
适合场景是“拼接日志片段”、“组合配置段落”等线性合并需求,不适合需要交叉读或条件跳过的复杂逻辑。
替代方案提醒(现代开发更推荐)
JDK 7+ 更推荐用 Files.lines() + Stream.concat() 处理文本合并;若需二进制合并,可用 ByteArrayOutputStream 手动写入多个流再转回 ByteArrayInputStream。而 SequenceInputStream 属于较老的 API,无自动资源管理,使用时需格外注意流的生命周期控制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











