SequenceInputStream 是 Java 中按顺序串联多个 InputStream 的工具类,将多个流视为一个逻辑连续流;核心用法是通过 Enumeration 包装多个流,不支持直接传入流数组或列表。

SequenceInputStream 是 Java 中用于按顺序串联多个输入流的工具类,它把多个 InputStream 当作一个逻辑上的连续流来读取——前一个流读完自动切换到下一个,直到全部结束。
核心用法:用 Enumeration 包装多个流
它不直接接受流数组或列表,而是要求传入一个 Enumeration extends InputStream>。常用构造方式有两种:
- 用
Vector<InputStream>的elements()方法生成枚举(最常见) - 手动实现
Enumeration接口(极少用)
示例代码:
Vector<InputStream> streams = new Vector<>();
streams.add(new FileInputStream("file1.txt"));
streams.add(new FileInputStream("file2.txt"));
streams.add(new ByteArrayInputStream("Hello".getBytes()));
SequenceInputStream seq = new SequenceInputStream(streams.elements());
// 后续像普通 InputStream 一样 read()、close() 即可
注意 close() 行为:只关自身,不关内部流
SequenceInputStream.close() 不会自动关闭它串联的各个子流。 这是关键细节,容易导致资源泄漏。
立即学习“Java免费学习笔记(深入)”;
- 如果你用的是文件流(如
FileInputStream),必须在使用完seq后,单独调用每个子流的close() - 推荐做法:用 try-with-resources 分别包裹每个子流,或在 finally 块中统一关闭
替代方案:Java 8+ 更简洁的写法
虽然 SequenceInputStream 仍可用,但现代 Java 更倾向组合式处理:
- 用
Stream<byte[]>+ByteArrayInputStream手动拼接字节数组(适合小数据) - 用
java.nio.channels.Channels.newInputStream()配合ByteBuffer或Files.readAllBytes()合并后再创建流 - 第三方库如 Apache Commons IO 提供
MultiInputStream(自动关闭子流,更安全)
适用场景与限制
它适合“顺序拼接、一次读完”的简单合并需求,比如日志分片、多段网络响应体组装。
- 不支持随机访问或倒退读取
- 无法跳过某个子流,也不能动态增删流
- 若某子流中途抛异常,后续流不会被读取


















