sequenceinputstream 是 java 中按顺序串联多个 inputstream 的工具类,构造支持两个流或 enumeration,不自动关闭底层流,需手动管理资源,适用于静态有序数据拼接。

SequenceInputStream 是 Java IO 中用于按顺序串联多个输入流的工具类,它把多个 InputStream 当作一个逻辑上的单一输入流来读取,前一个流读完自动切换到下一个,直到全部结束。
核心用法:构造时传入输入流集合
创建 SequenceInputStream 有两种常见方式:
- 传入两个
InputStream(旧式构造方法,适用于少量流) - 传入一个
Enumeration<inputstream></inputstream>(推荐,更灵活,支持任意数量)
注意:它本身不负责关闭底层流,需自行管理资源;且所有流必须按预期顺序准备好,它不会跳过或重试失败的流。
使用 Enumeration 包装多个 InputStream
Java 中常用 Vector 或 Collections.enumeration() 构造 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 sis = new SequenceInputStream(streams.elements());
// 后续像普通 InputStream 一样 read()
int b;
while ((b = sis.read()) != -1) {
System.out.print((char) b);
}
sis.close(); // 注意:只关闭 SequenceInputStream,不自动关闭内部流
</inputstream>
务必在使用后手动关闭每个原始输入流(或用 try-with-resources 分别包裹),否则可能泄漏文件句柄。
配合 try-with-resources 安全释放资源
由于 SequenceInputStream 不实现 AutoCloseable 的递归关闭,推荐显式管理各流生命周期:
List<inputstream> list = Arrays.asList(
new FileInputStream("a.txt"),
new FileInputStream("b.txt")
);
// 分别关闭每个流
try (SequenceInputStream sis = new SequenceInputStream(
Collections.enumeration(list))) {
// 读取逻辑...
sis.transferTo(System.out); // Java 9+ 示例
} finally {
for (InputStream is : list) {
if (is != null) is.close();
}
}
</inputstream>
也可用第三方工具类(如 Apache Commons IO 的 MultiInputStream)替代,它支持自动关闭,但标准库中需自行处理。
适用场景与注意事项
适合拼接静态、已知顺序的多个数据源,比如:
- 合并多个配置文件内容
- 将模板 + 用户数据 + 尾部说明拼成完整响应流
- 测试中模拟分段加载的字节流
不适合动态增删流或需要随机访问的场景;若某中间流抛出异常,后续流不会被读取;也不支持标记(mark/reset)操作,因为无法跨流保持位置一致性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











