java實現下載器(以及創建一個URL對象)

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 = "//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對象步驟:

  1. 創建URL對象,並通過調用openConnection方法獲得URLConnection對象;
  2. 設置URLConnection參數和普通請求屬性;
  3. 向遠程資源發送請求
  4. 遠程資源變為可用,程序可以訪問遠程資源的頭字段和通過輸入流來讀取遠程資源返回的信息。

 

 

參考自:

//blog.csdn.net/iteye_17172/article/details/81929677  (Java URL對象的理解和例子

//www.cnblogs.com/oubo/archive/2012/01/16/2394641.html  (Java網絡編程總結)