package top.mengmei219;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class DownLoad {
static int threadCound = 3; //線程數(shù)
static int size; //每個(gè)線程分的大小
static int finishThread = 0; //活動(dòng)的線程數(shù)
//多線程斷點(diǎn)續(xù)傳 下載
public static void main(String[] args) {
try {
URL url = new URL("http://192.168.1.104:8080/itheima74/lczd.pdf");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
int contentLength = urlConnection.getContentLength();
RandomAccessFile random = new RandomAccessFile("/Users/mengmei/Desktop/lang.pdf", "rw");
random.setLength(contentLength);
for(int threadID=0; threadID<threadCound; threadID++){
size = contentLength/threadCound;
int startPosition = threadID*size;
int endPosition = (threadID+1)*size-1;
if(threadID == threadCound-1){
endPosition = contentLength-1;
}
new MyThread(threadID, startPosition, endPosition).start();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
static class MyThread extends Thread{
private int threadID;
private int startPosition;
private int endPosition;
public MyThread(int threadID, int startPosition, int endPosition) {
this.threadID = threadID;
this.startPosition = startPosition;
this.endPosition = endPosition;
System.out.println("threadID"+threadID+": "+startPosition+" - "+endPosition);
}
@Override
public void run() {
int lastPosition = startPosition;
try {
URL url = new URL("http://192.168.1.104:8080/itheima74/lczd.pdf");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setConnectTimeout(1000*10);
File tempFile = new File("/Users/mengmei/Desktop/"+threadID+".txt");
if(tempFile.exists()){
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(tempFile)));
String line = reader.readLine();
lastPosition = Integer.parseInt(line);
startPosition = lastPosition;
reader.close();
}
//分段請(qǐng)求頭
urlConnection.setRequestProperty("Range", "bytes="+startPosition+"-"+endPosition);
int code = urlConnection.getResponseCode();
if (code == 206) { //分段請(qǐng)求成功
InputStream inputStream = urlConnection.getInputStream();
byte[] buffer = new byte[1024*10];
int len = 0;
RandomAccessFile random = new RandomAccessFile("/Users/mengmei/Desktop/lang.pdf", "rw");
random.seek(startPosition);
while ( (len=inputStream.read(buffer)) > 0 ) {
random.write(buffer, 0, len);
lastPosition = lastPosition + len;
FileOutputStream tempOut = new FileOutputStream(tempFile);
tempOut.write(String.valueOf(lastPosition).getBytes());
tempOut.flush();
tempOut.close();
}
inputStream.close();
random.close();
}
synchronized (MyThread.class) {
System.out.println(threadID+" - 下載完成!");
finishThread ++;
if (finishThread == threadCound) {
System.out.println("全部下載完成涤浇,刪掉臨時(shí)文件!");
for(int i=0; i<threadCound; i++){
File temp = new File("/Users/mengmei/Desktop/"+threadID+".txt");
if (!temp.delete()) {
temp.deleteOnExit(); //在JVM退出時(shí)刪除
}
}
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
JavaSE-多線程下載
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén)缴守,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人镇辉,你說(shuō)我怎么就攤上這事屡穗。” “怎么了忽肛?”我有些...
- 文/不壞的土叔 我叫張陵村砂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我屹逛,道長(zhǎng)础废,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任罕模,我火速辦了婚禮评腺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淑掌。我一直安慰自己蒿讥,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布抛腕。 她就那樣靜靜地躺著芋绸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪担敌。 梳的紋絲不亂的頭發(fā)上摔敛,一...
- 那天,我揣著相機(jī)與錄音柄错,去河邊找鬼舷夺。 笑死苦酱,一個(gè)胖子當(dāng)著我的面吹牛售貌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疫萤,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼颂跨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扯饶?” 一聲冷哼從身側(cè)響起恒削,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤池颈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钓丰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體躯砰,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年携丁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琢歇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布,位于F島的核電站存筏,受9級(jí)特大地震影響宠互,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜方篮,卻給世界環(huán)境...
- 文/蒙蒙 一名秀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藕溅,春花似錦匕得、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至集币,卻和暖如春考阱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞠苟。 一陣腳步聲響...
- 正文 我出身青樓吃既,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親跨细。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹦倚,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 1.普通單線程下載文件: 直接使用URLConnection.openStream();打開(kāi)網(wǎng)絡(luò)輸入流,然后將流寫(xiě)...
- Thread 多線程為我們解決了程序中需要并發(fā)執(zhí)行多個(gè)任務(wù)的操作媒楼,可以通過(guò)創(chuàng)建一個(gè)線程來(lái)負(fù)責(zé)執(zhí)行需要執(zhí)行的任務(wù)乐尊。創(chuàng)...
- Socket編程 一、網(wǎng)絡(luò)基礎(chǔ)知識(shí) 兩臺(tái)計(jì)算機(jī)要通過(guò)網(wǎng)絡(luò)進(jìn)行通信划址,必須具備: 1科吭、IP地址:每臺(tái)計(jì)算機(jī)的唯一標(biāo)識(shí),...
- 使用第三方框架#import "AFNetworking.h"下載網(wǎng)絡(luò)Json數(shù)據(jù) 使用第三方框架#import ...
- 一猴鲫、為什么要使用多線程对人,多線程真的能提高效率嗎? 1.1為什么要使用多線程 多線程編程的目的拂共,就是"最大限度地利用...