一、先看效果:
1、普通链接:
(1)大文件单线程下载:
String dir = "D:/test";
String fileURL = "https://download.jetbrains.8686c.com/idea/ideaIU-2020.3.dmg";
Downloader downloader = new FileDownloader();
downloader.download(fileURL, dir);
0 文件总大小: 838145KB, 已下载:0KB, 下载速度:0KB
0 文件总大小: 838145KB, 已下载:793KB, 下载速度:812KB
0 文件总大小: 838145KB, 已下载:1620KB, 下载速度:846KB
0 文件总大小: 838145KB, 已下载:2452KB, 下载速度:851KB
0 文件总大小: 838145KB, 已下载:3283KB, 下载速度:851KB
0 文件总大小: 838145KB, 已下载:4122KB, 下载速度:858KB
0 文件总大小: 838145KB, 已下载:4938KB, 下载速度:835KB
0 文件总大小: 838145KB, 已下载:5777KB, 下载速度:859KB
0 文件总大小: 838145KB, 已下载:6618KB, 下载速度:860KB
0 文件总大小: 838145KB, 已下载:7442KB, 下载速度:843KB
0 文件总大小: 838145KB, 已下载:8280KB, 下载速度:858KB
0 文件总大小: 838145KB, 已下载:9097KB, 下载速度:836KB
0 文件总大小: 838145KB, 已下载:9886KB, 下载速度:808KB
//此处省略部分日志
0 文件总大小: 838145KB, 已下载:328776KB, 下载速度:845KB
0 文件总大小: 838145KB, 已下载:329592KB, 下载速度:835KB
0 文件总大小: 838145KB, 已下载:834530KB, 下载速度:790KB
0 文件总大小: 838145KB, 已下载:835346KB, 下载速度:835KB
0 文件总大小: 838145KB, 已下载:836162KB, 下载速度:835KB
0 文件总大小: 838145KB, 已下载:837005KB, 下载速度:862KB
0 文件总大小: 838145KB, 已下载:837834KB, 下载速度:849KB
总共下载文件耗时:1039s
(2) 大文件多线程下载:
String dir = "D:/test";
String fileURL = "https://download.jetbrains.8686c.com/idea/ideaIU-2020.3.dmg";
Downloader downloader = new MultiThreadFileDownloader(100);
downloader.download(fileURL, dir);
2 文件总大小: 8381KB, 已下载:39KB, 下载速度:40KB
0 文件总大小: 8381KB, 已下载:21KB, 下载速度:21KB
1 文件总大小: 8381KB, 已下载:0KB, 下载速度:0KB
3 文件总大小: 8381KB, 已下载:2KB, 下载速度:2KB
7 文件总大小: 8381KB, 已下载:0KB, 下载速度:0KB
77 文件总大小: 8381KB, 已下载:30KB, 下载速度:31KB
10 文件总大小: 8381KB, 已下载:30KB, 下载速度:31KB
2 文件总大小: 8381KB, 已下载:164KB, 下载速度:127KB
7 文件总大小: 8381KB, 已下载:82KB, 下载速度:83KB
3 文件总大小: 8381KB, 已下载:72KB, 下载速度:71KB
0 文件总大小: 8381KB, 已下载:197KB, 下载速度:180KB
1 文件总大小: 8381KB, 已下载:69KB, 下载速度:70KB
77 文件总大小: 8381KB, 已下载:70KB, 下载速度:40KB
10 文件总大小: 8381KB, 已下载:67KB, 下载速度:37KB
//此处省略部分日志
68 文件总大小: 8381KB, 已下载:8381KB, 下载速度:8582KB
54 文件总大小: 8381KB, 已下载:8381KB, 下载速度:8582KB
58 文件总大小: 8381KB, 已下载:8381KB, 下载速度:8582KB
70 文件总大小: 8381KB, 已下载:8381KB, 下载速度:8582KB
41 文件总大小: 8381KB, 已下载:8381KB, 下载速度:8582KB
72 文件总大小: 8381KB, 已下载:8381KB, 下载速度:8582KB
总共下载文件耗时:348s
执行完后查看目标文件夹:
可以正常打开:
对比单线程,在线程数为100的情况下,速度只提升了3倍左右。这是因为idea的下载服务器没有限速,多线程速度的提升仅仅是在充分的压榨本地的带宽,所以提升的幅度不大。
2、云盘链接:云盘对单个线程的下载速度做了限制,现在使用云盘的下载链接来测试多线程和单线程的下载速度,效果会更明显。
二、关键词:
1、HTTP协议Range请求头:获取部分资源的范围请求,通过指定Range即可告知服务器资源的指定范围。格式: Range: bytes=start-end,如
获取字节范围 5001-10000
Range: bytes=5001-10000
也可以指定开始位置不指定结束位置,表示获取开始位置之后的全部数据
Range: bytes=5001-
服务器接收到带有Range的请求,会在处理请求之后返回状态码为206 Partial Content的响应。
基于Range的特性,可以实现文件的多线程下载,文件的断点续传。
2、RestTemplate:这里请求使用的是SpringMVC中的RestTemplate;
(1)对于Https,需要设置RestTemplate绕过证书验证。
三、代码: