java實現下載器(以及建立一個URL物件)
1.思路講解:
(1)注意路徑:是網路路徑噢
(2)建立建立網路協議物件(遠端物件):HttpURLConnection urlConnection
(3)定位網路資源:URL url
(4)呼叫url的openConnection()方法,連線遠端物件
(5)設定遠端物件的引數和屬性:例如 urlConnection.setRequestProperty("Range", "bytes=0-");
(6)傳送連線請求,實現真正的連線:urlConnection.connect();
(7)通過返回碼,判斷是否連線成功(200以內是成功的)
(8)遠端物件連線成功後,建立遠端物件輸入流
(9)開始讀取與寫入位元組啦
2.程式碼:
package DownLoadDemo; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; import java.util.RandomAccess; public class DownLoaderTest { private static final int MAX_SIZE_BUFF = 1024 * 1024 * 10; //1MB大小 //網路視訊路徑 private static String path = "https://www.iqiyi.com/v_uggavqs43w.html"; private static String writePath = "111.mp4"; public static void main(String[] args) throws IOException { //網路協議物件(遠端物件) HttpURLConnection urlConnection = null; //定位網路資源 URL url = new URL(path); //呼叫url的openConnection()連線遠端物件 urlConnection = (HttpURLConnection) url.openConnection(); //設定遠端物件的引數和屬性:"Range" : 範圍," 0-":沒有終止位元組數,支援斷點續傳 urlConnection.setRequestProperty("Range", "bytes=0-"); //傳送連線請求,實現真正的連線 urlConnection.connect(); //通過返回碼,判斷是否連線成功(200以內是成功的) int code = urlConnection.getResponseCode(); if(code / 100 != 2) { //請求失敗 throw new RuntimeException("請求失敗,返回碼:" + code + "錯誤"); } //遠端物件連線成功後,建立遠端物件輸入流 InputStream inputStream = urlConnection.getInputStream(); //建立bufferedInputStream // BufferedInputStream bInStream = new BufferedInputStream(inputStream); // //使用RandomAccess工具類 // RandomAccessFile randomAccess = new RandomAccessFile(path, "rw"); //建立緩衝位元組陣列buff byte[] buff = null; //開始讀寫 //1、新增(小技術)列印下載進度(下載的"每塊位元組"位元組數/時間) //獲取檔案大小 int fileSize = urlConnection.getContentLength(); System.out.println(fileSize); int downloadedCount = 0; while(downloadedCount < fileSize) { //分塊,處理一下最後剩餘不足MAX_SIZE_BUFF量 if(fileSize - downloadedCount > MAX_SIZE_BUFF) { buff = new byte[MAX_SIZE_BUFF]; }else { buff = new byte[fileSize - downloadedCount]; } int currCount = 0; int read = -1; long startTime = System.currentTimeMillis(); // //讀取 // bInStream.read(buff); while(currCount < buff.length) { read = inputStream.read(); if(read == -1) { break; } buff[currCount++] = (byte)read; } if(read == -1) { break; } long endTime = System.currentTimeMillis(); double speed = currCount / ((endTime - startTime) / 1000.0); //速度b/s System.out.println("讀取速度:" + speed); downloadedCount += currCount; } } }
3.網路程式設計知識:
1.URL物件:
URL: 統一資源定位符
作用:
☆通過 URL 可以獲得網際網路資源相關資訊,包括獲得URL所引用的遠端物件URLConnection,以及URL的輸入流物件InputStream。
☆類 URL 是指向網際網路“資源”的指標。資源可以是簡單的檔案或目錄,也可以是對更為複雜的物件的引用,例如對資料庫或搜尋引擎的查詢。
簡單說,就是在網路上找到資源的位置(統一資源定位符),才可以通過網路的服務進行資源的各種操作:如存取、更新、替換和查詢其屬性。(得URL所引用的遠端物件URLConnection,以及URL的輸入流物件InputStream。)
2.建立一個URL物件步驟:
- 建立URL物件,並通過呼叫openConnection方法獲得URLConnection物件;
- 設定URLConnection引數和普通請求屬性;
- 向遠端資源傳送請求;
- 遠端資源變為可用,程式可以訪問遠端資源的頭欄位和通過輸入流來讀取遠端資源返回的資訊。
3.連線後返回碼含義:
參考自:
https://blog.csdn.net/iteye_17172/article/details/81929677 (Java URL物件的理解和例子 )
https://www.cnblogs.com/oubo/archive/2012/01/16/2394641.html (Java網路程式設計總結)