老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)

怎么在Java中利用多線程實(shí)現(xiàn)分片下載文件

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎么在Java中利用多線程實(shí)現(xiàn)分片下載文件,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都網(wǎng)站建設(shè)、成都網(wǎng)站制作過(guò)程中,需要針對(duì)客戶的行業(yè)特點(diǎn)、產(chǎn)品特性、目標(biāo)受眾和市場(chǎng)情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計(jì)方向。創(chuàng)新互聯(lián)建站還需要根據(jù)客戶的需求進(jìn)行功能模塊的開(kāi)發(fā)和設(shè)計(jì),包括內(nèi)容管理、前臺(tái)展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計(jì)和安全保護(hù)等功能。

1、如何請(qǐng)求才能拿到數(shù)據(jù)的特定部分,而非全部?

可以在HTTP請(qǐng)求頭中加入Range來(lái)標(biāo)識(shí)數(shù)據(jù)的請(qǐng)求范圍/區(qū)間,從HTTP/1.1開(kāi)始可用。

基本用法:

Range: bytes=10-:取第10個(gè)字節(jié)及后所有數(shù)據(jù)。

Range: bytes=40-100:取第40個(gè)字節(jié)到第100個(gè)字節(jié)之間的數(shù)據(jù)。

這樣我們就能拿到特定部分的數(shù)據(jù)了,斷點(diǎn)續(xù)傳也可以用這個(gè)來(lái)實(shí)現(xiàn)。

PS:0為開(kāi)始點(diǎn)。

2、分片后某線程下載時(shí)如何寫出?

思路1:等所有下載完成后進(jìn)行統(tǒng)一匯總整理然后再一次性寫出。

這簡(jiǎn)直是最笨的思路了,如果文件過(guò)大全部拉到內(nèi)存中,豈不涼涼。

思路2:下載采用多線程,寫出時(shí)采取數(shù)據(jù)前后順序排隊(duì)寫出。

也就是說(shuō)多線程下載,單線程輸出,某種程度解決了內(nèi)存占用問(wèn)題,不過(guò)效率基本不理想。

思路3:要說(shuō)還是API香,老大哥Java給我們提供了一個(gè)類叫做RandomAccessFile。

這個(gè)類可以進(jìn)行隨機(jī)文件讀寫,其中有一個(gè)seek函數(shù),可以將指針指向任意位置,然后進(jìn)行讀寫。什么意思呢,舉個(gè)栗子:假如我們開(kāi)了30個(gè)線程,首先第一個(gè)下載完成的是線程X,它下載的數(shù)據(jù)范圍是4000-9000,那么這時(shí)我們調(diào)用seek函數(shù)將指針撥動(dòng)到4000,然后調(diào)用它的write函數(shù)將byte寫出,這時(shí)4000之前都是NULL,4000之后就是我們插入的數(shù)據(jù)。這樣就可以實(shí)現(xiàn)多線程下載和本地寫入了。

具體實(shí)現(xiàn)

一個(gè)分片下載類,我們需要?jiǎng)?chuàng)建多個(gè)對(duì)象來(lái)進(jìn)行下載。

public class UnitDownloader implements Runnable {
  private int from;
  private int to;
  private File target;
  private String uri;
  private int id;

  public UnitDownloader(int from, int to, File target, String uri, int id) {
    this.from = from;
    this.to = to;
    this.target = target;
    this.uri = uri;
    this.id = id;
  }

  public int getFrom() {
    return from;
  }

  public int getTo() {
    return to;
  }

