朋也的博客 » 首页 » 文章

Java中压缩/解压zip包

作者:朋也
日期:2019-09-03
类别:java学习笔记 


版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证

整理一个zip的压缩/解压工具类

压缩

自定义添加文件打包

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

public class ZipUtil {

    /**
     * 自定义添加文件生成zip包,zip包中没有目录结构
     * <p>
     * 用法:ZipUtil.zipFiles("/Users/hh/git/job/circle/tmp.zip",
     * "/Users/hh/git/job/circle/tmp/aa.txt",
     * "/Users/hh/Downloads/test_2.jpg",
     * "/Users/hh/git/job/circle/tmp/bb.txt");
     *
     * @param zipFileName 全路径的zip文件包的名字
     * @param files       要添加到zip包中的文件的全路径
     */
    public static void zipFiles(String zipFileName, String... files) {
        try {
            byte[] buffer = new byte[1024];
            File zipFile = new File(zipFileName);
            FileOutputStream fos = new FileOutputStream(zipFile);
            ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos));
            for (String file : files) {
                File file1 = new File(file);
                String fileName = file1.getName();
                ZipEntry zipEntry = new ZipEntry(fileName);
                zos.putNextEntry(zipEntry);
                FileInputStream fis = new FileInputStream(file1);
                int len;
                while ((len = fis.read(buffer)) > 0) {
                    zos.write(buffer, 0, len);
                }
                fis.close();
            }
            zos.closeEntry();
            zos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

对文件夹打zip包, 被压缩的文件夹里可以有多层文件夹

链接文原: https://atjiu.github.io/2019/09/03/java-zip/

/**
  * 压缩文件夹
  *
  * @param zipFileName 全路径的zip文件包的名字
  * @param dir         要压缩的文件夹的路径
  */
public static void zipDir(String zipFileName, String dir) {
    try {
        File zipFile = new File(zipFileName);
        FileOutputStream fos = new FileOutputStream(zipFile);
        ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos));
        File dirFile = new File(dir);
        addEntry(dirFile, zos, "");
        zos.closeEntry();
        zos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static void addEntry(File file, ZipOutputStream zos, String root) throws IOException {
    byte[] buffer = new byte[1024];
    for (File file1 : file.listFiles()) {
        System.out.println(file1.getName());
        if (file1.isDirectory()) {
            addEntry(file1, zos, file1.getName());
        } else {
            String fileName = file1.getName();
            ZipEntry zipEntry = new ZipEntry(root + "/" + fileName);
            zos.putNextEntry(zipEntry);
            FileInputStream fis = new FileInputStream(file1);
            int len;
            while ((len = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, len);
            }
            fis.close();
        }
    }
}

解压

public static void unzip(String zipFilePath, String destDir) {
    File dir = new File(destDir);
    // create output directory if it doesn't exist
    if (!dir.exists()) dir.mkdirs();
    FileInputStream fis;
    //buffer for read and write data to file
    byte[] buffer = new byte[1024];
    try {
        fis = new FileInputStream(zipFilePath);
        ZipInputStream zis = new ZipInputStream(fis);
        ZipEntry ze = zis.getNextEntry();
        while (ze != null) {
            String fileName = ze.getName();
            File newFile = new File(destDir + File.separator + fileName);
            System.out.println("Unzipping to " + newFile.getAbsolutePath());
            //create directories for sub directories in zip
            new File(newFile.getParent()).mkdirs();
            FileOutputStream fos = new FileOutputStream(newFile);
            int len;
            while ((len = zis.read(buffer)) > 0) {
                fos.write(buffer, 0, len);
            }
            fos.close();
            //close this ZipEntry
            zis.closeEntry();
            ze = zis.getNextEntry();
        }
        //close last ZipEntry
        zis.closeEntry();
        zis.close();
        fis.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}