Java线程池实现批量下载文件
时间: 2023-08-26 18:06:05 浏览: 113
您好!以下是使用Java线程池实现批量下载文件的示例代码:
```java
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class FileDownloader {
private static final int NUM_THREADS = 5; // 线程池中的线程数量
public static void main(String[] args) {
List<String> fileUrls = new ArrayList<>();
fileUrls.add("https://example.com/file1.txt");
fileUrls.add("https://example.com/file2.txt");
fileUrls.add("https://example.com/file3.txt");
// 添加更多文件URL到fileUrls列表中
ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);
for (String fileUrl : fileUrls) {
executor.execute(() -> {
try {
downloadFile(fileUrl);
} catch (IOException e) {
e.printStackTrace();
}
});
}
executor.shutdown();
}
private static void downloadFile(String fileUrl) throws IOException {
URL url = new URL(fileUrl);
String fileName = getFileNameFromUrl(url);
try (BufferedInputStream in = new BufferedInputStream(url.openStream());
FileOutputStream fileOutputStream = new FileOutputStream(fileName)) {
byte[] dataBuffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(dataBuffer, 0, 1024)) != -1) {
fileOutputStream.write(dataBuffer, 0, bytesRead);
}
} catch (IOException e) {
throw e;
}
System.out.println("Downloaded: " + fileName);
}
private static String getFileNameFromUrl(URL url) {
String[] segments = url.getFile().split("/");
return segments[segments.length - 1];
}
}
```
这段代码创建了一个存储文件URL的列表 `fileUrls`,然后使用线程池 `ExecutorService` 将每个文件的下载任务提交给线程池执行。在 `downloadFile` 方法中,使用输入流从URL中读取文件数据,并使用输出流将数据写入磁盘。每个下载任务都在单独的线程中执行。
请注意,此示例仅演示了如何使用线程池实现批量下载文件,并没有处理下载失败、错误处理等其他细节。根据您的实际需求,您可能需要根据情况进行适当的修改和改进。
希望能对您有所帮助!如果您有任何其他问题,请随时提问。
阅读全文