java多线程下载文件
时间: 2023-10-30 22:07:01 浏览: 101
Java多线程下载文件可以使用Java并发编程中的concurrent包来实现。一般有两种方式:一种是将网络路径的文件流切割成多块,每个线程下载一小部分,然后写入到文件里面,组成一个文件;另一种是使用线程池,当有多个文件需要下载时,每个线程去下载一个文件即可。以下是一个使用线程池的示例代码:
```java
public class DownloadFileWithThreadPool {
public void getFileWithThreadPool(String urlLocation, String filePath, int poolLength) throws IOException {
ExecutorService threadPool = Executors.newCachedThreadPool();
long len = getContentLength(urlLocation);
System.out.println(len);
for (int i = 0; i < poolLength; i++) {
long start = i * len / poolLength;
long end = (i + 1) * len / poolLength - 1;
if (i == poolLength - 1) {
end = len;
}
System.out.println(start + "---------------" + end);
DownloadWithRange download = new DownloadWithRange(urlLocation, filePath, start, end);
threadPool.execute(download);
}
threadPool.shutdown();
}
public static long getContentLength(String urlLocation) throws IOException {
URL url = null;
if (urlLocation != null) {
url = new URL(urlLocation);
}
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
long len = conn.getContentLength();
return len;
}
}
```
其中,getFileWithThreadPool方法接收三个参数:urlLocation表示文件的网络路径,filePath表示文件下载后保存的本地路径,poolLength表示线程池的大小。getContentLength方法用于获取文件的长度。DownloadWithRange是一个实现了Runnable接口的类,用于下载文件的具体实现。
阅读全文