Java里SequenceInputStream如何合并多个流_Java IO流合并机制说明

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

SequenceInputStream 是 Java IO 中专门用于按顺序合并多个输入流的工具类,它把多个 InputStream 串成一个逻辑上的单一输入流,读取时自动从第一个流读完再切换到下一个,无需手动管理切换逻辑。

核心工作原理:按序串联,自动移交

它内部维护一个 Enumeration(或两个流的构造方式),每次调用 read() 时:

  • 优先从当前活跃的输入流读取字节
  • 若当前流返回 -1(已结束),则自动获取下一个流继续读
  • 所有流都耗尽后,才返回 -1,标志整个 SequenceInputStream 结束

注意:它不缓冲、不预读、不并发,纯线性顺序消费,适合拼接日志片段、分段资源等场景。

两种常用构造方式

SequenceInputStream(Enumeration e) 适用于动态数量的流,需提前封装为 Vector 或其他支持 elements() 的集合:

Vector v = new Vector();
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 手动组装。

基本上就这些。SequenceInputStream 机制简单直接,关键在理解它的“顺序”和“不可逆”特性,用对了很省心,用错了容易漏关流或误判 EOF。