SequenceInputStream 是 Java 中按顺序合并多个 InputStream 的工具类,仅支持字节流;合并字符流需先转为字节流或采用手动拼接、NIO 等替代方案。

SequenceInputStream 是 Java 中用于按顺序合并多个输入流的工具类,但它只支持字节流(InputStream),不直接支持字符流(Reader)。因此,合并字符流需先转为字节流或改用其他方式(如手动拼接、NIO 的 Files.readAllBytes + String 构造,或使用 java.io.SequenceInputStream 的等效逻辑封装)。下面分两部分说明实际用法和注意事项。
字节流合并:用 SequenceInputStream 串联多个 InputStream
适用于合并多个二进制文件(如图片片段、日志块)或需要按序读取字节的场景。关键点是构造时传入一个 Enumeration extends InputStream>。
- 可将多个
FileInputStream放入Vector或ArrayList,再用Collections.enumeration()转为枚举 - 读取时,
SequenceInputStream自动从第一个流读完,再切换到下一个,直到全部结束 - 注意:所有流由
SequenceInputStream统一管理关闭,但建议在try-with-resources中显式包含它,内部流不会自动关闭(除非重写close())
示例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
streams.add(new FileInputStream("a.bin"));
streams.add(new FileInputStream("b.bin"));
try (SequenceInputStream seq = new SequenceInputStream(streams.elements())) {
int b;
while ((b = seq.read()) != -1) {
System.out.write(b); // 输出合并后字节
}
}
字符流不能直接用 SequenceInputStream
SequenceInputStream 继承自 InputStream,无法处理字符编码、换行符识别或 Unicode 字符边界。若强行用它读取文本并转成字符串,容易因编码不一致或截断导致乱码。
立即学习“Java免费学习笔记(深入)”;
- 错误做法:把
FileReader包装成InputStream(如用reader.toString().getBytes())——会丢失原始编码信息且不可靠 - 推荐替代方案:
• 用InputStream+ 显式指定编码(如new InputStreamReader(fis, "UTF-8"))统一处理,再逐个读取合并
• Java 8+ 可用Stream.of(file1, file2).map(Files::readAllLines).flatMap(List::stream)拼接行
• 或用BufferedReader循环读取每个文件,手动写入目标Writer
实用建议与常见陷阱
- 确保各字节流内容逻辑上可拼接(例如都是同一格式的二进制数据),否则合并后可能损坏结构
- 如果某个流提前关闭或抛异常,
SequenceInputStream会停止读取后续流,需在外层捕获并处理 - 内存敏感场景慎用:它不缓存整个数据,但读取过程仍依赖底层流的缓冲策略;大文件建议配合
BufferedInputStream - Java 9+ 提供了更现代的方式,如
InputStream.concat()(静态工厂方法),语义更清晰且支持Stream式组合
小结:选对工具,避免硬套
合并字节流,SequenceInputStream 简单直接;合并文本,优先走字符流原生路径,别绕路转字节。理解它“只负责顺序串联字节”的本质,就能避开大多数编码和关闭问题。

















