最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • spring boot集成rabbitmq的實例教程

    spring boot集成rabbitmq的實例教程

    這篇文章主要給大家介紹了關(guān)于spring boot集成rabbitmq的相關(guān)資料,springboot集成RabbitMQ非常簡單,文中通過示例代碼介紹的非常詳細,需要的朋友們可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Java 單例模式線程安全問題

    Java 單例模式線程安全問題

    這篇文章主要介紹了Java 單例模式線程安全問題的相關(guān)資料,希望通過本文大家能了解掌握單例模式中線程安全的使用方法,需要的朋友可以參考下
    2017-09-09
  • Java基礎(chǔ)之switch分支結(jié)構(gòu)詳解

    Java基礎(chǔ)之switch分支結(jié)構(gòu)詳解

    這篇文章主要介紹了Java基礎(chǔ)之switch分支結(jié)構(gòu)詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-05-05
  • mybatis日志打印的兩款I(lǐng)DEA插件推薦

    mybatis日志打印的兩款I(lǐng)DEA插件推薦

    這篇文章主要給大家推薦介紹了關(guān)于mybatis日志打印的兩款I(lǐng)DEA插件,文中通過圖文以及實例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-04-04
  • Java后端向前端返回文件流實現(xiàn)下載功能的方法

    Java后端向前端返回文件流實現(xiàn)下載功能的方法

    這篇文章主要給大家介紹了關(guān)于Java后端向前端返回文件流實現(xiàn)下載功能的相關(guān)資料,Java后端可以通過調(diào)用接口返回文件流來實現(xiàn)文件傳輸功能,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • 使用 Apache POI 在 Java 中寫入 Excel 文件的方法

    使用 Apache POI 在 Java 中寫入 Excel

    這篇文章詳細介紹了如何使用ApachePOI在Java中編寫Excel文件的技巧,包括創(chuàng)建工作簿、工作表、行和單元格,以及如何處理不同版本的Excel文件,通過詳細的步驟和代碼示例,讀者可以快速掌握ApachePOI的基本使用方法,感興趣的朋友一起看看吧
    2025-02-02
  • 解決SpringBoot項目啟動成功但接口訪問404的問題

    解決SpringBoot項目啟動成功但接口訪問404的問題

    這篇文章主要介紹了如何解決SpringBoot項目啟動成功但接口訪問404的問題,具有很好的參考價值,希望對大家有所幫助,接下來就跟著小編一起來看看吧
    2023-07-07
  • SpringBoot使用Flyway進行數(shù)據(jù)庫管理的操作方法

    SpringBoot使用Flyway進行數(shù)據(jù)庫管理的操作方法

    Flyway是一個開源的數(shù)據(jù)庫版本管理工具,并且極力主張“約定大于配置”,簡單、專注、強大。接下來通過本文給大家介紹SpringBoot使用Flyway進行數(shù)據(jù)庫管理的方法,感興趣的朋友一起看看吧
    2021-09-09
  • 使用log4j2關(guān)閉debug日志

    使用log4j2關(guān)閉debug日志

    這篇文章主要介紹了使用log4j2關(guān)閉debug日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringCloud如何根據(jù)服務(wù)名獲取服務(wù)運行實例并進行負載均衡

    SpringCloud如何根據(jù)服務(wù)名獲取服務(wù)運行實例并進行負載均衡

    文章介紹了SpringCloud中使用Nacos作為注冊中心時,服務(wù)注冊和發(fā)現(xiàn)的過程,以及如何通過DiscoveryClient接口和LoadBalancerClient類進行服務(wù)的負載均衡,感興趣的朋友跟隨小編一起看看吧
    2025-01-01

最新評論

德庆县| 兴隆县| 鄢陵县| 哈尔滨市| 泾川县| 青海省| 孝昌县| 宁德市| 五指山市| 赣州市| 龙州县| 威宁| 沭阳县| 余姚市| 贵州省| 金昌市| 花垣县| 旺苍县| 绥江县| 石嘴山市| 汉中市| 威海市| 昌图县| 砚山县| 东源县| 合作市| 鹰潭市| 弥勒县| 青神县| 阿拉尔市| 文登市| 临沂市| 天全县| 铜鼓县| 宁都县| 托克逊县| 尼木县| 正安县| 邹城市| 永泰县| 巴马|