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;
}