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

Java 實現 HTTP 多線程斷點續傳下載(上)

     編輯:Java 程式設計入門

核心原理

利用 URLConnection 獲取遠端檔案的長度、標頭等資訊,並設定請求標頭。透過輸入流讀取檔案資料,將檔案分割為指定區塊,每個區塊由獨立線程負責讀寫。使用 RandomAccessFile 實現隨機寫入,每個線程的寫入位置(檔案指標)會儲存在暫存檔中,支援斷點續傳:下次下載時讀取暫存檔記錄的位置,從中斷處繼續下載,並即時更新進度。

一、下載資訊實體類 DownloadInfo

封裝待下載資源的 URL、檔名、儲存路徑、分塊數(線程數)等屬性,提供多種建構子與預設值(預設路徑 C:/temp、預設 5 線程),並含有從 URL 自動解析檔名的邏輯。

二、隨機寫入工具類 SaveItemFile

基於 RandomAccessFile 實現「指定位置寫入」,提供同步的 write(byte[], int, int) 方法,回傳實際寫入長度,供下載線程呼叫。此類確保多線程並發寫入同一檔案時不會互相覆蓋。

三、單線程下載任務 DownloadFile

繼承 Thread,每個實例負責一個區塊(startPos~endPos)。在 run() 中:

  • 建立 HttpURLConnection,設定 10 秒連線/讀取逾時
  • 呼叫 setHeader() 偽裝瀏覽器 User-Agent 等標頭
  • 設定 Range: bytes=startPos- 請求部分內容
  • 取得輸入流,以 8KB 緩衝區循環讀取,呼叫 SaveItemFile.write() 寫入並更新 startPos
  • 完成或異常時關閉資源,標記 isDownloadOver

四、批次多線程協調器 BatchDownloadFile

實作 Runnable,負責:

  1. 檢查暫存檔(.position)是否存在,決定是首次下載還是續傳
  2. 首次下載:呼叫 getFileSize() 取得檔案長度,依分塊數平均切割起訖位置陣列
  3. 建立對應數量的 DownloadFile 線程並啟動
  4. 每 500ms 呼叫 writePosInfo() 將各線程最新進度持久化到暫存檔
  5. 輪詢所有線程 isDownloadOver(),全部完成才結束

getFileSize() 會驗證 HTTP 狀態碼(200 或 206),不支援斷點的伺服器會直接返回錯誤。

五、工具與測試類

  • LogUtils:簡易日誌,分 log()(輸出到 System.err)與 info()(輸出到 System.out)
  • DownloadUtils:提供三種靜態 download() 多載,快速啟動下載任務
  • TestDownloadMain:示範下載 MP3 檔案到 c:/temp,5 線程

完整原始碼已保留於文章中,核心邏輯集中在第三、四部分,其餘輔助類均有詳細註解,便於理解與擴充。

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