Java 批量下载文件并压缩

在开发过程中,经常会遇到需要批量下载文件并压缩的情况。比如要从服务器上下载多个文件,然后将这些文件打包成一个压缩文件,方便用户一次性下载。本文将介绍如何使用 Java 实现这个功能。

下载文件

要实现文件下载功能,我们可以使用 Java 的 java.net.URL 类来创建一个 URL 对象,然后通过该对象的 openStream 方法获取文件的输入流,最后使用 java.nio.file.Files 类的 copy 方法将文件流写入本地文件。

下面是一个示例代码,演示如何下载一个文件:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

public class FileDownloader {

    public static void downloadFile(String fileUrl, String destination) throws IOException {
        URL url = new URL(fileUrl);
        try (InputStream in = url.openStream();
             FileOutputStream out = new FileOutputStream(destination)) {
            Files.copy(in, Path.of(destination), StandardCopyOption.REPLACE_EXISTING);
        }
    }

    public static void main(String[] args) {
        String fileUrl = "
        String destination = "downloaded_file.txt";
        try {
            downloadFile(fileUrl, destination);
            System.out.println("File downloaded successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们使用 java.net.URL 类创建了一个 URL 对象,然后通过 openStream 方法获取了文件的输入流。接下来,我们创建了一个 FileOutputStream 对象,用于将文件写入本地磁盘。最后,我们使用 java.nio.file.Files 类的 copy 方法将文件流写入本地文件。

批量下载文件

如果要批量下载文件,我们可以将下载文件的 URL 存储在一个列表中,然后遍历列表,逐个下载文件。

下面是一个示例代码,演示如何批量下载文件:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;

public class BatchFileDownloader {

    public static void downloadFiles(List<String> fileUrls, String destination) throws IOException {
        for (String fileUrl : fileUrls) {
            URL url = new URL(fileUrl);
            String fileName = getFileNameFromUrl(fileUrl);
            String filePath = destination + "/" + fileName;
            try (InputStream in = url.openStream();
                 FileOutputStream out = new FileOutputStream(filePath)) {
                Files.copy(in, Path.of(filePath), StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }

    private static String getFileNameFromUrl(String fileUrl) {
        return fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
    }

    public static void main(String[] args) {
        List<String> fileUrls = new ArrayList<>();
        fileUrls.add("
        fileUrls.add("
        fileUrls.add("
        String destination = "downloads";
        try {
            downloadFiles(fileUrls, destination);
            System.out.println("Files downloaded successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,我们创建了一个 downloadFiles 方法,接受一个文件 URL 列表和一个目标文件夹作为参数。在方法内部,我们使用循环遍历文件 URL 列表,逐个下载文件。

压缩文件

要将多个文件打包成一个压缩文件,我们可以使用 Java 的 java.util.zip.ZipOutputStream 类。这个类可以将文件写入 ZIP 文件,并进行压缩。

下面是一个示例代码,演示如何将多个文件打包成一个压缩文件:

import java.io.*;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class FileCompressor {

    public static void compressFiles(List<String> filePaths, String destination) throws IOException {
        try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(destination))) {
            for (String filePath : filePaths) {
                File file = new File(filePath);
                FileInputStream in = new FileInputStream(file);
                out.putNextEntry(new ZipEntry(file.getName()));
                byte[] buffer = new byte[1024];
                int length;
                while ((length = in.read(buffer)) > 0) {
                    out.write(buffer, 0, length);