import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class DownLoad {
static String path = "http://127.0.0.1:8088/baiduyun.zip";
static int threadCount = 3;
public static void main(String[] args) {
try {
URL url = new URL(path);
HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
urlCon.setRequestMethod("GET");
urlCon.setConnectTimeout(5000);
int code = urlCon.getResponseCode();
if(code == 200){
// 获取所要下载的文件的长度
int length = urlCon.getContentLength();
// 创建一个一样大的文件
RandomAccessFile file = new RandomAccessFile("D:\\Work\\download\\baiduyun.zip", "rw");
file.setLength(length);
// 计算每个线程要下载多少数据
int blockSize = length/threadCount;
for(int i=0;i<threadCount;i++){
int startSize = i * blockSize;
int endSize = (++i) * blockSize -1;
if(i == threadCount-1){
endSize = length-1;
}
new DownLoadThread(startSize,endSize,i).start();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static class DownLoadThread extends Thread{
private int startIndex;
private int endIndex;
private int threadId;
public DownLoadThread(int startIndex, int endIndex, int threadId) {
this.startIndex = startIndex;
this.endIndex = endIndex;
this.threadId = threadId;
}
@Override
public void run() {
try {
URL url = new URL(path);
HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
urlCon.setRequestMethod("GET");
urlCon.setConnectTimeout(5000);
// 设置Range头,用计算好的开始索引和结束索引到服务器请求数据
urlCon.setRequestProperty("Range", "bytes="+startIndex+"-"+endIndex);
int code = urlCon.getResponseCode();
if(code == 206){
System.out.println("线程" + threadId);
InputStream is = urlCon.getInputStream();
byte[] buffer = new byte[1024];
int len = -1;
RandomAccessFile file = new RandomAccessFile("D:\\Work\\download\\baiduyun.zip", "rw");
file.seek(startIndex);
while((len = is.read(buffer))!=-1){
file.write(buffer, 0, buffer.length);
}
is.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
java多线程下载
最新推荐文章于 2021-02-19 21:29:02 发布