欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程下載的實現(xiàn)方法

 更新時間:2013年03月27日 08:49:50   作者:  
復(fù)習(xí)多線程的時候,練習(xí)了下,順便記錄一下:

復(fù)制代碼 代碼如下:

package cn.me.test;

import java.io.InputStream;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;

/**

 * 多線程下載

 * 1:使用RandomAccessFile在任意的位置寫入數(shù)據(jù)。

 * 2:需要計算第一個線程下載的數(shù)據(jù)量,可以平均分配。如果不夠平均時,

 *    則直接最后一個線程處理相對較少的數(shù)據(jù)

 * 3:必須要在下載之前準備好相同大小的文件,通過文件頭獲取

 */

public class MultiThreadDownload {

    public static void main(String[] args) throws Exception {

       //1:聲明文件名和下載的地址

       String fileName = "aa.rar";

       String urlStr = "http://localhost:7777/day18";

       //2:聲明Url

       URL url = new URL(urlStr+"/"+fileName);

       //3:獲取連接

       HttpURLConnection con =

           (HttpURLConnection) url.openConnection();

       //4:設(shè)置請求方式

       con.setRequestMethod("GET");

       //5:獲取請求頭,即文件的長度

       int length = con.getContentLength();//獲取下載文件的長度,以計算每個線程應(yīng)該下載的數(shù)據(jù)量。

       //6:在指定的目錄下,創(chuàng)建一個同等大小的文件

       RandomAccessFile file = new RandomAccessFile("d:/a/"+fileName, "rw");//創(chuàng)建一個相同大小的文件。

       //7:設(shè)置文件大小,占位

       file.setLength(length);//設(shè)置文件大小。

 

       file.close();

       //8:定義線程個數(shù)

       int size = 3;

       //9:計算每一個線程應(yīng)該下載多少字節(jié)的數(shù)據(jù),如果正好整除則最好,否則加1

       int block = length/size==0?length/size:length/size+1;//計算每個線程應(yīng)該下載的數(shù)據(jù)量。


       System.err.println("每個線程應(yīng)該下載:"+block);

       //10:運行三個線程并計算從哪個字節(jié)開始到哪一個字節(jié)結(jié)束

       for(int i=0;i<size;i++){

           int start = i*block;

           int end = start+(block-1);//計算每一個線程的開始和結(jié)束字節(jié)。

 

         System.err.println(i+"="+start+","+end);

           new MyDownThread(fileName, start, end,url).start();

       }

    }

    static class MyDownThread extends Thread{

       //定義文件名

       private String fileName;

       //定義從何地開始下載

       private int start;

       //定義下載到哪一個字節(jié)

       private int end;

       private URL url;

       public MyDownThread(String fileName,int start,int end,URL url){

           this.fileName=fileName;

           this.start=start;

           this.end=end;

           this.url=url;

       }

       @Override

       public void run() {

           try{

              //11:開始下載

              HttpURLConnection con =

                     (HttpURLConnection) url.openConnection();

              con.setRequestMethod("GET");

              //12:設(shè)置分段下載的請求頭

              con.setRequestProperty("Range","bytes="+start+"-"+end);//設(shè)置從服務(wù)器上讀取的文件塊。

 

              //13:開始下載,需要判斷206

              if(con.getResponseCode()==206){//訪問成功,則返回的狀態(tài)碼為206。

                  InputStream in = con.getInputStream();

                  //14:聲明隨機寫文件對象,注意rwd是指即時將數(shù)據(jù)寫到文件中,而不使用緩存區(qū)

                  RandomAccessFile out = new RandomAccessFile("d:/a/"+fileName,"rwd");

                  out.seek(start);//設(shè)置從文件的某個位置開始寫數(shù)據(jù)。

                  byte[] b=new byte[1024];

                  int len = 0;

                  while((len=in.read(b))!=-1){

                     out.write(b,0,len);

                  }

                  out.close();

                  in.close();

              }

              System.err.println(this.getName()+"執(zhí)行完成");

           }catch(Exception e){

              throw new RuntimeException(e);

           }

       }

    }

}


相關(guān)文章

  • 詳細理解JAVA面向?qū)ο蟮姆庋b,繼承,多態(tài),抽象

    詳細理解JAVA面向?qū)ο蟮姆庋b,繼承,多態(tài),抽象

    這篇文章主要介紹了Java基礎(chǔ)之面向?qū)ο髾C制(多態(tài)、繼承)底層實現(xiàn),文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-07-07
  • java實現(xiàn)的密碼強度檢測功能完整示例

    java實現(xiàn)的密碼強度檢測功能完整示例

    這篇文章主要介紹了java實現(xiàn)的密碼強度檢測功能,結(jié)合完整實例形式分析了java針對密碼強度檢測相關(guān)的字符串遍歷、判斷,以及輸出密碼強度等級相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • Java小程序求圓的周長和面積實例

    Java小程序求圓的周長和面積實例

    這篇文章主要介紹了首先用蒙塔卡洛算法求圓周率近似值,然后根據(jù)此近似值輸出圓的周長和面積,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • MyBatis接口的簡單實現(xiàn)原理分析

    MyBatis接口的簡單實現(xiàn)原理分析

    這里僅僅舉個簡單例子來說明原理,不是完全針對MyBatis的,這種思想我們也可以應(yīng)用在其他地方。地mybatis接口實現(xiàn)原理感興趣的朋友一起看看吧
    2017-07-07
  • 如何利用Stream改變list中特定對象的某一屬性

    如何利用Stream改變list中特定對象的某一屬性

    這篇文章主要介紹了如何利用Stream改變list中特定對象的某一屬性問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • mybatis-plus開啟sql日志打印的三種方法

    mybatis-plus開啟sql日志打印的三種方法

    本文主要介紹了mybatis-plus開啟sql日志打印的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Java 反射類型Type的用法說明

    Java 反射類型Type的用法說明

    這篇文章主要介紹了Java 反射類型Type的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • 詳解Java程序讀取properties配置文件的方法

    詳解Java程序讀取properties配置文件的方法

    這篇文章主要介紹了Java讀取properties配置文件的方法講解,properties可以被看作是Java世界的ini,Java中有Properties可以操作它,需要的朋友可以參考下
    2016-04-04
  • SpringBoot框架如何操作Excel和PDF

    SpringBoot框架如何操作Excel和PDF

    Excel和PDF都是常見的辦公文件類型,在實際需求中有著較多的應(yīng)用,excel經(jīng)常用來處理數(shù)據(jù),PDF文件格式可以將文字、字型、格式、顏色及獨立于設(shè)備和分辨率的圖形圖像等封裝在一個文件中,本文就講述下SpringBoot框架如何操作這兩種類型的文件
    2021-06-06
  • 常用json與javabean互轉(zhuǎn)的方法實現(xiàn)

    常用json與javabean互轉(zhuǎn)的方法實現(xiàn)

    這篇文章主要介紹了常用json與javabean互轉(zhuǎn)的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論