java 根据文件List<InputStream> 批量下载文件
时间: 2024-09-19 17:01:56 浏览: 43
在 Java 中,如果你需要批量从网络或其他源下载多个文件并存储为 InputStream,可以按照以下步骤操作:
1. **创建一个文件列表**:
首先,你需要一个 `List<InputStream>`,其中每个元素代表一个待下载的文件流。你可以从网络上获取这个列表,例如通过 URL 或其他网络服务。
```java
List<InputStream> inputStreams = new ArrayList<>();
for (String url : urls) {
try (HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection()) {
inputStreams.add(connection.getInputStream());
} catch (IOException e) {
// 捕获并处理异常
log.error("Failed to download file from {}", url, e);
}
}
```
2. **线程池下载**:
为了提高效率,可以考虑使用线程池并发地下载文件。`java.util.concurrent.ExecutorService` 可以帮助管理线程。这里是一个简单的例子:
```java
ExecutorService executor = Executors.newFixedThreadPool(5); // 使用5个线程
Future<?>[] futures = new Future[inputStreams.size()];
for (int i = 0; i < inputStreams.size(); i++) {
final int index = i;
futures[index] = executor.submit(() -> {
try {
// 这里假设你能处理InputStream,比如保存到本地文件
saveToFile(inputstreams.get(index), "file_" + index);
} catch (Exception e) {
// 同样处理异常
log.error("Error saving file", e);
}
});
}
// 等待所有任务完成
for (Future<?> future : futures) {
future.get();
}
executor.shutdown();
```
3. **保存文件**:
在这个示例中,`saveToFile(InputStream is, String fileName)` 方法将输入流转换为文件,具体实现取决于你的需求。例如,如果想要保存到磁盘,可以这样做:
```java
public static void saveToFile(InputStream is, String fileName) throws IOException {
File outputFile = new File(fileName);
byte[] buffer = new byte[4096];
OutputStream outputStream = new FileOutputStream(outputFile);
while (is.read(buffer) != -1) {
outputStream.write(buffer);
}
outputStream.close();
is.close();
}
```
阅读全文