sequenceinputstream可顺序读取多个inputstream,需先创建fileinputstream等流并用vector包装成enumeration传入;它自动切换流,读完前一个再读下一个;关闭时仅关闭当前流,建议手动管理底层流生命周期。

SequenceInputStream 可以按顺序读取多个 InputStream,关键在于用 Enumeration 包装一组流对象。它本身不负责打开文件,需要你先创建好 FileInputStream(或其他 InputStream),再统一交给 SequenceInputStream 管理。
准备多个 FileInputStream
先为每个目标文件创建独立的 FileInputStream。注意:这些流会在 SequenceInputStream 读取时被依次使用,前一个读完才切换到下一个,所以必须确保它们都有效且未关闭。
- 推荐用 try-with-resources 管理单个流的生命周期,但不要在这里直接关闭——SequenceInputStream 需要它们保持打开状态
- 可以存入 List 或 Vector,便于后续转为 Enumeration
用 Vector 构造 Enumeration
SequenceInputStream 的构造方法只接受 Enumeration
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Vector 是线程安全的,且自带 elements() 方法返回 Enumeration
- 代码示例:
Vectorstreams = new Vector();
streams.add(new FileInputStream("a.txt"));
streams.add(new FileInputStream("b.txt"));
streams.add(new FileInputStream("c.txt"));
Enumerationen = streams.elements();
创建并使用 SequenceInputStream
传入 Enumeration 后,SequenceInputStream 就能按顺序读取所有流内容。它内部维护当前流指针,读到末尾自动切换下一个:
- 读取行为完全透明:调用 read() 或 read(byte[]) 时,自动从第一个流开始,读完再取第二个,直到全部结束或发生异常
- 关闭 SequenceInputStream 会自动关闭当前正在读的流(JDK 9+),但不会关闭其他未读的流;建议手动管理底层流的关闭,或在 finally 块中统一 close
- 示例:
try (SequenceInputStream sis = new SequenceInputStream(en)) {
int b;
while ((b = sis.read()) != -1) {
System.out.write(b);
}
}
替代方案:双参数构造器(更简洁)
如果只有两个流,可以直接用双参数构造器,避免构造 Enumeration:
- new SequenceInputStream(is1, is2) —— is1 读完后自动接 is2
- 多个流时可嵌套使用:
new SequenceInputStream(is1, new SequenceInputStream(is2, is3)) - 这种方式逻辑清晰、无需 Vector,适合流数量固定且不多的场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










