sequenceinputstream 是 java 中按顺序串联多个 inputstream 的工具类,内部通过 enumeration 维护流队列,读完一个自动切换下一个;支持 enumeration 或双流构造,但不负责关闭流且不支持 mark/reset。

SequenceInputStream 是 Java IO 中专门用于按顺序串联多个输入流的工具类,它把多个 InputStream 当作一个逻辑上的连续流来读取——前一个流读完自动切换到下一个,直到全部结束。
核心原理:按序拼接,自动切换
它内部维护一个 Enumeration<inputstream></inputstream>(或两个流的构造方式),每次调用 read() 时,先尝试从当前流读;若当前流返回 -1(已到末尾),就自动获取下一个流继续读。整个过程对上层透明,就像读一个大文件一样。
两种常用构造方式
• 使用 Enumeration<inputstream></inputstream> 构造(推荐用于多个流):
先将所有输入流放入 Vector 或其他支持 elements() 的集合,再转为枚举:
Vector<inputstream> streams = new Vector();
streams.add(new FileInputStream("a.txt"));
streams.add(new FileInputStream("b.txt"));
streams.add(new ByteArrayInputStream("hello".getBytes()));
<p>SequenceInputStream sis = new SequenceInputStream(streams.elements());</p></inputstream>• 使用两个流的构造(适合仅合并两个流):new SequenceInputStream(InputStream s1, InputStream s2) —— 等价于先读 s1 再读 s2。
使用注意事项
• 每个被合并的流需自行打开,SequenceInputStream 不负责打开或关闭它们;建议用 try-with-resources 分别管理各原始流,或在读完后手动 close(注意:调用 sis.close() 只会关闭当前正在读的流,不会关掉所有流)。
• 一旦某个流抛出异常(如 IOException),整个读取中断,后续流不会被读取。
• 不支持 mark()/reset(),因为无法跨流回溯。
简单示例:合并三个文本文件并打印内容
```java
try (SequenceInputStream sis = new SequenceInputStream(
new FileInputStream("1.txt").elements(),
new FileInputStream("2.txt").elements(),
new FileInputStream("3.txt").elements())) {
int b;
while ((b = sis.read()) != -1) {
System.out.print((char) b);
}
} catch (IOException e) {
e.printStackTrace();
}
```
⚠️ 注意:上面写法有误——elements() 是 Vector 方法,不能直接链式调用。正确做法是先构造 Vector,再传入 elements()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











