多線程下載的核心在於「搶佔伺服器資源」。假設伺服器限制單 IP 連接數,啟動多條線程相當於模擬多用戶並發請求,從而在單位時間內獲取更多頻寬。文中以水龍頭為喻:單位時間內放水 990ms 遠多於 10ms,直觀說明了並發優勢。
HttpURLConnection.getContentLength() 取得總大小,配合 RandomAccessFile.setLength() 預留磁碟空間。Range: bytes=start-end,告知伺服器只傳輸指定區塊。RandomAccessFile,調用 seek(startPos) 定位寫入位置,實現並發寫入無衝突。範例包含兩個核心類:
DownLoadTest:主控類,負責初始化連接、計算分塊、啟動線程。DownLoadThread:實作 Runnable,執行具體下載邏輯,支援斷點續傳(記錄已下載位元組數到臨時文件)。另附工具類 StreamTools 用於流轉 byte 陣列。
// 設置 Range 請求頭
httpURLConnection.setRequestProperty("Range", "bytes=" + startSize + "-" + endSize);
// 定位寫入位置
accessFile.seek(startSize);
// 邊讀邊寫並記錄進度
while ((len = is.read(buffer)) != -1) {
accessFile.write(buffer, 0, len);
threadTotal += len;
// 將進度持久化到臨時文件,支援斷點續傳
saveProgress(threadTotal);
}
將待下載文件(如 youdao.exe)放入 Tomcat webapps/doudou 目錄,啟動伺服器後運行 DownLoadTest.main() 即可觀察多線程下載效果。
本例展示了基於 HTTP Range 與 RandomAccessFile 的經典多線程下載模式,並融入斷點續傳機制,適合作為網絡編程教學或項目基礎模組參考。