package com.test;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
public class DownLoadUtil {
private String urlStr;
private String targetFile;
private int threadNum;
private DownloadThread[] threads;
private int fileSize;
public DownLoadUtil(String urlStr, String targetFile, int threadNum) {
this.urlStr = urlStr;
this.targetFile = targetFile;
this.threadNum = threadNum;
this.threads = new DownloadThread[threadNum];
}
public void download() {
try {
HttpURLConnection conn = this.getHttpURLConnection();
conn.setRequestProperty("Connection", "Keep-Alive");
fileSize = conn.getContentLength();
conn.disconnect();
int currentPartSize = fileSize/threadNum + 1;
RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
file.setLength(fileSize);
file.close();
for(int i=0; i<threadNum; i++) {
int startPosition = currentPartSize * i;
RandomAccessFile currentFile = new RandomAccessFile(targetFile, "rw");
currentFile.seek(startPosition);
threads[i] = new DownloadThread(startPosition, currentFile, currentPartSize);
new Thread(threads[i]).start();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private class DownloadThread implements Runnable {
private int startPosition;
private RandomAccessFile downloadFile;
private int currentPartSize;
private int hasDownSize;
public DownloadThread(int startPosition, RandomAccessFile downloadFile,
int currentPartSize) {
this.startPosition = startPosition;
this.downloadFile = downloadFile;
this.currentPartSize = currentPartSize;
}
@Override
public void run() {
try {
HttpURLConnection conn = getHttpURLConnection();
InputStream in = conn.getInputStream();
in.skip(this.startPosition);
byte[] buffer = new byte[1024];
int hasRead = 0;
while (hasDownSize < currentPartSize &&
(hasRead = in.read(buffer)) != -1) {
downloadFile.write(buffer, 0, hasRead);
hasDownSize += hasRead;
}
downloadFile.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private HttpURLConnection getHttpURLConnection() {
HttpURLConnection conn = null;
try {
URL url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
conn.setRequestProperty(
"Accept",
"image/gif, image/jpeg, image/pjpeg, image/pjpeg, "
+ "application/x-shockwave-flash, application/xaml+xml, "
+ "application/vnd.ms-xpsdocument, application/x-ms-xbap, "
+ "application/x-ms-application, application/vnd.ms-excel, "
+ "application/vnd.ms-powerpoint, application/msword, */*");
conn.setRequestProperty("Accept-Language", "zh-CN");
conn.setRequestProperty("Charset", "UTF-8");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return conn;
}
}
Java多线程下载实现
最新推荐文章于 2018-07-16 06:17:01 发布