控制台会输出已下载个数和下载失败的URL 失败的可以手动可以进行重试
//urls 资源URL threadSize 线程数量(一般取CPU核数 * 2) outPath 下载目标目录路径
void downloadByUrl(List<String> urls, Integer threadSize, String outPath) {
File file = new File(outPath);
if(!file.exists()) {
file.mkdirs();
}
ExecutorService executorService = Executors.newFixedThreadPool(threadSize);
List<String> successUrl = new CopyOnWriteArrayList<>();
List<String> errorUrl = new CopyOnWriteArrayList<>();
boolean flag = true;
for (String urlStr : urls) {
executorService.submit(new Runnable() {
@Override
public void run() {
if (StringUtils.isBlank(urlStr)) {
return;
}
URL url = null;
try {
url = new URL(urlStr);
BufferedInputStream in = new BufferedInputStream(url.openStream());
String path = outPath;
path += urlStr.substring(urlStr.lastIndexOf("/"));
FileOutputStream out = new FileOutputStream(new File(path));
byte[] bytes = new byte[1024];
int length = 0;
while ((length = in.read(bytes)) != -1) {
out.write(bytes, 0, length);
}
in.close();
out.close();
successUrl.add(urlStr);
} catch (Exception e) {
System.out.println(urlStr);
errorUrl.add(urlStr);
e.printStackTrace();
}
}
});
}
while (flag) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int size = successUrl.size();
if (size == urls.size() - errorUrl.size()) {
flag = false;
}
//已下载个数
System.out.println(size);
}
}