亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

多線程下載

newsning / 1741人閱讀

摘要:原理多線程下載的原理就是將要下載的文件分成若干份,其中每份都使用一個(gè)多帶帶的線程進(jìn)行下載,這樣對(duì)于文件的下載速度自然就提高了許多??偨Y(jié)多線程的關(guān)鍵就是分配好需要下載的進(jìn)程,定位進(jìn)程下載的準(zhǔn)確位置,獲取輸入流讀取數(shù)據(jù),同時(shí)寫(xiě)入到文件的相應(yīng)位置。

原理

多線程下載的原理就是將要下載的文件分成若干份,其中每份都使用一個(gè)多帶帶的線程進(jìn)行下載,這樣對(duì)于文件的下載速度自然就提高了許多。

既然要分成若干部分分工下載,自然要知道各個(gè)線程自己要下載的起始位置,與要下載的大小。所以我們要解決線程的分配與各個(gè)線程定位到下載的位置。

封裝

對(duì)于多線程下載我們可以將其封裝到一個(gè)工具類中DownUtil,向其中傳入下載的鏈接、文件存儲(chǔ)路徑、需要下載的線程數(shù)

public DownUtil(String path, String targetFile, int threadNum) {
        this.path = path;
        this.targetFile = targetFile;
        this.threadNum = threadNum;
        downThreads = new DownThread[threadNum];
    }

其中DownThread實(shí)現(xiàn)的是各個(gè)線程的下載

分配線程

這里通過(guò)HttpURLConnection進(jìn)行網(wǎng)絡(luò)請(qǐng)求下載,通過(guò)getContentLength()方法獲取下載文件的總大小,再對(duì)其平均分配各個(gè)線程需要下載的大小。這樣就確定了下載的大小,下面就是定位到各個(gè)線程的開(kāi)始位置進(jìn)行下載,這里可以使用RandomAccessFile來(lái)追蹤定位到要下載的位置,它的seek()方法可以進(jìn)行定位。下面是詳細(xì)代碼:

    public void download() throws Exception {
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setConnectTimeout(5000);
        conn.setRequestProperty("Accept-Language", "zh-CN");
        conn.setRequestProperty("Charset", "UTF-8");
        conn.setRequestProperty("Connection", "Keep-Alive");

        fileSize = conn.getContentLength();
        conn.disconnect();
        //需要下載的大小
        int currentPartSize = fileSize / threadNum + 1;
        RandomAccessFile file = new RandomAccessFile(targetFile, "rw");

        //設(shè)置本地文件大小
        file.setLength(fileSize);
        file.close();
        for (int i = 0; i < threadNum; i++) {
            //下載開(kāi)始位置
            int startPos = i * currentPartSize;
            RandomAccessFile currentPart = new RandomAccessFile(targetFile, "rw");
            //定位到下載位置
            currentPart.seek(startPos);
            //下載線程
            downThreads[i] = new DownThread(startPos, currentPartSize, currentPart);
            downThreads[i].start();
        }
    }
線程下載