  @Override
  public void run() {
    //download and save data
    try {
      HttpURLConnection connection = (HttpURLConnection) new URL(uri).openConnection();
      connection.setRequestProperty("Range", "bytes=" + from + "-" + to);
      connection.connect();
      int totalSize = connection.getContentLength();
      InputStream inputStream = connection.getInputStream();
      RandomAccessFile randomAccessFile = new RandomAccessFile(target, "rw");
      randomAccessFile.seek(from);
      byte[] buffer = new byte[1024 * 1024];
      int readCount = inputStream.read(buffer, 0, buffer.length);
      while (readCount > 0) {
        totalSize -= readCount;
        System.out.println("分片:" + this.id + "的剩余:" + totalSize);
        randomAccessFile.write(buffer, 0, readCount);
        readCount = inputStream.read(buffer, 0, buffer.length);
      }
      inputStream.close();
      randomAccessFile.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

分片下載管理器,主要就是拿到內(nèi)容的總大小,將其分配給每一個(gè)UnitDownloader。這里的threadCount函數(shù)可以再考慮優(yōu)化一下。

public class MultipleThreadDownloadManager implements Runnable {
  private String uri;
  private File target;

  public MultipleThreadDownloadManager(String uri, File target) {
    this.target = target;
    this.uri = uri;
    if (target.exists() == false) {
      try {
        target.createNewFile();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 開(kāi)始下載
   */
  public void start() {
    new Thread(this).start();
  }


  /**
   * 根據(jù)文件總大小計(jì)算線程數(shù)量
   *
   * @param totalSize
   * @return
   */
  public int threadCount(int totalSize) {
    if (totalSize < 30 * 2014 * 1024) {
      return 1;
    }
    return 30;
  }


  @Override
  public void run() {
    //獲取文件總大小
    int totalSize = 0;
    try {
      HttpURLConnection connection = (HttpURLConnection) new URL(uri).openConnection();
      connection.connect();
      int contentLength = connection.getContentLength();
      totalSize = contentLength;
    } catch (IOException e) {
      e.printStackTrace();
    }
    //將文件分片并分開(kāi)下載
    int threadCount = threadCount(totalSize);
    int perThreadSize = totalSize / threadCount;//每一個(gè)線程分到的任務(wù)下載量
    int id = 0;
    int from = 0, to = 0;
    while (totalSize > 0) {
      id++;
      //計(jì)算分片
      if (totalSize < perThreadSize) {
        from = 0;
        to = totalSize;
      } else {
        from = totalSize;
        to = from + perThreadSize;
      }
      //開(kāi)始下載
      UnitDownloader downloader = new UnitDownloader(from, to, target, uri, id);
      new Thread(downloader).start();
    }
  }
}

上述就是小編為大家分享的怎么在Java中利用多線程實(shí)現(xiàn)分片下載文件了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站名稱:怎么在Java中利用多線程實(shí)現(xiàn)分片下載文件
鏈接URL:http://www.xueling.net.cn/article/piijic.html

其他資訊

在線咨詢
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 天天操天天操天天操天天 | 国产一区二区三区夜色 | 人人玩人人添人人澡免费 | 久久精品亚洲乱码伦伦中文 | 在线看片免费人成视频大全 | 污污网站免费看 | 熟妇人妻va精品中文字幕 | 亚洲人成网站在线播放无码 | 国产欧美一区二区三区久久 | 色七七桃花综合影院 | 日本久久99 | 在线成人免费观看视频 | 欧美熟妇色xxxx | 香港三级韩国三级日本三级 | 午夜福利看757 | 亚洲国产精品久久久久秋霞小 | 逼特逼在线观看 | 古代级a毛片可以免费看 | 日韩精品视频在线一区二区三区 | 国产经典一区二区三区 | 女教师办公室被强在线播放 | 日日碰狠狠添天天爽五月婷 | 97成人在线视频 | 久久亚洲精品无码Va白人极品 | 国产一区视频在线播放 | 91精品激情在线?看最新更新 | 91av官网| 国产三级精品三级国产 | 日本精品久久久久影院 | 少妇做爰高潮呻吟A片免费 亚洲AV永久无码天堂影院黑人 | 在线色影院 | 吉林小伟无套gay | 免费精品视频91啪国 | 国产人妻人伦精品1国产盗摄 | 精品一线二线三线区别在哪欧美 | 成人av一级 | av亚洲在线观看 | 女人与牲口性恔配视频免费 | 222aaa精品影院 | 黄色一级小视频 | 免费B站在线观看人数在哪儿找 |