国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

darry / 1004人閱讀

摘要:多線程下載原理及步驟在本地創(chuàng)建一個(gè)大小跟服務(wù)器文件相同大小的臨時(shí)文件。在這里在介紹一個(gè)有關(guān)多線程下載的中的相關(guān)類隨機(jī)文件訪問類只有才有搜尋方法,而這個(gè)方法也只適用于文件。利用這個(gè)類才能實(shí)現(xiàn)文件的多線程下載。

多線程下載在我們生活中非常常見,比如迅雷就是我們常用的多線程的下載工具,當(dāng)然還有斷點(diǎn)續(xù)傳,斷點(diǎn)續(xù)傳我們?cè)谙乱还?jié)來講,android手機(jī)端下載文件時(shí)也可以用多線程下載,我們這里是在java中寫一個(gè)測(cè)試,其實(shí)android中的實(shí)現(xiàn)和java是一樣的,學(xué)會(huì)了java就知道怎么在android中實(shí)現(xiàn)了,廢話不多說了,怎么實(shí)現(xiàn)多線程和多線程的原理是什么樣的,現(xiàn)在我們來學(xué)習(xí)一下。

多線程下載原理及步驟:

在本地創(chuàng)建一個(gè)大小跟服務(wù)器文件相同大小的臨時(shí)文件。

計(jì)算分配幾個(gè)線程去下載服務(wù)器上的資源,知道每個(gè)線程下載文件的位置。

步驟二的具體方法和操作:

文件的長(zhǎng)度/3(線程的個(gè)數(shù))=每個(gè)線程下載文件的大小

假設(shè)文件長(zhǎng)度為10,則

線程1:0-2

線程2:3-5

線程3:6-文件末尾

每個(gè)線程下載的位置的計(jì)算方式:

開始位置:

(線程id - 1)* 每一塊的大小

結(jié)束位置:

(線程id * 每一塊大小)-1

開啟多(3)個(gè)線程,每一個(gè)線程下載對(duì)應(yīng)位置的文件

如果所有的線程都把自己的數(shù)據(jù)下載完畢了,服務(wù)器上的資源就被下載到本地了。

在這里在介紹一個(gè)有關(guān)多線程下載的java中的相關(guān)類RandomAccessFile

RandomAccessFile 隨機(jī)文件訪問類

只有RandomAccessFile才有seek搜尋方法,而這個(gè)方法也只適用于文件。通過seek()方法指定位置,定位文件,即可以指定隨機(jī)寫文件的時(shí)候從哪個(gè)位置開始寫。利用這個(gè)類才能實(shí)現(xiàn)文件的多線程下載。

基本原理和相關(guān)介紹如上,就這些,現(xiàn)在我們看看代碼:

package net.loonggg.test;

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

/***
 * 多線程下載
 * 
 * @author loonggg
 * 
 */
public class MutilDownloader {
    // 開啟的線程的個(gè)數(shù)
    public static final int THREAD_COUNT = 3;

    public static void main(String[] args) throws Exception {
        String path = "http://down.360safe.com/yunpan/360wangpan_setup.exe";
        // 連接服務(wù)器,獲取一個(gè)文件,獲取文件的長(zhǎng)度,在本地創(chuàng)建一個(gè)大小跟服務(wù)器文件大小一樣的臨時(shí)文件
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        // 設(shè)置網(wǎng)絡(luò)請(qǐng)求超時(shí)時(shí)間
        conn.setConnectTimeout(5000);
        // 設(shè)置請(qǐng)求方式
        conn.setRequestMethod("GET");
        int code = conn.getResponseCode();
        if (code == 200) {
            // 服務(wù)器返回的數(shù)據(jù)的長(zhǎng)度,實(shí)際就是文件的長(zhǎng)度
            int length = conn.getContentLength();
            System.out.println("----文件總長(zhǎng)度----" + length);
            // 在客戶端本地創(chuàng)建出來一個(gè)大小跟服務(wù)器端文件一樣大小的臨時(shí)文件
            RandomAccessFile raf = new RandomAccessFile("yunpan.exe", "rwd");
            // 指定創(chuàng)建的這個(gè)文件的長(zhǎng)度
            raf.setLength(length);
            // 關(guān)閉raf
            raf.close();
            // 假設(shè)是3個(gè)線程去下載資源
            // 平均每一個(gè)線程下載的文件的大小
            int blockSize = length / THREAD_COUNT;
            for (int threadId = 1; threadId <= THREAD_COUNT; threadId++) {
                // 計(jì)算每個(gè)線程下載的開始位置和結(jié)束位置
                int startIndex = (threadId - 1) * blockSize;
                int endIndex = threadId * blockSize - 1;
                if (threadId == THREAD_COUNT) {
                    endIndex = length;
                }
                System.out.println("----threadId---" + threadId
                        + "--startIndex--" + startIndex + "--endIndex--"
                        + endIndex);
                // 開啟每一個(gè)線程
                new DownloadThread(path, threadId, startIndex, endIndex)
                        .start();
            }
        }

    }

