使用 sequenceinputstream 合并多个流,核心做法是将所有待合并的输入流放入一个 enumeration 中(通常用 vector),然后将其作为参数传给 sequenceinputstream 的构造函数。这样创建的流会按顺序依次读取每个子流的内容,直到所有子流都读完为止。

如何构建 Enumeration 并初始化 SequenceInputStream
必须先将 InputStream 对象收集到 Vector 中,再调用 elements() 方法获取枚举器。将枚举器传入 SequenceInputStream 后,该流会自动处理内部指针的移动,无需手动切换流。

import java.io.*;
import java.util.Enumeration;
import java.util.Vector;
public class MergeExample {
public static void main(String[] args) throws Exception {
// 1. 准备数据文件
Files.writeString(Path.of("part1.txt"), "Hello");
Files.writeString(Path.of("part2.txt"), " World");
// 2. 创建 Vector 并添加流
Vector<inputstream> v = new Vector();
v.add(new FileInputStream("part1.txt"));
v.add(new FileInputStream("part2.txt"));
// 3. 获取 Enumeration 并构造 SequenceInputStream
Enumeration<inputstream> e = v.elements();
try (SequenceInputStream sis = new SequenceInputStream(e)) {
byte[] buffer = new byte[1024];
int n;
while ((n = sis.read(buffer)) != -1) {
System.out.write(buffer, 0, n);
}
}
}
}</inputstream></inputstream>
运行上述代码,控制台输出为:Hello World。这验证了 SequenceInputStream 确实按 Vector 中的顺序拼接了内容。
如何处理流关闭与资源管理
当 SequenceInputStream 被调用 close() 时,它会递归关闭其包含的所有底层流。因此,只需关闭最外层的 SequenceInputStream 即可,不需要单独关闭内部的 FileInputStream。

import java.io.*;
import java.util.Enumeration;
import java.util.Vector;
public class CloseExample {
public static void main(String[] args) throws Exception {
Vector<inputstream> v = new Vector();
v.add(new FileInputStream("part1.txt"));
v.add(new FileInputStream("part2.txt"));
Enumeration<inputstream> e = v.elements();
// 使用 try-with-resources 确保自动关闭
try (SequenceInputStream sis = new SequenceInputStream(e)) {
// 模拟读取部分数据
sis.skip(5);
} // 此处 sis.close() 会被自动调用,进而关闭 part1.txt 和 part2.txt 的流
}
}</inputstream></inputstream>
在上面的代码中,即使只读取了前 5 个字节,try-with-resources 块结束时也会触发 sis.close()。根据 SequenceInputStream 的实现逻辑,它会遍历已打开的子流并逐个调用 close()。如果某个子流尚未读完,它也会被强制关闭,但不会抛出异常。这种机制简化了资源清理工作,开发者只需关注顶层流的关闭即可。
基于空枚举或单一流的具体行为问题
如果传入的 Enumeration 为空,SequenceInputStream 的 read() 方法会立即返回 -1,表示没有数据可读。如果只包含一个流,其行为等同于直接操作该流,但依然遵循顺序读取的逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











