HTTP 斷點續傳核心在於 Range(請求頭)與 Content-Range(回應頭)配合。本文實作一個單執行緒下載工具,支援從文本文件批次讀取下載任務,自動檢測本地檔案大小發送 Range 續傳,解析 Content-Range 取得總檔案大小並顯示進度。
URL 本地路徑 緩衝區大小HttpDownload + 事件介面 DownloadEvent 解耦進度顯示。finishedSize。Socket 連接,發送 HTTP GET 請求;若 finishedSize > 0 加入 Range: bytes=finishedSize-。Content-Length(首次下載)、Content-Range: bytes m-n/k(續傳,k 為總大小)。finishedSize >= 總大小 或回應碼非 2xx/206 則結束。read(buffer) 寫入檔案(FileOutputStream(..., true) 追加模式),觸發進度事件。if (startPos > 0)
writer.write("Range: bytes=" + startPos + "-\r\n");
while ((s = socketReader.readLine()) != null) {
if (s.equals("")) break;
de.viewHttpHeaders(s);
int idx = s.indexOf(":");
if (idx > 0) httpHeaders.put(s.substring(0,idx), s.substring(idx+1).trim());
else analyzeFirstLine(s); // 狀態行
}
long len = getIntHeader("Content-Length");
String[] cr = getHeader("Content-Range").split("/");
if (cr.length > 1) len = Integer.parseInt(cr[1]); // 總大小
while ((n = in.read(buf)) != -1) {
fos.write(buf, 0, n);
downloaded += n;
if (total > 0) de.percent(downloaded * 100 / total);
}
輸入文件含三個 RAR 下載連結,執行 java download.Main download.txt,主控台顯示連接狀態、回應頭、即時進度百分比。
此工具展示 HTTP 斷點續傳的完整協議交互與 Java 實作細節,可擴充為多執行緒、GUI、限速等功能,是理解 HTTP 範圍請求的最佳實踐範例。