    /**
     * 下載文件的子線程,每一個(gè)線程下載對(duì)應(yīng)位置的文件
     * 
     * @author loonggg
     * 
     */
    public static class DownloadThread extends Thread {
        private int threadId;
        private int startIndex;
        private int endIndex;
        private String path;

        /**
         * @param path
         *            下載文件在服務(wù)器上的路徑
         * @param threadId
         *            線程id
         * @param startIndex
         *            線程下載的開始位置
         * @param endIndex
         *            線程下載的結(jié)束位置
         */
        public DownloadThread(String path, int threadId, int startIndex,
                int endIndex) {
            this.path = path;
            this.threadId = threadId;
            this.startIndex = startIndex;
            this.endIndex = endIndex;
        }

        @Override
        public void run() {
            try {
                URL url = new URL(path);
                HttpURLConnection conn = (HttpURLConnection) url
                        .openConnection();
                conn.setRequestMethod("GET");
                // 重要:請(qǐng)求服務(wù)器下載部分的文件 指定文件的位置
                conn.setRequestProperty("Range", "bytes=" + startIndex + "-"
                        + endIndex);
                conn.setConnectTimeout(5000);
                // 從服務(wù)器請(qǐng)求全部資源的狀態(tài)碼200 ok 如果從服務(wù)器請(qǐng)求部分資源的狀態(tài)碼206 ok
                int code = conn.getResponseCode();
                System.out.println("---code---" + code);
                InputStream is = conn.getInputStream();// 已經(jīng)設(shè)置了請(qǐng)求的位置,返回的是當(dāng)前位置對(duì)應(yīng)的文件的輸入流
                RandomAccessFile raf = new RandomAccessFile("yunpan.exe", "rwd");
                // 隨機(jī)寫文件的時(shí)候從哪個(gè)位置開始寫
                raf.seek(startIndex);// 定位文件
                int len = 0;
                byte[] buffer = new byte[1024];
                while ((len = is.read(buffer)) != -1) {
                    raf.write(buffer, 0, len);
                }
                is.close();
                raf.close();
                System.out.println("線程" + threadId + ":下載完畢了!");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

公眾號(hào):非著名程序員(smart_android) 歡迎大家關(guān)注,每天一篇原創(chuàng)技術(shù)文章。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65931.html

相關(guān)文章

  • Java開發(fā)

    摘要:大多數(shù)待遇豐厚的開發(fā)職位都要求開發(fā)者精通多線程技術(shù)并且有豐富的程序開發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線程相關(guān)的問題在面試中經(jīng)常會(huì)被提到。將對(duì)象編碼為字節(jié)流稱之為序列化,反之將字節(jié)流重建成對(duì)象稱之為反序列化。 JVM 內(nèi)存溢出實(shí)例 - 實(shí)戰(zhàn) JVM(二) 介紹 JVM 內(nèi)存溢出產(chǎn)生情況分析 Java - 注解詳解 詳細(xì)介紹 Java 注解的使用,有利于學(xué)習(xí)編譯時(shí)注解 Java 程序員快速上手 Kot...

    LuDongWei 評(píng)論0 收藏0
  • Python

    摘要:最近看前端都展開了幾場(chǎng)而我大知乎最熱語言還沒有相關(guān)。有關(guān)書籍的介紹,大部分截取自是官方介紹。但從開始,標(biāo)準(zhǔn)庫為我們提供了模塊,它提供了和兩個(gè)類,實(shí)現(xiàn)了對(duì)和的進(jìn)一步抽象,對(duì)編寫線程池進(jìn)程池提供了直接的支持。 《流暢的python》閱讀筆記 《流暢的python》是一本適合python進(jìn)階的書, 里面介紹的基本都是高級(jí)的python用法. 對(duì)于初學(xué)python的人來說, 基礎(chǔ)大概也就夠用了...

    dailybird 評(píng)論0 收藏0
  • [系統(tǒng)安全] 三十五.Procmon工具基本用法及文件進(jìn)程、注冊(cè)表查看

    摘要:本文將分享軟件基本用法及文件進(jìn)程注冊(cè)表查看,這是一款微軟推薦的系統(tǒng)監(jiān)視工具,功能非常強(qiáng)大可用來檢測(cè)惡意軟件??梢詭椭褂谜邔?duì)系統(tǒng)中的任何文件注冊(cè)表操作進(jìn)行監(jiān)視和記錄,通過注冊(cè)表和文件讀寫的變化,有效幫助診斷系統(tǒng)故障或發(fā)現(xiàn)惡意軟件病毒及木馬。 ...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<