多线程下载文件示例

package com.eboy.download;

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

public class DownloadThread {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        String path = "http://dl_dir.qq.com/invc/cyclone/QQDownload_Setup_39_716_p1.exe";
        new DownloadThread().download(path, 5);

    }

    /**
     * 下载文件
     * @param path网络文件路径
     */
    private void download(String path, int ThreadSize) throws Exception{
        // TODO Auto-generated method stub
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection)url.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 DownloadFileThread(ThreadID, block, url, file).start();
            }
        }else{
            System.out.println("下载失败。");
        }
        
    }
    
    private class DownloadFileThread extends Thread{
        private int ThreadID;
        private int Block;
        private URL url;
        private File file;
         
        public DownloadFileThread(int ThreadID, int block, URL url, File file){
            this.ThreadID = ThreadID;
            this.Block = block;
            this.url = url;
            this.file = file;
        }

        
        public void run() {
            int Start = this.ThreadID * this.Block;
            int End = (this.ThreadID + 1) * this.Block - 1;
            try {
                RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
                accessFile.seek(Start);
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                conn.setConnectTimeout(5000);
                conn.setRequestMethod("GET");
                conn.setRequestProperty("Range", "bytes=" + Start + "-" + End);
                if (conn.getResponseCode() == 206){
                    InputStream inputStream = conn.getInputStream();
                    byte[] buffer = new byte[1024];
                    int len = 0;
                    while ((len = inputStream.read(buffer)) != -1){
                        accessFile.write(buffer, 0, len);                        
                    }
                    accessFile.close();
                    inputStream.close();
                }
                System.out.println(ThreadID + 1 + " start: " + Start + " end: " + End + " 线程下载完成成。");
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                
            }
        }
        
    }
    

    private String getFileName(String path) {
        // TODO Auto-generated method stub
        return path.substring(path.lastIndexOf("/") + 1);
    }

}

转载于:https://www.cnblogs.com/jxgxy1/archive/2012/07/11/2587250.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值