歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java內存映射文件實現多線程下載

Java NIO內存映射文件可以實現多線程下載

首先,使用Firefox下載一個Tomcat

Java多線程:一道阿裡面試題的分析與應對 http://www.linuxidc.com/Linux/2014-03/98715.htm

Java多線程下載程序

import java.io.FileNotFoundException;
 
import java.io.IOException;

import java.io.InputStream;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;

import java.nio.MappedByteBuffer;

import java.nio.channels.FileChannel.MapMode;

 

class Worker implements Runnable {

    //多線程下載的數量

    private static int THREADS = 4;

    //每個線程下載開始的位置

    private int startIndex;

    //每個線程下載內容的長度

    private int length;

    //文件保存位置

    private String localFile;

    //遠程文件的流

    InputStream in;

 

    private Worker(String urlFile, String localFile, int startIndex, int length) throws IOException {

        this.startIndex = startIndex;

        this.length = length;

        this.localFile = localFile;

        init(urlFile);

    }

 

    /**

    *    主線程打開網絡文件,先分割為指定的大小,然後開啟多線程下載

    */

    public Worker(String urlFile, String localFile) throws IOException {

        this.localFile = localFile;

        int contentLength = init(urlFile);

        int step = contentLength / THREADS;

        int index = 0;

        for (int i = 0; i < THREADS; i++) {

            if (i == 0) {

                this.startIndex = 0;

                this.length = step;

                new Thread(this).start();

            } else if (i == THREADS - 1) {

                Worker worker = new Worker(urlFile, localFile, index, contentLength - index);

                new Thread(worker).start();

            } else {

                Worker worker = new Worker(urlFile, localFile, index, step);

                new Thread(worker).start();

            }

            index = index + step;

        }

    }

 

    private int init(String urlFile) throws IOException {

        URL url;

 

        url = new URL(urlFile);

 

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();

 

        connection.setConnectTimeout(5 * 1000);

        connection.setRequestMethod("GET");

        connection.setRequestProperty("Accept", "image/gif, image/jpeg, image/pjpeg, image/pjpeg, " + "application/x-shockwave-flash, application/xaml+xml, "

                + "application/vnd.ms-xpsdocument, application/x-ms-xbap, " + "application/x-ms-application, application/vnd.ms-excel, " + "application/vnd.ms-powerpoint, application/msword, */*");

        connection.setRequestProperty("Accept-Language", "zh-CN");

        connection.setRequestProperty("Charset", "UTF-8");

        connection.setRequestProperty("Connection", "Keep-Alive");

        InputStream in = connection.getInputStream();

        this.in = in;

        return connection.getContentLength();

    }

 

    @Override

    public void run() {

        System.out.println(this);

        try {

            RandomAccessFile localRandomFile = new RandomAccessFile(localFile, "rw");

            MappedByteBuffer buffer = localRandomFile.getChannel().map(MapMode.READ_WRITE, startIndex, length);

            int i = 0;

            in.skip(startIndex);

            while (i < length) {

                buffer.put((byte) in.read());

                i++;

            }

            buffer.force();

            in.close();

            localRandomFile.close();

        } catch (FileNotFoundException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

    @Override

    public String toString() {

        return "Worker [localFile=" + localFile + ", startIndex=" + startIndex + ", length=" + length + "]";

    }

 

    public static void main(String[] args) throws IOException {

        new Worker("http://mirrors.cnnic.cn/apache/tomcat/tomcat-7/v7.0.53/bin/apache-tomcat-7.0.53.zip", "tomcat.zip");

    }

}

比對下載的文件
 

Java1.5後的多線程框架 http://www.linuxidc.com/Linux/2014-02/96879.htm

Java多線程和同步的理解 http://www.linuxidc.com/Linux/2013-12/93691.htm

Java中兩種實現多線程方式的對比分析 http://www.linuxidc.com/Linux/2013-12/93690.htm

Java利用多線程計算目錄數據大小 http://www.linuxidc.com/Linux/2013-09/90715.htm

Java多線程向數據庫寫入數據 http://www.linuxidc.com/Linux/2013-09/90297.htm

Copyright © Linux教程網 All Rights Reserved