一、HTTP下載概述
HTTP下載指的是從伺服器上下載文件到本地電腦。我們通常使用HTTP協議來進行文件的上傳和下載,HTTP協議是應用層協議,也是一種無狀態的協議,因此HTTP下載的過程相較於其他協議而言,更加簡單。
二、Java HTTP下載的基本流程
Java通過URLConnection和HttpURLConnection類支持HTTP協議,可以很方便的完成HTTP下載文件的功能。HTTP下載的基本流程如下:
1. 創建URL對象,指定下載文件的URL地址;
2. 打開URL對象的連接;
3. 創建HttpURLConnection對象,並進行配置(比如設置請求方法、請求頭、連接和讀取超時時間等等);
4. 獲取到伺服器響應的碼,判斷是否連接成功;
5. 讀取伺服器響應的數據流,並將下載的文件存儲到本地;
6. 關閉連接。
三、Java HTTP下載的實現
1、設置請求頭
URL url = new URL(fileurl);//fileurl為文件下載路徑 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
在創建HttpURLConnection對象之後,我們可以設置請求頭,此處設置了一個User-Agent請求頭,用於偽裝成瀏覽器進行下載,提高下載成功率。
2、設置下載位置
File file = new File(path + "/" + fileName);//下載文件存放路徑及文件名 RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); randomAccessFile.seek(startPos);
若需要支持斷點續傳,並設置從某個位置開始下載,則需要通過RandomAccessFile類設置下載位置。
3、分片下載文件
InputStream input = conn.getInputStream(); byte[] buffer = new byte[1024]; int length = 0; long tempSize = startPos;//設置下載起始位置 while ((length = input.read(buffer)) != -1) { randomAccessFile.write(buffer, 0, length); tempSize += length; if (tempSize > endPos) { break; } }
若資源文件太大,需要進行分片下載則可以在代碼中設置下載文件的起始位置和結束位置並分段接收文件信息,以此達到分段下載的效果。
4、完整代碼示例
import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class HttpDownload { public static void main(String[] args) { String fileurl = "https://example.com/example.zip"; String path = "D:/download";//下載目錄 String fileName = "example.zip";//下載文件名 //設置下載起始位置和結束位置 long startPos = 0L; long endPos = 1024L * 10240L; try { URL url = new URL(fileurl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); File file = new File(path + "/" + fileName); RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); randomAccessFile.seek(startPos); InputStream input = conn.getInputStream(); byte[] buffer = new byte[1024]; int length = 0; long tempSize = startPos; while ((length = input.read(buffer)) != -1) { randomAccessFile.write(buffer, 0, length); tempSize += length; if (tempSize > endPos) { break; } } randomAccessFile.close(); input.close(); conn.disconnect(); System.out.println("文件下載完畢!"); } catch (IOException e) { e.printStackTrace(); } } }
四、HTTP下載的常見異常
1、java.net.SocketTimeoutException: Read timed out
這個異常通常是連接超時引起的,可以通過設置連接和讀取超時時間來避免這個問題。
2、java.io.FileNotFoundException
這個異常通常是指定的URL地址不存在或者下載的文件路徑不正確,需要確認URL地址是否正確或者文件路徑是否正確。
3、java.io.IOException: Server returned HTTP response code: 403
這個異常通常是因為下載文件地址URL受到許可權或者用戶名、密碼等限制導致的,需要在設置請求頭中加入相應的授權信息。
至此,Java HTTP下載文件的詳解便結束了,以上是該教程的全部內容。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/236194.html