SequenceInputStream 是 Java 中按顺序合并多个输入流的工具类,内部维护枚举并自动切换流,读完一个再读下一个,不缓冲、不并发,需手动关闭各子流,支持两种构造方式且不支持 mark/reset。

SequenceInputStream 是 Java IO 中专门用于按顺序合并多个输入流的工具类,它把多个 InputStream 串成一个逻辑上的单一输入流,读取时自动从第一个流读完再切换到下一个,无需手动管理切换逻辑。
核心工作原理:按序串联,自动移交
它内部维护一个 Enumeration(或两个流的构造方式),每次调用 read() 时:
- 优先从当前活跃的输入流读取字节
- 若当前流返回 -1(已结束),则自动获取下一个流继续读
- 所有流都耗尽后,才返回 -1,标志整个 SequenceInputStream 结束
注意:它不缓冲、不预读、不并发,纯线性顺序消费,适合拼接日志片段、分段资源等场景。
两种常用构造方式
① SequenceInputStream(Enumeration
适用于动态数量的流,需提前封装为 Vector 或其他支持 elements() 的集合:
v.add(new FileInputStream("a.txt"));
v.add(new FileInputStream("b.txt"));
SequenceInputStream sis = new SequenceInputStream(v.elements());
② SequenceInputStream(InputStream s1, InputStream s2)
适合固定两个流的简单合并,底层会将它们包装成双元素枚举,更轻量。
使用注意事项
- 每个被合并的流需由调用方自行打开,SequenceInputStream 不负责关闭子流;建议在 finally 或 try-with-resources 中单独关闭各原始流
- 如果某个中间流抛出异常(如 IOException),该异常会直接向上抛出,后续流不会被读取
- 不支持 mark/reset,因为无法跨流维护标记位置
- 性能上无额外开销,但要注意流的阻塞行为——例如第二个流是网络流,读到它时才会真正发起连接
替代方案提醒
Java 8+ 更推荐用 Stream + 自定义迭代器,或借助第三方库(如 Apache Commons IO 的 CompositeInputStream);若需并行合并或格式转换,应考虑 NIO 的 Channels.newInputStream() 配合 ByteBuffer 手动组装。
立即学习“Java免费学习笔记(深入)”;
基本上就这些。SequenceInputStream 机制简单直接,关键在理解它的“顺序”和“不可逆”特性,用对了很省心,用错了容易漏关流或误判 EOF。










