日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java多線程文件分片下載實現的示例代碼

瀏覽:171日期:2022-09-04 18:54:27

多線程下載介紹

多線程下載技術是很常見的一種下載方案,這種方式充分利用了多線程的優勢,在同一時間段內通過多個線程發起下載請求,將需要下載的數據分割成多個部分,每一個線程只負責下載其中一個部分,然后將下載后的數據組裝成完整的數據文件,這樣便大大加快了下載效率。常見的下載器,迅雷,QQ旋風等都采用了這種技術。

分片下載

所謂分片下載就是要利用多線程的優勢,將要下載的文件一塊一塊的分配到各個線程中去下載,這樣就極大的提高了下載速度。

技術難點

并不能說是什么難點,只能說沒接觸過不知道罷了。

1、如何請求才能拿到數據的特定部分,而非全部?

可以在HTTP請求頭中加入Range來標識數據的請求范圍/區間,從HTTP/1.1開始可用。

基本用法:

Range: bytes=10-:取第10個字節及后所有數據。

Range: bytes=40-100:取第40個字節到第100個字節之間的數據。

這樣我們就能拿到特定部分的數據了,斷點續傳也可以用這個來實現。

PS:0為開始點。

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

思路1:等所有下載完成后進行統一匯總整理然后再一次性寫出。

這簡直是最笨的思路了,如果文件過大全部拉到內存中,豈不涼涼。

思路2:下載采用多線程,寫出時采取數據前后順序排隊寫出。

也就是說多線程下載,單線程輸出,某種程度解決了內存占用問題,不過效率基本不理想。

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

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

具體實現

一個分片下載類,我們需要創建多個對象來進行下載。

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(); } }}

