java实现多线程下载_Java实现多线程下载

思路:

1、基本思路是将文件分段切割、分段传输、分段保存。

2、分段切割用到HttpUrlConnection对象的setRequestProperty("Range", "bytes=" + start + "-" + end)方法。

3、分段传输用到HttpUrlConnection对象的getInputStream()方法。

4、分段保存用到RandomAccessFile的seek(int start)方法。

5、创建指定长度的线程池,循环创建线程,执行下载操作。

首先,我们要先写一个方法,方法的参数包含URL地址,保存的文件地址,切割后的文件开始位置和结束位置,这样我们就能把分段文件下载到本地。并且这个方法要是run方法,这样我们启动线程时就直接执行该方法。

public class DownloadWithRange implementsRunnable

{privateString urlLocation;privateString filePath;private longstart;private longend;

DownloadWithRange(String urlLocation, String filePath,long start, longend)

{this.urlLocation =urlLocation;this.filePath =filePath;this.start =start;this.end =end;

}

@Overridepublic voidrun()

{try{

HttpURLConnection conn=getHttp();

conn.setRequestProperty("Range", "bytes=" + start + "-" +end);

File file= newFile(filePath);

RandomAccessFile out= null;if (file != null)

{

out= new RandomAccessFile(file, "rwd");

}

out.seek(start);

InputStream in=conn.getInputStream();byte[] b = new byte[1024];int len = 0;while ((len = in.read(b)) != -1)

{

out.write(b,0, len);

}

in.close();

out.close();

}catch(Exception e)

{

e.getMessage();

}

}public HttpURLConnection getHttp() throwsIOException

{

URL url= null;if (urlLocation != null)

{

url= newURL(urlLocation);

}

HttpURLConnection conn=(HttpURLConnection) url.openConnection();

conn.setReadTimeout(5000);

conn.setRequestMethod("GET");returnconn;

}

}

然后我们创建线程池,线程池的长度可以自定义,然后循环创建线程来执行请求,每条线程的请求开始位置和结束位置都不同,本地存储的文件开始位置和请求开始位置相同,这样就可以实现多线程下载了。

public classDownloadFileWithThreadPool

{public void getFileWithThreadPool(String urlLocation,String filePath, int poolLength) throwsIOException

{

Executor threadPool=Executors.newFixedThreadPool(poolLength);long len =getContentLength(urlLocation);for(int i=0;i

{long start=i*len/poolLength;long end = (i+1)*len/poolLength-1;if(i==poolLength-1)

{

end=len;

}

DownloadWithRange download=newDownloadWithRange(urlLocation, filePath, start, end);

threadPool.execute(download);

}

}public static long getContentLength(String urlLocation) throwsIOException

{

URL url= null;if (urlLocation != null)

{

url= newURL(urlLocation);

}

HttpURLConnection conn=(HttpURLConnection) url.openConnection();

conn.setReadTimeout(5000);

conn.setRequestMethod("GET");long len =conn.getContentLength();returnlen;

}

相关资源:java多线程下载文件
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页