加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 教程 > 正文

Java多线程下载辅助类达成

发布时间:2021-11-23 13:11:52 所属栏目:教程 来源:互联网
导读:使用声明: 类名:MultiThreadDownloadUtil API: (1)download(String path,int count); path:文件URL; count:线程数量; package org.xiazdong.multidownload.util; import Java.io.File; import java.io.InputStream; import java.io.RandomAccessFile;

使用声明:
 
类名:MultiThreadDownloadUtil
 
API:
 
(1)download(String path,int count);
 
path:文件URL;
 
count:线程数量;
 
package org.xiazdong.multidownload.util;  
  
import Java.io.File;  
import java.io.InputStream;  
import java.io.RandomAccessFile;  
import java.net.HttpURLConnection;  
import java.net.URL;  
  
  
public class MultiThreadDownloadUtil{  
    private static int filesize;  
    private static int block;  
    private static String filename;  
    private static int downloadsize;  
    private class MyThread extends Thread{  
        private int i;          //线程ID   
        private String path;    //下载文件的URL   
  
        public MyThread(int i, String path) {  
            this.i = i;  
            this.path = path;  
            downloadsize = 0;  
        }  
        @Override  
        public void run() {  
            try{  
                System.out.println("线程"+(i+1)+"开始下载");  
                //1.打开文件,并定位位置   
                RandomAccessFile raf = new RandomAccessFile(new File(filename), "rwd");  
                raf.seek(i*block);          //定位到此线程要负责下载的位置   
                int start = i*block;  
                int end = (i+1)*block-1;  
                //2.连接服务器   
                URL url = new URL(path);  
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
                conn.setRequestMethod("GET");  
                conn.setRequestProperty("range", "bytes="+start+"-"+end);   //发出请求头   
                  
                if(conn.getResponseCode()==206){        //注意:分段下载的返回码为206,而不是200   
                    InputStream in = conn.getInputStream();  
                    int length = 0;  
                    byte[]data = new byte[1024];  
                    while((length=in.read(data))!=-1){  
                        raf.write(data,0,length);       //写入本地文件   
                    }  
                }  
                //显示下载进度   
                downloadsize += (end-start);  
                System.out.println("已下载"+downloadsize/1024.0+"k,共"+filesize/1024.0+"k");  
                //3.关闭文件   
                raf.close();  
                System.out.println("线程"+(i+1)+"结束下载...");  
            }  
            catch(Exception e){  
                e.printStackTrace();  
            }  
        }  
    }  
    /**
     * 下载文件
     * @param path          URL
     * @param threadcount   线程数
     * @throws Exception
     */  
    public static void download(String path,int threadcount) throws Exception{  
        filename = path.substring(path.lastIndexOf('/')+1);  
        filesize = getFileSize(path);  
        block = getBlockSize(filesize,threadcount);  
        createLocalRandomFile(filesize);  
        MultiThreadDownloadUtil mdu = new MultiThreadDownloadUtil();  
        for(int i=0;i<threadcount;i++){  
            mdu.new MyThread(i,path).start();  
        }  
    }  
    /**
     * 创建一个本地文件,并设置文件的大小
     * @param filesize
     * @throws Exception
     */  
    private static void createLocalRandomFile(int filesize) throws Exception {  
        RandomAccessFile raf = new RandomAccessFile(new File(filename), "rwd");  
        raf.setLength(filesize);  
        raf.close();  
    }  
    /**
     * 根据文件总大小和线程数求出每个线程要下载的数据量
     * @param filesize
     * @param threadcount
     * @return
     */  
    private static int getBlockSize(int filesize, int threadcount) {  
        return filesize%threadcount==0?filesize/threadcount:(filesize/threadcount+1);  
    }  
    /**
     * 求出文件总大小
     * @param path
     * @return
     * @throws Exception
     */  
    private static int getFileSize(String path) throws Exception{  
        URL url = new URL(path);  
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();  
        conn.setRequestMethod("GET");  
        if(conn.getResponseCode()==200){  
            return conn.getContentLength();  
        }  
        else{  
            return 0;  
        }  
    }  
}  
测试类:
 
package org.xiazdong.download;  
  
import org.xiazdong.multidownload.util.MultiThreadDownloadUtil;  
  
  
public class MultiThreadDownloader {  
  
    public static void main(String[] args) throws Exception {  
        int threadCount = 3;    //指定线程数量   
        String path = "http://dlc2.pconline.com.cn/filedown_61761_6694063/drivethelife2010_pconline_setup.exe"; //指定下载文件路径  
        MultiThreadDownloadUtil.download(path, threadCount);  
    }  
}  

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读