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

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

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

瀏覽:173日期: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久久,三上悠亚国产精品一区二区三区
欧美一区=区| 国产精品久久久久久久久久10秀| 亚洲韩日在线| 综合国产在线| 波多野结衣久久精品| 亚洲人成网77777色在线播放| 成人午夜网址| 日韩高清电影免费| 性色一区二区| 亚洲欧美网站| 亚洲大全视频| 中文字幕一区久| 国产精品115| 日韩高清欧美激情| 亚洲欧美伊人| 成人欧美一区二区三区的电影| 奇米亚洲欧美| 在线国产日韩| 亚洲久草在线| 亚洲精品在线二区| 伊人精品久久| 日本综合精品一区| 日韩极品在线观看| 国产日韩精品视频一区二区三区| 亚洲伊人精品酒店| 日本亚洲三级在线| 日韩欧美在线精品| 欧美精品影院| 麻豆精品蜜桃视频网站| 国产探花在线精品| 国产高清精品二区| 日韩精品91| 免费久久99精品国产自在现线| 快she精品国产999| 奇米狠狠一区二区三区| 国产精品chinese| 高清不卡一区| 在线精品小视频| 日韩精品免费一区二区夜夜嗨 | aa国产精品| 日韩精品成人在线观看| 麻豆传媒一区二区三区| 国产激情在线播放| 国产中文一区| 国产日产精品_国产精品毛片 | 国产盗摄——sm在线视频| 欧美在线精品一区| 国产精品扒开腿做爽爽爽软件| 国产精品嫩模av在线| 免费一级欧美片在线观看网站| 久久精品国产99国产| 欧美日韩国产传媒| 91福利精品在线观看| 国产精品99久久精品| 美女久久网站| 精品日产乱码久久久久久仙踪林| 一区久久精品| 麻豆中文一区二区| 亚洲一区导航| 婷婷综合网站| 日韩综合在线| 伊人久久亚洲| 久久高清免费| 老司机精品视频在线播放| 亚洲网址在线观看| 99成人在线视频| 另类小说一区二区三区| 日本免费在线视频不卡一不卡二| 亚洲福利专区| 婷婷精品视频| 日韩欧美中文| yellow在线观看网址| 群体交乱之放荡娇妻一区二区| 亚洲一区二区动漫| 久久青草久久| 亚洲天堂久久| 免费一区二区三区在线视频| 丝袜美腿亚洲一区二区图片| 久久精品1区| 欧美99久久| 亚洲激情国产| 噜噜噜躁狠狠躁狠狠精品视频 | 国产欧美69| 欧美成人一二区| 高清在线一区| 999国产精品999久久久久久| 日韩在线观看不卡| 欧美日韩精品在线一区| 亚洲精品一二三区区别| 日韩中文影院| 久久国产成人午夜av影院宅| 91久久久精品国产| 免费在线观看一区二区三区| 综合一区在线| 风间由美中文字幕在线看视频国产欧美| 国产一区一一区高清不卡| av资源中文在线天堂| 蜜桃tv一区二区三区| 亚洲影院天堂中文av色| 国产免费播放一区二区| 久久电影tv| 三级欧美在线一区| 久久a爱视频| 国产午夜精品一区二区三区欧美 | 亚洲一区亚洲| 国产亚洲高清在线观看| 日韩精品首页| 久久影视一区| 91久久久精品国产| 综合一区二区三区| 色偷偷色偷偷色偷偷在线视频| 国产一区二区三区自拍| 国产视频网站一区二区三区| 91欧美国产| 日本久久二区| 美女日韩在线中文字幕| 日韩av免费大片| 欧美精品影院| 亚洲欧美日本视频在线观看| 久久中文字幕一区二区三区| 日韩在线a电影| 99精品视频在线| 国模大尺度视频一区二区| 欧美日韩亚洲一区在线观看| 亚洲主播在线| 中文日韩欧美| 国产91精品对白在线播放| 国产一区二区三区亚洲| 免费在线观看成人| 亚洲小说欧美另类婷婷| 波多视频一区| 成人精品天堂一区二区三区| 免费一级欧美在线观看视频| 国产伦精品一区二区三区视频| 中文不卡在线| 少妇高潮一区二区三区99| 日本 国产 欧美色综合| 亚洲欧美日韩一区在线观看| 国产农村妇女精品一二区| 一区二区三区四区精品视频| 久久精品青草| 亚洲综合在线电影| 欧美日韩国产免费观看视频| 日韩欧美字幕| 91精品91| 日韩影片在线观看| 欧美日本三区| 日韩av有码| 欧美日韩国产高清电影| 国产亚洲综合精品| 免费一区二区视频| 91嫩草精品| 日本久久黄色| 亚洲一区二区毛片| 91精品啪在线观看国产爱臀| 免费一级欧美片在线观看网站| 91日韩欧美| 中文字幕中文字幕精品| 午夜天堂精品久久久久| 久久国产精品美女| 久久激情网站| 国产欧美日韩一区二区三区在线| 国内在线观看一区二区三区| 激情久久久久久| 日韩一区二区三区精品| 精品久久中文| 视频在线在亚洲| 国产日韩欧美三级| 久久亚洲电影| 国产一区成人| 色一区二区三区四区| 99国产精品| 精品一区二区三区中文字幕在线| 国产成人精品一区二区免费看京| 91精品福利| 都市激情国产精品| 国产日产一区| 日韩欧美美女在线观看| 午夜久久免费观看| 国产一区二区三区四区| 91精品国产自产观看在线| 午夜欧美视频| 婷婷亚洲五月色综合| 神马午夜在线视频| 精品三级av在线导航| 精品资源在线| 精品国产a一区二区三区v免费| 91福利精品在线观看| 免费在线观看一区二区三区| 欧美99久久| 亚洲高清av| 99国产精品久久久久久久| 四虎884aa成人精品最新| 久久精品福利| 日韩av有码| 亚洲天堂久久| 免费成人在线影院| 婷婷综合福利| 麻豆精品视频在线观看| 精品国产乱码|