sequenceinputstream 是 java 中按顺序串联多个 inputstream 的工具类,先读完第一个流再自动切换至下一个,支持双流构造或 enumeration 构造,但不自动关闭子流且不支持 mark/reset。

SequenceInputStream 是 Java 中用于按顺序串联多个 InputStream 的工具类,它把多个输入流“首尾相接”,对外表现为一个连续的输入流。读取时会先读完第一个流,再自动切换到第二个,依此类推,直到所有流都耗尽。
核心用法:构造方式
它有两种常用构造方式:
- 传入两个
InputStream:适合明确只有两个流要合并 - 传入一个
Enumeration<inputstream></inputstream>:更通用,适用于任意数量的流(常配合Vector或Collections.enumeration()使用)
典型示例:合并三个字节数组输入流
以下代码演示如何将三个 ByteArrayInputStream 拼接成一个可顺序读取的流:
import java.io.*;
import java.util.*;
byte[] data1 = "Hello".getBytes();
byte[] data2 = " World".getBytes();
byte[] data3 = "!".getBytes();
InputStream is1 = new ByteArrayInputStream(data1);
InputStream is2 = new ByteArrayInputStream(data2);
InputStream is3 = new ByteArrayInputStream(data3);
// 将多个流放入 Vector,并转为 Enumeration
Vector<inputstream> vector = new Vector();
vector.add(is1);
vector.add(is2);
vector.add(is3);
SequenceInputStream sis = new SequenceInputStream(vector.elements());
// 读取全部内容
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b;
while ((b = sis.read()) != -1) {
baos.write(b);
}
System.out.println(baos.toString()); // 输出:Hello World!
</inputstream>
注意事项和常见问题
使用时需注意几点:
- 每个被合并的流**必须独立打开且未关闭**;
SequenceInputStream不会自动关闭它们,需在外部手动管理生命周期 - 一旦某个流读到末尾(
read()返回-1),它会自动切换到下一个流;若所有流都已结束,则整体返回-1 - 不支持
mark()和reset()(除非底层流本身支持且你自行包装处理) - 如果中间某个流抛出异常(如 IOException),整个读取过程会中断,后续流不会被读取
现代替代方案(Java 8+)
虽然 SequenceInputStream 仍可用,但更推荐使用函数式方式组合流,例如:
- 用
InputStream.concat()(Java 19+ 引入的静态方法,最简洁) - 用
java.nio.channels.Channels+Stream<inputstream></inputstream>+Collectors.collectingAndThen自定义拼接(需额外封装) - 对小数据量,直接合并字节数组再创建
ByteArrayInputStream更简单高效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











