JavaSE-多線程下載

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

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌麻诀,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件四啰,死亡現(xiàn)場(chǎng)離奇詭異译隘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)梆造,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)缴守,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人镇辉,你說(shuō)我怎么就攤上這事屡穗。” “怎么了忽肛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵村砂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我屹逛,道長(zhǎng)础废,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任罕模,我火速辦了婚禮评腺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淑掌。我一直安慰自己蒿讥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布抛腕。 她就那樣靜靜地躺著芋绸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪担敌。 梳的紋絲不亂的頭發(fā)上摔敛,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音柄错,去河邊找鬼舷夺。 笑死苦酱,一個(gè)胖子當(dāng)著我的面吹牛售貌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疫萤,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼颂跨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扯饶?” 一聲冷哼從身側(cè)響起恒削,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤池颈,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钓丰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體躯砰,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年携丁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琢歇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梦鉴,死狀恐怖李茫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肥橙,我是刑警寧澤魄宏,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站存筏,受9級(jí)特大地震影響宠互,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜方篮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一名秀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧藕溅,春花似錦匕得、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至集币,卻和暖如春考阱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鞠苟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工乞榨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人当娱。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓吃既,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親跨细。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹦倚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容