HTTP 斷點下載的核心在於 Range: bytes=start- 請求頭,告知服務器從指定字節開始傳輸。配合 RandomAccessFile.seek() 定位寫入,即可實現最簡單的斷點續傳 Demo。
import java.io.*;
import java.net.*;
public class ResumeDownloadDemo {
public static void main(String[] args) throws Exception {
URL url = new URL("https://localhost:8080/first/he.txt");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 關鍵:設置從第 5 字節開始下載(斷點續傳核心)
conn.setRequestProperty("Range", "bytes=5-");
try (InputStream in = conn.getInputStream();
FileOutputStream out = new FileOutputStream("d:\\a.txt")) {
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
}
// 若需隨機寫入(多線程分塊),改用 RandomAccessFile:
// RandomAccessFile raf = new RandomAccessFile("d:\\a.txt", "rw");
// raf.seek(5); // 定位到第 5 字節
// ... 寫入數據 ...
}
}
| 組件 | 作用 |
|---|---|
Range: bytes=5- | 請求從第 5 字節到文件結尾;bytes=5-100 表示 5~100 字節 |
響應碼 206 Partial Content | 服務器支持斷點下載的標誌(需服務端配置 Accept-Ranges: bytes) |
RandomAccessFile.seek(pos) | 移動文件指針,實現任意位置寫入,多線程分塊下載必備 |
Content-MD5 或計算文件哈希。幾十行代碼即可跑通斷點下載主流程,核心在於理解 HTTP Range 請求與文件隨機訪問的配合。實際項目中建議封裝為可復用的 Downloader 組件,接入線程池、進度回調、限速等能力。