java多线程下载资源:
package com.example.net;
import java.io.File;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
public class MulThreadDownload {
public static void main(String[] args) throws Exception{
String path = "http://192.168.1.105:8080/Web/downloadsetup.exe";
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if(conn.getResponseCode() == 200){
int length = conn.getContentLength();
File file = new File(path.substring(path.lastIndexOf("/")+1));//
RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
accessFile.setLength(length);
accessFile.close();
//block为每个线程需要下载的数据量
int block = length % 3 ==0 ? length/3:length/3 + 1;//假设开三个线程
for(int threadid=0;threadid<3;threadid++){
new DownloadThread(threadid,url,block,file).start();
}
}
}
/**
* 线程分段下载
* @author tdw
*
*/
private static class DownloadThread extends Thread{
private int threadid;
private URL url;
private int block;
private File file;
public DownloadThread(int threadid, URL url, int block, File file) {
this.threadid = threadid;
this.url = url;
this.block = block;
this.file = file;
}
@Override
public void run() {
int start = threadid*block;
int end = (threadid+1)*block-1;
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
RandomAccessFile accessFile = new RandomAccessFile(file, "rwd");
accessFile.seek(start);
conn.setRequestProperty("Range", "bytes="+start+"-"+end);
//采用分段下载时,其返回码为206
if(conn.getResponseCode() == 206){
byte[] buffer = new byte[1024];
InputStream inStream = conn.getInputStream();
int len = 0;
while((len = inStream.read(buffer)) != -1){
accessFile.write(buffer, 0, len);
}
accessFile.close();
inStream.close();
}
System.out.println("第"+threadid+"条线程下载完成.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
注:path为待下载资源路径。