利用 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- 請求部分內容SaveItemFile.write() 寫入並更新 startPosisDownloadOverBatchDownloadFile實作 Runnable,負責:
.position)是否存在,決定是首次下載還是續傳getFileSize() 取得檔案長度,依分塊數平均切割起訖位置陣列DownloadFile 線程並啟動writePosInfo() 將各線程最新進度持久化到暫存檔isDownloadOver(),全部完成才結束getFileSize() 會驗證 HTTP 狀態碼(200 或 206),不支援斷點的伺服器會直接返回錯誤。
LogUtils:簡易日誌,分 log()(輸出到 System.err)與 info()(輸出到 System.out)DownloadUtils:提供三種靜態 download() 多載,快速啟動下載任務TestDownloadMain:示範下載 MP3 檔案到 c:/temp,5 線程完整原始碼已保留於文章中,核心邏輯集中在第三、四部分,其餘輔助類均有詳細註解,便於理解與擴充。