sequenceinputstream 通过串联多个 fileinputstream 实现碎片文件有序合并,需预排序文件、用 vector 封装流并传入其 enumeration,配合 try-with-resources 安全写入;大文件或高要求场景可选 files.copy 或 filechannel.transferfrom。

用 SequenceInputStream 合并多个碎片文件,核心是把每个碎片包装成 InputStream,再按顺序串联起来,最后一次性写入目标文件。它适合已知碎片顺序、且不需随机访问的场景,比如分块下载后拼接、日志归档等。
准备有序的输入流列表
必须确保碎片文件按正确顺序排列(如 part01.dat、part02.dat),否则合并结果错乱。推荐用 File 数组或 List<file></file> 预先排序,再逐个创建 FileInputStream:
- 用
Arrays.sort(files, Comparator.comparing(File::getName))按文件名排序(适用于命名规则统一的情况) - 若碎片有明确序号(如带数字后缀),建议提取数字后排序,避免字符串排序错误(例如 "part10.dat" 排在 "part2.dat" 前)
- 每个
FileInputStream对应一个碎片,不能复用同一个流对象
构造 SequenceInputStream
SequenceInputStream 接收两个 InputStream 或一个 Enumeration<inputstream></inputstream>。推荐用枚举方式,兼容任意数量碎片:
- 将所有
FileInputStream放入Vector<inputstream></inputstream>(它是线程安全的,且elements()返回Enumeration) - 调用
new SequenceInputStream(vector.elements())创建组合流 - 注意:该流是“单向消耗型”——读完即关闭内部所有子流,不可重复读取
安全写入目标文件
用 try-with-resources 管理资源,确保 SequenceInputStream 和目标 FileOutputStream 正确关闭:
- 不要手动调用
close()子流(如 FileInputStream),SequenceInputStream会在自身close()时自动关闭它们 - 使用缓冲(如
BufferedOutputStream)提升写入性能,尤其对大文件 - 可选:边读边校验字节数,确认总长度与预期一致,避免漏读
替代方案说明
如果碎片数量极大或内存敏感,SequenceInputStream 不是唯一选择:
- JDK 7+ 可用
Files.copy()循环追加,逻辑更直观,也便于控制异常粒度 - NIO 的
FileChannel.transferFrom()在某些系统上效率更高,但需处理 position 和 size - 若需支持断点续传或校验,建议用自定义工具类封装流程,而非依赖
SequenceInputStream单一机制










