亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

package cn.me.test;

import java.io.InputStream;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;

/**

 * 多線程下載

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

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

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

 * 3:必須要在下載之前準(zhǔn)備好相同大小的文件,通過(guò)文件頭獲取

 */

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è)置請(qǐng)求方式

       con.setRequestMethod("GET");

       //5:獲取請(qǐng)求頭,即文件的長(zhǎng)度

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

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

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

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

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

 

       file.close();

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

       int size = 3;

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

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


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

       //10:運(yùn)行三個(gè)線程并計(jì)算從哪個(gè)字節(jié)開(kāi)始到哪一個(gè)字節(jié)結(jié)束

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

           int start = i*block;

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

 

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

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

       }

    }

    static class MyDownThread extends Thread{

       //定義文件名

       private String fileName;

       //定義從何地開(kāi)始下載

       private int start;

       //定義下載到哪一個(gè)字節(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:開(kāi)始下載

              HttpURLConnection con =

                     (HttpURLConnection) url.openConnection();

              con.setRequestMethod("GET");

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

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

 

              //13:開(kāi)始下載,需要判斷206

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

                  InputStream in = con.getInputStream();

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

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

                  out.seek(start);//設(shè)置從文件的某個(gè)位置開(kāi)始寫(xiě)數(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)文章

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

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

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

    java實(shí)現(xiàn)的密碼強(qiáng)度檢測(cè)功能完整示例

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

    Java小程序求圓的周長(zhǎng)和面積實(shí)例

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

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

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

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

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

    mybatis-plus開(kāi)啟sql日志打印的三種方法

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

    Java 反射類型Type的用法說(shuō)明

    這篇文章主要介紹了Java 反射類型Type的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    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都是常見(jiàn)的辦公文件類型,在實(shí)際需求中有著較多的應(yīng)用,excel經(jīng)常用來(lái)處理數(shù)據(jù),PDF文件格式可以將文字、字型、格式、顏色及獨(dú)立于設(shè)備和分辨率的圖形圖像等封裝在一個(gè)文件中,本文就講述下SpringBoot框架如何操作這兩種類型的文件
    2021-06-06
  • 常用json與javabean互轉(zhuǎn)的方法實(shí)現(xiàn)

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

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

最新評(píng)論