@Test
void realizeMultithreadedDownload() throws Exception {
final String urlString = "https://dldir1.qq.com/weixin/Windows/WeChatSetup.exe";
final String localPath = "src/main/resources/";
final int threads = 7;
File temp = new File(localPath + "temp");
temp.mkdir();
final String fileName = urlString.substring(urlString.lastIndexOf('/') + 1);
final long contentLength = new URL(urlString).openConnection().getContentLengthLong();
final long mean = contentLength / threads;
CountDownLatch latch = new CountDownLatch(threads);
for (int i = 0; i < threads; i++) {
int j = i;
new Thread(() -> {
try (OutputStream outputStream = new FileOutputStream(localPath + "temp/" + fileName + j)) {
URLConnection connection = new URL(urlString).openConnection();
connection.setRequestProperty("Range", "bytes=" + (j == 0 ? 0 : mean * j + 1) + "-" + (j == threads - 1 ? contentLength : mean * (j + 1)));
InputStream inputStream = connection.getInputStream();
inputStream.transferTo(outputStream);
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
latch.countDown();
}).start();
}
latch.await();
OutputStream outputStream = new FileOutputStream(localPath + fileName);
for (File file : Objects.requireNonNull(temp.listFiles())) {
InputStream inputStream = new FileInputStream(file);
inputStream.transferTo(outputStream);
inputStream.close();
file.delete();
}
outputStream.close();
temp.delete();
}