sequenceinputstream用于将多个inputstream按顺序串联成一个逻辑单一输入流,先读完第一个流再自动切换至下一个直至全部读完,适合分片文件合并等场景,核心用法是传入enumeration或两个inputstream,最常用enumeration方式。

SequenceInputStream 用于将多个 InputStream 按顺序串联成一个逻辑上的单一输入流,读取时先读完第一个流,再自动切换到下一个,直到全部读完。它适合处理“分片文件”、“多段数据拼接”等场景。
核心用法:传入 Enumeration 或两个 InputStream
最常用的是通过 Enumeration extends InputStream> 构造,而 Collections.enumeration() 可方便地把 List 转为枚举。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建一个
List<inputstream></inputstream>,按期望顺序添加各个输入流(如 FileInputStream、ByteArrayInputStream 等) - 用
Collections.enumeration(list)包装成枚举对象 - 传给
new SequenceInputStream(enumeration)
简单示例:合并两个字节数组流
以下代码将两段字节数据“hello”和“world”合并读取:
List<inputstream> streams = Arrays.asList(
new ByteArrayInputStream("hello".getBytes()),
new ByteArrayInputStream("world".getBytes())
);
Enumeration<inputstream> en = Collections.enumeration(streams);
try (SequenceInputStream sis = new SequenceInputStream(en);
InputStreamReader reader = new InputStreamReader(sis, StandardCharsets.UTF_8)) {
System.out.println(reader.readLine()); // 输出: helloworld
}
</inputstream></inputstream>
注意事项与限制
- 每个被包装的流**不会自动关闭**,需在外部显式关闭(或使用 try-with-resources 分别管理)
- 一旦某个流抛出异常(如 IOException),后续流将不再读取,整个 SequenceInputStream 失效
- 不支持
mark()/reset(),因为底层流可能不支持,且跨流重置语义不明确 - 如果只合并两个流,也可直接用双参构造:
new SequenceInputStream(is1, is2)
实用技巧:延迟打开文件流
避免提前打开大量文件,可封装为懒加载的 InputStream 子类,或用 Supplier 包装,在 read() 触发时才打开下一个文件流 —— 这需要自定义实现,但 SequenceInputStream 本身不提供该能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










