java断点续传核心是用randomaccessfile或filechannel定位偏移量并配合http range请求:1.验证服务端支持206响应;2.用file.length()获取已下载大小作为startoffset并seek定位;3.设置range头请求剩余数据;4.raf.seek(startoffset)后write写入,确保不覆盖。

Java 中用字节流实现断点续传的偏移量定位,核心是利用 RandomAccessFile 或带 seek() 能力的流(如 FileChannel)跳转到已下载位置继续写入,同时配合 HTTP 的 Range 请求头从服务端获取剩余数据。
1. 服务端支持 Range 请求(前提)
断点续传依赖服务端返回 206 Partial Content 响应。需确保目标 URL 支持分段下载(大多数静态文件服务器默认支持)。可用 curl 验证:
curl -I -H "Range: bytes=1000-1999" https://example.com/file.zip
若响应含 HTTP/1.1 206 Partial Content 和 Content-Range,说明可用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
2. 本地记录并定位已下载偏移量
下载前检查本地文件是否存在及大小,该大小即为下次写入的起始偏移量:
- 用
File.length()获取已写入字节数,作为startOffset - 创建
RandomAccessFile并调用seek(startOffset)定位到末尾 - 或使用
FileChannel的position(startOffset)
3. 发起带 Range 的 HTTP 请求
设置请求头告知服务端只下载指定区间:
- 构造请求头:
connection.setRequestProperty("Range", "bytes=" + startOffset + "-") - 注意:不写结束值表示“从 startOffset 到末尾”
- 读取响应时,用
HttpURLConnection.getResponseCode()确认返回 206
4. 写入时跳过已有部分,追加新数据
避免覆盖,必须在文件末尾或指定位置写入:
- 推荐用
RandomAccessFile raf = new RandomAccessFile(file, "rw") -
raf.seek(startOffset)定位后,用raf.write(buffer, 0, len)写入 - 不用
FileOutputStream默认追加模式(它会清空文件或覆盖开头),除非显式设new FileOutputStream(file, true),但该模式无法随机定位,仅适合纯追加场景
不复杂但容易忽略细节:偏移量要严格对齐服务端返回的 Content-Range 起始值,且本地文件长度必须与上次成功写入一致,否则会出现数据错位或重复。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