分片下載管理器,主要就是拿到內容的總大小,將其分配給每一個UnitDownloader。這里的threadCount函數可以再考慮優化一下。

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(); } } } /** * 開始下載 */ public void start() { new Thread(this).start(); } /** * 根據文件總大小計算線程數量 * * @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(); } //將文件分片并分開下載 int threadCount = threadCount(totalSize); int perThreadSize = totalSize / threadCount;//每一個線程分到的任務下載量 int id = 0; int from = 0, to = 0; while (totalSize > 0) { id++; //計算分片 if (totalSize < perThreadSize) {from = 0;to = totalSize; } else {from = totalSize;to = from + perThreadSize; } //開始下載 UnitDownloader downloader = new UnitDownloader(from, to, target, uri, id); new Thread(downloader).start(); } }}

參考文獻

1、https://emacsist.github.io/2015/12/29/http-%E5%8D%8F%E8%AE%AE%E4%B8%AD%E7%9A%84range%E8%AF%B7%E6%B1%82%E5%A4%B4%E4%BE%8B%E5%AD%90/

2、https://blog.csdn.net/lyt_7cs1dn9/article/details/75105266

到此這篇關于Java多線程文件分片下載實現的示例代碼的文章就介紹到這了,更多相關Java多線程分片下載內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品一级视频| 国产一二在线播放| 美女毛片一区二区三区四区| 日韩精品诱惑一区?区三区| 精品伊人久久久| 美女视频黄久久| 欧美精品aa| 精品视频在线观看网站| 美女精品视频在线| 红杏一区二区三区| 亚洲精品永久免费视频| 欧美aaaaaa午夜精品| 麻豆精品视频在线观看视频| 久久精品国产99国产| 久久中文精品| 国产a久久精品一区二区三区| 激情综合婷婷| 88xx成人免费观看视频库| 99国产精品免费视频观看| 亚洲天堂成人| 亚洲色图国产| 国产亚洲第一伦理第一区| 久久av电影| 成人午夜毛片| 久久三级福利| 久久香蕉精品| 免费在线看一区| 日韩高清一区| 精品一区电影| 一区视频在线| 日韩高清不卡在线| 久久亚洲人体| 伊人久久大香线蕉av不卡| 首页国产欧美日韩丝袜| 欧美一级全黄| 日韩88av| 国产视频一区欧美| 国产伦理一区| 久久要要av| 亚洲精品日韩久久| 久久只有精品| 亚洲播播91| 亚洲涩涩av| 精品国产欧美| 好吊日精品视频| 国产精品流白浆在线观看| 成人片免费看| 亚洲日本欧美| 精品久久久中文字幕| 午夜日本精品| 国产精品毛片久久久| 欧美亚洲国产激情| 欧美性www| 999久久久91| 欧美午夜三级| 免费av一区二区三区四区| 蜜臀av国产精品久久久久| 麻豆国产精品一区二区三区| 欧美大黑bbbbbbbbb在线| 欧美日韩一区二区三区不卡视频 | 精品日本视频| 欧美中文字幕| 国产一区二区三区四区大秀| 国产亚洲精品久久久久婷婷瑜伽| 国产精品久久久久久久久久白浆| 久久精品国产99久久| 久久精品99国产国产精| 亚洲国产专区校园欧美| 国产九一精品| 国产免费成人| 久久久久亚洲精品中文字幕| 先锋影音国产一区| 日韩欧美国产精品综合嫩v| 日韩精品中文字幕一区二区| 久久天堂精品| 久久一区国产| 天堂俺去俺来也www久久婷婷| 日本欧美不卡| 国产精品白丝av嫩草影院| 亚洲国产日韩欧美在线| 精品久久不卡| 日本一区二区三区中文字幕| 久久国产日本精品| 欧美日韩亚洲一区| 午夜在线一区| 国产精品99一区二区三| 日韩精品免费视频人成| 亚洲二区免费| 狠狠久久伊人| 欧美欧美黄在线二区| 国产免费成人| 日韩网站中文字幕| 久久中文欧美| 国产丝袜一区| 亚洲精品日本| 在线亚洲免费| 欧美1区2区3区| 91麻豆国产自产在线观看亚洲| 国产欧美成人| 日韩精品电影一区亚洲| 国产一区亚洲| 欧美日韩免费观看视频| 精品国产亚洲一区二区三区大结局| 午夜久久av| 美女久久网站| 女人天堂亚洲aⅴ在线观看| 综合日韩av| 精品久久97| 精品一区视频| 美女视频黄 久久| 国产精品国码视频| 久久国内精品| 久久精品 人人爱| 欧美日韩夜夜| 国产亚洲久久| 亚洲精品在线a| 综合国产在线| 亚州av日韩av| 亚洲精品动态| 日韩精品久久理论片| 日韩国产高清在线| 国产日韩欧美一区二区三区在线观看 | 精品一区二区男人吃奶| 久久国产生活片100| 日韩中文字幕一区二区三区| 欧美特黄一级| 亚洲一区二区三区免费在线观看| 欧美va亚洲va日韩∨a综合色| 日本综合字幕| 视频二区不卡| 国产成人精品亚洲日本在线观看| 日韩欧美字幕| 999精品在线| 国产亚洲网站| 免费成人av在线播放| 亚洲资源网站| 69堂免费精品视频在线播放| 国产欧美亚洲精品a| 国产精品啊啊啊| 国产精品一级| 欧美精品不卡| 日韩欧美1区| 欧美搞黄网站| 亚洲欧美日本国产专区一区| 亚洲一二三区视频| 日韩精品a在线观看91| 国产伦一区二区三区| 久久精品国产一区二区| 中文在线资源| 偷拍欧美精品| 一区二区三区四区精品视频| 日韩动漫一区| 精品国产aⅴ| 久久中文字幕av| aⅴ色国产欧美| 日本在线视频一区二区| 国产另类在线| 九九色在线视频| 香蕉成人久久| 日韩不卡手机在线v区| 欧美a在线观看| 999精品在线| 午夜精品影视国产一区在线麻豆| 国产亚洲欧美日韩在线观看一区二区 | 久久xxxx| 国产精品天天看天天狠| 最新中文字幕在线播放| 99久久99视频只有精品| 久久福利精品| 国产精品男女| 久久男女视频| 日韩国产一区二| 日韩国产在线| 中文字幕乱码亚洲无线精品一区| 国产精品久久久久久妇女 | 麻豆91精品91久久久的内涵| 免费高潮视频95在线观看网站| 国产精品毛片| 欧美日韩一区二区国产| 欧美日韩精品免费观看视欧美高清免费大片 | 久久精品国产大片免费观看| 天堂久久av| 精品免费av在线| 亚洲开心激情| 中文字幕成在线观看| 日韩在线黄色| 成人久久一区| 国产精品亚洲片在线播放| 欧美日韩一二| 国产精品一区二区三区av| 成人羞羞在线观看网站| 中文字幕免费精品| 蜜桃av.网站在线观看| 日韩精品免费一区二区夜夜嗨 | 亚洲尤物在线| 91日韩在线| 奇米亚洲欧美| 欧美日一区二区| 国产激情一区| 老鸭窝毛片一区二区三区|