zoukankan      html  css  js  c++  java
  • 多线程下载辅助类实现

    如需转载,必须注明转自: http://blog.csdn.net/xiazdong/article/details/7738298


    使用声明:

    类名: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);
    	}
    }
    


    将此文件下载到工程目录后,运行可用;







  • 相关阅读:
    python json 和 pickle的补充 hashlib configparser logging
    go 流程语句 if goto for swich
    go array slice map make new操作
    go 基础
    块级元素 行内元素 空元素
    咽炎就医用药(慢性肥厚性咽炎)
    春季感冒是风寒还是风热(转的文章)
    秋季感冒 咳嗽 怎么选药
    解决IE浏览器“无法显示此网页”的问题
    常用的 css 样式 记录
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058317.html
Copyright © 2011-2022 走看看