«

Java中如何用ZIP压缩多个文件

磁力搜索 • 4 天前 • 1 次点击 • 资讯分享


java中压缩多个文件到zip的核心方法是使用java.util.zip包中的zipoutputstream,遍历每个文件并创建对应的zipentry。1. 创建文件列表;2. 定义zip文件名;3. 使用zipfiles方法逐个写入文件内容至zip流,若文件不存在则跳过。处理大型文件时应采用流式读取以避免内存溢出,并可调整缓冲区大小或使用bufferedinputstream提升io效率。保留目录结构的关键在于使用files.walkfiletree递归遍历目录并计算相对路径作为zipentry名称。如需密码保护,则需借助第三方库zip4j,通过设置zipparameters启用aes加密和密码,将文件添加至受保护的zip包中。

Java中如何用ZIP压缩多个文件

Java中压缩多个文件到ZIP,其实并不复杂,核心在于使用java.util.zip包中的类。你需要创建ZipOutputStream,然后遍历要压缩的文件,为每个文件创建一个ZipEntry,并将文件内容写入ZipOutputStream。最后记得关闭流。

Java中如何用ZIP压缩多个文件

解决方案

Java中如何用ZIP压缩多个文件

首先,你需要准备好你要压缩的文件列表。这可以是一个File对象的数组,或者一个Path对象的列表,取决于你的代码风格和需求。

立即学习“Java免费学习笔记(深入)”;

Java中如何用ZIP压缩多个文件
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipMultipleFiles {

    public static void main(String[] args) throws IOException {
        // 1. 定义要压缩的文件列表
        List<Path> filesToZip = new ArrayList<>();
        filesToZip.add(Paths.get("file1.txt")); // 假设存在 file1.txt
        filesToZip.add(Paths.get("file2.txt")); // 假设存在 file2.txt

        // 2. 定义 ZIP 文件名
        String zipFileName = "multiple_files.zip";

        // 3. 调用压缩方法
        zipFiles(filesToZip, zipFileName);

        System.out.println("文件压缩完成!");
    }

    public static void zipFiles(List<Path> files, String zipFileName) throws IOException {
        try (FileOutputStream fos = new FileOutputStream(zipFileName);
             ZipOutputStream zos = new ZipOutputStream(fos)) {

            for (Path file : files) {
                if (!Files.exists(file)) {
                    System.err.println("文件不存在: " + file.toString());
                    continue; // 跳过不存在的文件,不中断整个压缩过程
                }

                ZipEntry zipEntry = new ZipEntry(file.getFileName().toString());
                zos.putNextEntry(zipEntry);

                try (FileInputStream fis = new FileInputStream(file.toFile())) {
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = fis.read(buffer)) > 0) {
                        zos.write(buffer, 0, len);
                    }
                }
                zos.closeEntry();
            }
        }
    }
}
登录后复制


    还没收到回复