Java多线程下载

public class ExecDownloadFile extends Thread {

	//private static Logger logger = Logger.getLogger(ExecDownloadFile.class);

	// 要下载的目标URL
	String dlURL;

	// 当前下载线程的起点字节数
	long startPos;

	// 当前下载线程的结束字节数
	long endPos;

	// 判断当前下载线程是否结束
	boolean done = false;
	
	//下载状态码
	int statusCode = 0;

	//下载超时标志
	int timeoutCount = 0;
	
	//保存目录文件地址
	String saveAs;


	/**
	 * @param dlURL 下载文件的路径
	 * @param saveAs 保存在磁盘的路径
	 * @param startPos 线程的开始字节位置
	 * @param endPos 线程的结束字节位置
	 */
	public ExecDownloadFile(String dlURL, String saveAs, long startPos, long endPos) {
		this.dlURL = dlURL;
		this.saveAs = saveAs;
		this.startPos = startPos;
		this.endPos = endPos;		
	}

	public void run() {
		try {
			URL url = new URL(dlURL);
			HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
			httpConnection.setAllowUserInteraction(true);
			httpConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos);
			RandomAccessFile fos = new RandomAccessFile(saveAs, "rw");
			fos.seek(startPos); //从startPos开始
			int responseCode = httpConnection.getResponseCode();			
            if( responseCode >= 400) {
            	statusCode = Constants.STATUS_RESPONSE_ERROR;//Web服务器响应错误
            	return;
            }
			BufferedInputStream binput = new BufferedInputStream(httpConnection.getInputStream());
			byte[] buf = new byte[1024];
			int bytesRead = 0;
			while ((bytesRead = binput.read(buf, 0, buf.length)) != -1) {
				if(bytesRead == 0){
					timeoutCount++;
				}else{
					timeoutCount= 0;
				}
				//状态为连接超时
				if(timeoutCount>10){
					statusCode = Constants.STATUS_CONNECT_TIMEOUT;
					binput.close();
					fos.close();
					return;
				}
				fos.write(buf, 0, bytesRead);
			}
			binput.close();
			fos.close();
			//logger.info("use time" + (System.currentTimeMillis()-start));
			statusCode = Constants.STATUS_DOWNLOAD_COMPLETE;
		} catch (Exception ex) {
			//logger.info("response error " + ex);
			statusCode = Constants.STATUS_RESPONSE_ERROR;
		}
	}

}


    /**
     * 根据文件大小来动态分配各线程的起始字节数
     * 并调用下载线程实现多线程同时进行下载
     */
    public Integer analysisDownloadFile() {
    	try{
	    	URL url = new URL(downloadURL); //创建URL
	    	URLConnection con = url.openConnection();
	    	fileLength = con.getContentLength();
	    	long subLen = fileLength / nthread;
	    	for (int i = 0; i < nthread; i++) {
	    		execDownloadFile[i] = new ExecDownloadFile(downloadURL, saveFileAs,subLen * i,subLen * (i+1));
	    		execDownloadFile[i].start();
	    	}
    	}catch(IOException ex){
            return Constants.STATUS_IO_ERROR;
    	}
    	return Constants.STATUS_DOWNLODADING;
    }
     
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值