java多线程下载

package cn.itcast.download;



import java.io.File;

import java.io.InputStream;

import java.io.RandomAccessFile;

import java.net.HttpURLConnection;

import java.net.URL;



public class MulThreadDownloader {



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

        String path = "http://i1.itc.cn/20140715/340a_ae147e1e_c21f_cc5d_afe0_a08407c77f1b_1.jpg";

        int threadsize = 3;

        new MulThreadDownloader().download(path, threadsize);



    }



    private void download(String path, int threadsize) throws Exception {

        URL downpath = new URL(path);

        HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();

        conn.setConnectTimeout(5000);

        conn.setRequestMethod("GET");

        if(conn.getResponseCode() == 200){

            int length = conn.getContentLength();//获取网络文件的长度

            File file = new File(getFileName(path));

            RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");//生成本地文件

            accessFile.setLength(length);

            accessFile.close();

            //计算每条线程负责下载的数据量

            int block = length % threadsize == 0 ? length / threadsize : length / threadsize +1;

            for(int threadid = 0 ; threadid < threadsize ; threadid++){

                new DownloadThread(threadid, downpath, block, file).start();

            }

        }

    }

    //负责下载操作

    private final class DownloadThread extends Thread{

        private int threadid;

        private URL downpath;

        private int block;

        private File file;

        

        public DownloadThread(int threadid, URL downpath, int block, File file) {

            this.threadid = threadid;

            this.downpath = downpath;

            this.block = block;

            this.file = file;

        }

        public void run() {

            int startposition = threadid * block;//从网络文件的什么位置开始下载数据

            int endposition = (threadid+1) * block - 1;//下载到网络文件的什么位置结束

            //指示该线程要从网络文件的startposition位置开始下载,下载到endposition位置结束

            //Range:bytes=startposition-endposition

            try{

                RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");

                accessFile.seek(startposition);//移动指针到文件的某个位置

                HttpURLConnection conn = (HttpURLConnection) downpath.openConnection();

                conn.setConnectTimeout(5000);

                conn.setRequestMethod("GET");

                conn.setRequestProperty("Range", "bytes="+ startposition+ "-"+ endposition);

                InputStream inStream = conn.getInputStream();

                byte[] buffer = new byte[1024];

                int len = 0;

                while( (len = inStream.read(buffer)) != -1 ){

                    accessFile.write(buffer, 0, len);

                }

                accessFile.close();

                inStream.close();

                System.out.println("第"+ (threadid+1)+ "线程下载完成");

            }catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

    /**

     * 获取文件名称

     * @param path 下载路径

     * @return

     */

    private static String getFileName(String path) {

        return path.substring(path.lastIndexOf("/")+ 1);

    }



}

 

你可能感兴趣的:(java多线程)