Java断点续传核心是持久化保存已读字节数,推荐用纯文本或Properties文件存储偏移量,采用“写临时文件+原子重命名”安全写入,读取时校验存在性、解析合法性及越界风险,再通过RandomAccessFile.seek()或FileChannel.position()跳转续传。

Java 中实现断点续传,核心是把当前已读取的字节数(即文件偏移量)持久化保存,下次启动时先读取这个位置,再从该处继续读取。临时记录配置文件通常用简单文本或轻量格式(如 Properties、JSON 或纯数字文件)存储一个整型偏移值即可,无需复杂结构。
选择合适的记录文件格式
推荐使用 纯文本文件(只存一个数字) 或 Properties 文件,兼顾可读性、写入原子性和跨平台兼容性。
-
纯数字文件(如
resume.offset):内容就是一行数字,例如1048576。读写简单,不易出错,适合单任务场景。 -
Properties 文件(如
resume.properties):内容为offset=1048576,便于扩展字段(如添加时间戳、校验码),也方便人工查看或调试。 - 避免用 JSON 或 XML 做这种单值记录——引入依赖、写入开销大,且无实际收益。
安全写入偏移量(防止中断丢失)
直接覆盖写入有风险(如写到一半程序崩溃,导致记录损坏)。应采用“写临时文件 + 原子重命名”策略:
- 将新偏移量写入
resume.offset.tmp - 调用
Files.move(tmpPath, offsetPath, StandardCopyOption.REPLACE_EXISTING) - 确保重命名操作在同文件系统下是原子的(绝大多数操作系统支持)
读取并恢复读取位置
每次开始读取前,先尝试加载记录文件;若不存在或解析失败,从 0 开始。
立即学习“Java免费学习笔记(深入)”;
- 用
Files.exists()检查记录文件是否存在 - 用
Files.readString(path).trim()读取内容,再Long.parseLong()转为偏移量 - 务必捕获
NumberFormatException和IOException,降级处理(如重置为 0) - 验证偏移量是否 ≤ 文件总长度,防止越界(
Files.size(filePath) >= offset)
配合 RandomAccessFile 或 FileInputStream 跳转读取
拿到恢复位置后,用支持定位的 API 跳过已读部分:
- 若用
RandomAccessFile:构造后调用raf.seek(offset) - 若用
FileInputStream+Channels.newChannel():创建FileChannel后调用channel.position(offset) - 注意:普通
BufferedInputStream不支持跳转,必须用上述底层通道或 RAFAPI
不复杂但容易忽略:记录文件路径要与主文件路径关联(比如放在同一目录、加统一前缀),避免多任务冲突;每次成功完成传输后,建议主动删除记录文件,避免残留脏数据干扰下次任务。


















