Java实现文件压缩和解压

要压缩和解压,可以使用Java中的压缩库,如java.util.ziporg.apache.commons.compress

ZipOutputStream(压缩流)此类为以 ZIP 文件格式写入文件实现输出流过滤器。

ZipInputStream(解压流)此类为读取 ZIP 文件格式的文件实现输入流过滤器。

话不多说代码如下:

package file;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class FileCompressor {
    public static void main(String[] args) {
        File[] files = {new File("F:\\a\\66\\测试哈哈哈111.docx")};
        String zipFilePath = "compressed.zip";
        try {
            compressFiles(files, zipFilePath);
            System.out.println("Files compressed successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }

//        String zipFilePath = "F:/批量下载测试_系统管理员_202307040952.zip";
//        String destDir = "F:/a";
//
//        try {
//            extractFiles(zipFilePath, destDir);
//            System.out.println("Files extracted successfully.");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
    }

    /**
     * 压缩文件
     *
     * @param files       文件数组
     * @param zipFilePath 压缩文件路径
     * @throws IOException
     */
    public static void compressFiles(File[] files, String zipFilePath) throws IOException {
        //try-with-resources会自动关闭FileInputStream,无需手动调用close()方法
        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
            for (File file : files) {
                addToZip(file, file.getName(), zipOut);
            }
        }
    }

    private static void addToZip(File file, String fileName, ZipOutputStream zipOut) throws IOException {
        try (FileInputStream fis = new FileInputStream(file)) {
            //使用指定名称创建新的 ZIP 条目
            ZipEntry zipEntry = new ZipEntry(fileName);
            //写入新的 ZIP 文件条目
            zipOut.putNextEntry(zipEntry);
            //写入当前条目所对应的具体内容
            byte[] bytes = new byte[1024];
            int length;
            while ((length = fis.read(bytes)) >= 0) {
                zipOut.write(bytes, 0, length);
            }
        }
    }

    /**
     * 解压文件
     *
     * @param zipFilePath 压缩文件路径
     * @param destDir     目标目录路径
     * @throws IOException
     */
    public static void extractFiles(String zipFilePath, String destDir) throws IOException {
        try (ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath))) {
            ZipEntry entry;
            while ((entry = zipIn.getNextEntry()) != null) {
                //返回条目名称
                String filePath = destDir + File.separator + entry.getName();
                //如果为目录条目,则返回 true
                if (!entry.isDirectory()) {
                    extractFile(zipIn, filePath);
                } else {
                    //mkdirs()方法创建一个文件夹和它的所有父文件夹
                    File dir = new File(filePath);
                    dir.mkdirs();
                }
                zipIn.closeEntry();
            }
        }
    }

    private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
        File file = new File(filePath);
        //返回此抽象路径名父目录的抽象路径名
        File parentDir = file.getParentFile();
        //测试此抽象路径名表示的文件或目录是否存在
        if (!parentDir.exists()) {
            parentDir.mkdirs();
        }

        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file))) {
            byte[] bytes = new byte[1024];
            int length;
            while ((length = zipIn.read(bytes)) >= 0) {
                bos.write(bytes, 0, length);
            }
        }
    }
}