日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)

發布時間:2025/3/20 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 為什么需要多線程下載?

? ? 服務器的資源有限,同時的平均地分配給每個客戶端。開啟的線程越多搶占的服務的資源就越多,下載的速度就越塊。

2. 下載速度的限制條件?

(1)你的電腦手機寬帶的帶寬。(網絡運營商給用戶的限制

(2)服務器上傳的帶寬限制。 (服務器端資源獲取速度的限制)----迅雷, p2p快播等下載,可以同時間使用多臺服務器幫助用戶下載資源,速度自然會加快。

注意:并不是開的線程越多下載速度越快,可能會消耗大量時間在線程調度上。

Android下推薦開啟:3 ~ 5線程。

3. 如何進行多線程的下載:

(1)在客戶端本地創建一個空文件(申請一塊內存),大小要和服務器上要下載的資源一樣.

(2)開啟3個線程,都去下載服務器的數據.

(3)當三個線程都工作完畢后,多線程的下載就結束了.

?

?這里特別注意最后一個線程需要修正,主要是因為不可能實現完全等分,具體如下:

?

4.JavaSE代碼實現多線程下載

?(1)我們可以先編寫java項目工程,調試實現多線程下載邏輯類MutilDownloader.java:

?

?(2)打開Apache服務器,在相應的目錄下存放測試下載文件,如下:

?

(3)MutilDownloader.java,如下:

1 package com.himi.mutildownload; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.InputStream; 7 import java.io.InputStreamReader; 8 import java.io.RandomAccessFile; 9 import java.net.HttpURLConnection; 10 import java.net.URL; 11 12 /** 13 * 多線程的下載器 14 * 15 */ 16 public class MutilDownloader { 17 /** 18 * Apache服務器上資源下載的路徑 19 */ 20 private static final String path = "http://49.123.76.170/movies/test.avi"; 21 /** 22 * 多少個線程去下載服務器的資源 23 */ 24 private static int threadCount = 4; 25 26 /** 27 * 正在運行的線程的數量 28 */ 29 private static int runningThreadCount; 30 31 public static void main(String[] args) throws Exception { 32 URL url = new URL(path); 33 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 34 conn.setRequestMethod("GET"); 35 int code = conn.getResponseCode(); 36 if (code == 200) { 37 int length = conn.getContentLength(); 38 System.out.println("服務器文件的大小為:" + length); 39 40 // 1. 創建一個空白文件文件的大小和服務器資源一樣 41 RandomAccessFile raf = new RandomAccessFile(getFileName(path), "rw"); 42 raf.setLength(length); 43 raf.close(); 44 45 // 每個線程下載的平均區塊大小 46 int blocksize = length / threadCount; 47 System.out.println("每一份:" + blocksize); 48 49 runningThreadCount = threadCount; 50 // 2. 開啟3個線程,都去下載服務器的對應數據 51 for (int threadId = 0; threadId < threadCount; threadId++) { 52 int startIndex = threadId * blocksize; 53 int endIndex = (threadId + 1) * blocksize - 1; 54 55 // 最后一個線程的修正,最后一個線程endIndex設置為文件末尾 56 if (threadId == (threadCount - 1)) { 57 endIndex = length - 1;// 文件byte是從0開始計數的 58 } 59 60 new DownloadThread(startIndex, endIndex, threadId).start(); 61 } 62 } 63 64 // 3. 當三個線程都工作完畢后,多線程的下載就結束了. 65 66 } 67 68 public static class DownloadThread extends Thread { 69 /** 70 * 線程id 71 */ 72 int threadId; 73 74 /** 75 * 當前線程下載的開始位置 76 */ 77 int startIndex; 78 /** 79 * 當前線程下載的結束位置 80 */ 81 int endIndex; 82 83 /** 84 * 當前線程下載到文件的位置 85 */ 86 int filePosition; 87 88 /** 89 * 90 * @param startIndex 91 * 開始位置 92 * @param endIndex 93 * 結束位置 94 * @param threadId 95 * 線程id 96 */ 97 public DownloadThread(int startIndex, int endIndex, int threadId) { 98 this.startIndex = startIndex; 99 this.endIndex = endIndex; 100 this.threadId = threadId; 101 filePosition = startIndex; 102 } 103 104 @Override 105 public void run() { 106 try { 107 // 用一個文本記錄當前線程下載的進程 108 File file = new File(threadId + getFileName(path) + ".txt"); 109 110 if (file.exists() && file.length() > 0) { 111 FileInputStream fis = new FileInputStream(file); 112 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); 113 filePosition = Integer.parseInt(br.readLine());// 上一次下載到文件的哪個位子。 114 startIndex = filePosition; 115 fis.close(); 116 } 117 118 System.out.println("線程:" + threadId + "實際上下載的位置:" + startIndex + "~~~" + endIndex); 119 120 URL url = new URL(path); 121 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 122 conn.setRequestMethod("GET"); 123 // 指定從服務器下載的范圍,http請求的頭 124 conn.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex); 125 126 int code = conn.getResponseCode();// 2XX成功 3XX重定向 4XX資源找不到 127 // 5XX服務器異常 128 if (code == 206) {// 206:表示請求部分數據成功 129 // 返回服務器端對應數據的輸入流 130 InputStream is = conn.getInputStream(); 131 RandomAccessFile raf = new RandomAccessFile(getFileName(path), "rwd"); 132 133 /** 134 * ☆☆☆☆☆非常重要☆☆☆☆☆ 一定要記得定位文件寫的位置 135 * 不同線程在文件中(代碼開頭:創建的空文件)開始寫入的位置是不一樣的 136 */ 137 raf.seek(startIndex); 138 byte[] buffer = new byte[1024 * 1024 * 10]; 139 int len = -1; 140 while ((len = is.read(buffer)) != -1) { 141 raf.write(buffer, 0, len); 142 filePosition += len; 143 RandomAccessFile rafinfo = new RandomAccessFile(file, "rwd"); 144 rafinfo.write(String.valueOf(filePosition).getBytes()); 145 rafinfo.close(); 146 } 147 raf.close(); 148 is.close(); 149 150 System.out.println("線程:" + threadId + "下載完畢了。"); 151 152 } 153 } catch (Exception e) { 154 e.printStackTrace(); 155 } finally { 156 157 // 三個線程都結束了,下載完畢 158 synchronized (MutilDownloader.class) { 159 runningThreadCount--; 160 if (runningThreadCount == 0) { 161 System.out.println("所有的線程都下載完畢了"); 162 for (int i = 0; i < threadCount; i++) { 163 File f = new File(i + getFileName(path) + ".txt"); 164 System.out.println(f.delete()); 165 } 166 } 167 } 168 } 169 } 170 } 171 172 /** 173 * 獲取路徑對應的文件名 174 * 175 * @param path 176 * @return 177 */ 178 private static String getFileName(String path) { 179 int beginIndex = path.lastIndexOf("/") + 1; 180 return path.substring(beginIndex); 181 } 182 183 }

需要特別注意的是:RandomAccessFile.seek(startIndex),它是用來定位文件寫入的位置。

?

運行程序,觀察Console,如下:

刷新Java工程項目,如下:

?

雙擊打開test.avi,發現是可以播放的。

?

轉載于:https://www.cnblogs.com/hebao0514/p/4790941.html

總結

以上是生活随笔為你收集整理的Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 超碰人人插 | 亚洲国产第一区 | 亚洲成年人免费观看 | 精品91久久久久久 | 欧美一区视频在线 | wwwxxx日韩| 孕妇毛片| 91蝌蚪视频在线 | 国产综合无码一区二区色蜜蜜 | av高清在线免费观看 | 一区二区三区小视频 | 欧美日韩中文字幕在线观看 | 男女靠逼视频 | 97视频一区二区三区 | 色欲亚洲Av无码精品天堂 | 亚洲午夜久久 | 国产美女av| 另类专区亚洲 | 高清视频一区二区三区 | 亚洲综合另类 | 伦av综合一区 | 午夜精品电影 | 狠狠干精品 | 午夜色影院| 猎艳山村丰满少妇 | 久久精品亚洲精品 | 西比尔在线观看完整视频高清 | 日本一区二区三区视频免费看 | 色偷偷综合| 人人妻人人澡人人爽人人欧美一区 | 户外露出一区二区三区 | 亚洲精品女人久久久 | 蜜臀免费av | 国产乱码久久久久 | 久操精品在线 | 特淫毛片 | 欧美性视频在线 | gav在线| 国内外成人在线视频 | 欧美日韩一区二区视频在线观看 | 国产特级毛片aaaaaa | 亚洲av永久无码精品一区二区国产 | 欧美性生交大片免费看app麻豆 | 色婷婷aⅴ一区二区三区 | 九九久视频 | 理想之城连续剧40集免费播放 | 中文字幕人妻一区 | 国产精品久久久久久在线观看 | 亚洲图片小说区 | 91社区福利 | 亚洲免费观看高清 | 色小姐av | av无遮挡| 一级特级毛片 | 欧美三日本三级少妇三99 | 国产黄色免费 | 欧美日韩一二三四区 | 性xxxx18| 加勒比久久综合 | 婷婷色吧 | 涩涩综合 | 波多野结衣中文在线 | 国产欧美日韩综合精品一区二区 | 黄色一级片在线播放 | 国产色吧 | 极品美女一区二区三区 | 日本久久久久久久久 | 欧美性受视频 | 国产又粗又深又猛又爽又在线观看 | 五月精品 | 中文字幕乱码中文乱码b站 国产一区二区三区在线观看视频 | 激情三级在线 | 日韩女优在线视频 | 国产第四页 | 五号特工组之偷天换月 | 影音先锋婷婷 | 天天操天天射天天舔 | 黄色片毛片 | 污污视频网站在线免费观看 | 牛牛av在线 | 青青草97国产精品麻豆 | 在线免费日本 | 免费在线观看网址入口 | 国产日韩三级 | 亚洲黄色网址 | 日本在线一区 | 成人福利影院 | 中国美女黄色 | 日本欧美国产在线 | av超碰在线观看 | 久久久二区| 国产精品久久久久久久久晋中 | 一区二区免费在线播放 | www视频免费在线观看 | 韩国黄色网| 超碰在线中文字幕 | a级片免费看 | 天天舔日日操 | 亚洲av激情无码专区在线播放 |