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

SequenceInputStream 是 Java 中用于按顺序串联多个输入流的工具类,它把多个 InputStream 当作一个逻辑上的单一输入流来读取,数据会先读完第一个流,再自动切换到第二个,依此类推。
核心用法:传入 Enumeration 或两个 InputStream
它主要有两种构造方式:
- 接收一个
Enumeration extends InputStream>—— 适合动态数量的流(如从集合生成) - 接收两个
InputStream(in1,in2)—— 适合固定两个流,内部会递归包装成链式结构
注意:它本身不关闭底层流,需手动管理资源;也不支持标记/重置(mark()/reset())操作。
合并多个文件流的典型示例
比如要把 a.txt、b.txt、c.txt 的内容按顺序拼接读取:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
InputStream a = new FileInputStream("a.txt");
InputStream b = new FileInputStream("b.txt");
InputStream c = new FileInputStream("c.txt");
// 将多个流放入 Vector(实现 Enumeration 接口)
Vector<inputstream> streams = new Vector();
streams.add(a);
streams.add(b);
streams.add(c);
SequenceInputStream seq = new SequenceInputStream(streams.elements());
// 使用后记得分别关闭每个原始流(或用 try-with-resources 分别声明)
int b;
while ((b = seq.read()) != -1) {
System.out.write(b);
}
seq.close(); // 注意:这不会关闭 a/b/c,必须单独关
a.close(); b.close(); c.close();
</inputstream>
更安全的写法:配合 try-with-resources
由于 SequenceInputStream 不自动关闭子流,推荐显式管理每个流的生命周期:
InputStream a = new FileInputStream("a.txt");
InputStream b = new FileInputStream("b.txt");
InputStream c = new FileInputStream("c.txt");
try (SequenceInputStream seq = new SequenceInputStream(
new Enumeration<inputstream>() {
private final Iterator<inputstream> it = List.of(a, b, c).iterator();
public boolean hasMoreElements() { return it.hasNext(); }
public InputStream nextElement() { return it.next(); }
})) {
// 读取所有内容
seq.transferTo(System.out); // Java 9+ 简化输出
} finally {
// 显式关闭原始流(或在 try-with-resources 中一并声明)
a.close(); b.close(); c.close();
}
</inputstream></inputstream>
也可以把每个 FileInputStream 都放进 try-with-resources 括号里,确保它们一定被关闭。
替代方案建议(Java 8+ 更推荐)
如果只是合并文件内容,现代 Java 更倾向使用 NIO.2 和流式 API:
- 用
Files.lines()+Stream.concat()处理文本行 - 用
Files.readAllBytes()读取字节数组再合并(适合小文件) - 自定义
InputStream子类或用第三方库(如 Apache Commons IO 的CompositeInputStream)增强功能
SequenceInputStream 是较老的 API,功能简单,在需要严格按序、低内存占用、且不想一次性加载全部数据时仍有价值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