下面就是各個(gè)線程的下載DownThread,上面已經(jīng)得到了各個(gè)線程要下載的初始位置,所以可以通過(guò)獲取網(wǎng)絡(luò)請(qǐng)求的輸入流InputStream,通過(guò)skip()方法跳躍到指定位置進(jìn)行讀取數(shù)據(jù),再寫(xiě)入到RandomAccessFile文件中。

        public DownThread(int startPos, int currentPartSize, RandomAccessFile currentPart) {
            this.startPos = startPos;
            this.currentPartSize = currentPartSize;
            this.currentPart = currentPart;
        }

        @Override
        public void run() {
            try {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(5000);
                conn.setRequestProperty("Accept-Language", "zh-CN");
                conn.setRequestProperty("Charset", "UTF-8");
                InputStream in = conn.getInputStream();
                
                skipFully(in, startPos);
                byte[] buffer = new byte[1024];
                int hasRead = 0;
                while ((hasRead = in.read(buffer)) > 0 && length < currentPartSize) {
                    currentPart.write(buffer, 0, hasRead);
                    length += hasRead;
                }
                currentPart.close();
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

這樣就完成了一個(gè)簡(jiǎn)單的多線程的下載,最后調(diào)用封裝類DownUtil就可以進(jìn)行多線程下載。

總結(jié)

多線程的關(guān)鍵就是分配好需要下載的進(jìn)程,定位進(jìn)程下載的準(zhǔn)確位置,獲取輸入流讀取數(shù)據(jù),同時(shí)寫(xiě)入到文件的相應(yīng)位置??梢越柚?b>RandomAccessFile來(lái)進(jìn)行定位。

當(dāng)然也并非開(kāi)的線程數(shù)越多下載的速度也就越快,因?yàn)榫€程越多對(duì)于程序處理這些線程也是一種負(fù)擔(dān),過(guò)多的話反而會(huì)降低下載的速度,所以要合理運(yùn)用。

個(gè)人blog地址:https://idisfkj.github.io/arc...

關(guān)注

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/64854.html

相關(guān)文章

  • 線程系列之學(xué)習(xí)線程下載的基本原理和基本用法(1)

    摘要:多線程下載原理及步驟在本地創(chuàng)建一個(gè)大小跟服務(wù)器文件相同大小的臨時(shí)文件。在這里在介紹一個(gè)有關(guān)多線程下載的中的相關(guān)類隨機(jī)文件訪問(wèn)類只有才有搜尋方法,而這個(gè)方法也只適用于文件。利用這個(gè)類才能實(shí)現(xiàn)文件的多線程下載。 多線程下載在我們生活中非常常見(jiàn),比如迅雷就是我們常用的多線程的下載工具,當(dāng)然還有斷點(diǎn)續(xù)傳,斷點(diǎn)續(xù)傳我們?cè)谙乱还?jié)來(lái)講,android手機(jī)端下載文件時(shí)也可以用多線程下載,我們這里是在j...

    darry 評(píng)論0 收藏0
  • Python爬蟲(chóng)之線程下載豆瓣Top250電影圖片

    摘要:本次爬蟲(chóng)項(xiàng)目將會(huì)用到模塊中的類,多線程豆瓣電影圖片??偨Y(jié)通過(guò)上述兩個(gè)爬蟲(chóng)程序的對(duì)比,我們不難發(fā)現(xiàn),同樣是下載豆瓣電影,個(gè)網(wǎng)頁(yè)中的圖片,在沒(méi)有使用多線程的情況下,總共耗時(shí)約,而在使用多線程個(gè)線程的情況下,總共耗時(shí)約秒,效率整整提高了約倍。 爬蟲(chóng)項(xiàng)目介紹 ??本次爬蟲(chóng)項(xiàng)目將爬取豆瓣Top250電影的圖片,其網(wǎng)址為:https://movie.douban.com/top250, 具體頁(yè)面如...

    shiyang6017 評(píng)論0 收藏0
  • 通過(guò)網(wǎng)絡(luò)圖片小爬蟲(chóng)對(duì)比Python中單線程線(進(jìn))程的效率

    摘要:批評(píng)的人通常都會(huì)說(shuō)的多線程編程太困難了,眾所周知的全局解釋器鎖,或稱使得多個(gè)線程的代碼無(wú)法同時(shí)運(yùn)行。多線程起步首先讓我們來(lái)創(chuàng)建一個(gè)名為的模塊。多進(jìn)程可能比多線程更易使用,但需要消耗更大的內(nèi)存。 批評(píng) Python 的人通常都會(huì)說(shuō) Python 的多線程編程太困難了,眾所周知的全局解釋器鎖(Global Interpreter Lock,或稱 GIL)使得多個(gè)線程的 Python 代碼無(wú)...

    W4n9Hu1 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<