首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現 HTTP 斷點續傳下載工具:Range/Content-Range 頭完整應用

     編輯:Java 相關知識

前言

HTTP 斷點續傳核心在於 Range(請求頭)與 Content-Range(回應頭)配合。本文實作一個單執行緒下載工具,支援從文本文件批次讀取下載任務,自動檢測本地檔案大小發送 Range 續傳,解析 Content-Range 取得總檔案大小並顯示進度。

工具規格

  • 輸入文本文件,每行:URL 本地路徑 緩衝區大小
  • 單執行緒循序下載,支援中斷後重啟續傳。
  • 核心類 HttpDownload + 事件介面 DownloadEvent 解耦進度顯示。

核心流程

  1. 讀取本地檔案長度 finishedSize。
  2. 建立 Socket 連接,發送 HTTP GET 請求;若 finishedSize > 0 加入 Range: bytes=finishedSize-。
  3. 解析回應頭:Content-Length(首次下載)、Content-Range: bytes m-n/k(續傳,k 為總大小)。
  4. 若 finishedSize >= 總大小 或回應碼非 2xx/206 則結束。
  5. 循環 read(buffer) 寫入檔案(FileOutputStream(..., true) 追加模式),觸發進度事件。

關鍵程式碼片段

發送請求含 Range

if (startPos > 0)
    writer.write("Range: bytes=" + startPos + "-\r\n");

解析回應頭至 HashMap

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 範圍請求的最佳實踐範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved