java 万能解压zip工具类

项目中有需要解压zip包,但是网上搜了下,工具类过于局限,故整理一个万能的解压zip的工具类。如果大家有更好的方式欢迎交流!

工具类1:

/**
 * 解压文件到指定目录
 *
 * @param zipFile 压缩文件
 * @param descDir 指定目录
 */
public static void unZipFiles(File zipFile, String descDir) throws IOException {
    File pathFile = new File(descDir);
    if (!pathFile.exists()) {
        Assert.state(pathFile.mkdirs(), "无法创建目录/文件:" + pathFile);
    }
    /*
     * ZipFile类用于从zip文件中读取条目
     * getEntries()返回ZIP文件条目中的枚举
     */
    ZipFile zip = new ZipFile(zipFile);
    for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
        ZipEntry entry = (ZipEntry) entries.nextElement();
        //解决Linux乱码
        entry.setUnixMode(644);
        String zipEntryName = entry.getName();
        log.debug(zipEntryName);
        InputStream in = zip.getInputStream(entry);
        String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
        //判断路径是否存在,不存在则创建文件路径
        File file = new File(outPath.substring(0,      
        outPath.lastIndexOf(File.separator)));
        if (!file.exists()) {
            Assert.state(file.mkdirs(), "无法创建目录/文件:" + file.getAbsolutePath());
        }
        //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
        if (new File(outPath).isDirectory()) {
            continue;
        }
        OutputStream out = new FileOutputStream(outPath);
        byte[] buf = new byte[BUFFER_SIZE];
        int len;
        //Java获取byte数值保存到指定目录
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    }
    log.info("*******************解压完毕********************");
}

局限点:只支持解压zip包中只包含文件,不包含文件夹的zip

 

工具类2:

/**
 * 解压文件到指定目录
 *
 * @param zipFile 压缩文件
 * @param descDir 指定目录
 */
public static void unZipFiles(File zipFile, String descDir) throws IOException {
    File pathFile = new File(descDir);
    if (!pathFile.exists()) {
        Assert.state(pathFile.mkdirs(), "无法创建目录/文件:" + pathFile);
    }
    /*
     * ZipFile类用于从zip文件中读取条目
     * getEntries()返回ZIP文件条目中的枚举
     */
    ZipFile zip = new ZipFile(zipFile);
    for (Enumeration entries = zip.getEntries(); entries.hasMoreElements(); ) {
        ZipEntry entry = (ZipEntry) entries.nextElement();
        //解决Linux乱码
        entry.setUnixMode(644);
        String zipEntryName = entry.getName();
        log.debug(zipEntryName);
        InputStream in = zip.getInputStream(entry);
        String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
        //判断路径是否存在,不存在则创建文件路径
        File file = new File(outPath.substring(0, outPath.lastIndexOf("/")));
        if (!file.exists()) {
            Assert.state(file.mkdirs(), "无法创建目录/文件:" + file.getAbsolutePath());
        }
        //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
        if (new File(outPath).isDirectory()) {
            continue;
        }
        OutputStream out = new FileOutputStream(outPath);
        byte[] buf = new byte[BUFFER_SIZE];
        int len;
        //Java获取byte数值保存到指定目录
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    }
    log.info("*******************解压完毕********************");
}

局限点:只能解压zip包下为文件夹的zip

工具类3:(推荐)

/**
 * 解压文件到指定目录,包含解压带文件夹和不带文件夹的zip(万能)
 *
 * @param srcFile 压缩文件
 * @param destDirPath 指定目录
 */
public static void unZipFilesSecond(File srcFile,String destDirPath) throws Exception {
    if (!srcFile.exists()) {
        throw new Exception(srcFile.getPath() + "所指文件不存在");
    }
    //创建压缩文件对象
    ZipFile zipFile = new ZipFile(srcFile);
    log.info("*******************开始解压********************");
    Enumeration<?> entries = zipFile.getEntries();
    while (entries.hasMoreElements()) {
        ZipEntry entry = (ZipEntry) entries.nextElement();
        // 如果是文件夹,就创建个文件夹
        if (entry.isDirectory()) {
            String dirPath = destDirPath + "/" + entry.getName();
            srcFile.mkdirs();
        } else {
            // 如果是文件,就先创建一个文件,然后用io流把内容copy过去
            File targetFile = new File(destDirPath + "/" + entry.getName());
            // 保证这个文件的父文件夹必须要存在
            if (!targetFile.getParentFile().exists()) {
                targetFile.getParentFile().mkdirs();
            }
            targetFile.createNewFile();
            // 将压缩文件内容写入到这个文件中
            InputStream is = zipFile.getInputStream(entry);
            FileOutputStream fos = new FileOutputStream(targetFile);
            int len;
            byte[] buf = new byte[1024];
            while ((len = is.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }
            // 关流顺序,先打开的后关闭
            fos.close();
            is.close();
        }
    }
    log.info("*******************解压完毕********************");
}

可以解压zip包下含有文件和文件夹的zip

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java后端开发中,可以使用Java自带的工具类来处理压缩文件。其中,java.util.zip包提供了ZipOutputStream类,专门用于对文件进行压缩操作。通过使用ZipOutputStream类,我们可以将文件或文件夹压缩成一个zip文件。 使用ZipOutputStream类进行压缩文件的操作步骤如下: 1. 创建一个ZipOutputStream对象,指定要输出的文件流。 2. 使用putNextEntry方法创建一个新的ZipEntry对象,指定要压缩的文件或文件夹的路径。 3. 使用BufferedInputStream读取要压缩的文件或文件夹的内容,并使用ZipOutputStream的write方法将内容写入压缩文件。 4. 循环执行步骤2和步骤3,直到所有要压缩的文件或文件夹都被处理完毕。 5. 关闭ZipOutputStream对象,完成压缩操作。 下面是一个示例代码,展示了如何使用JavaZipOutputStream类进行文件压缩操作: ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipUtils { public static void compressFile(String sourceFilePath, String zipFilePath) throws IOException { File sourceFile = new File(sourceFilePath); FileOutputStream fos = new FileOutputStream(zipFilePath); ZipOutputStream zos = new ZipOutputStream(fos); compress(sourceFile, zos, ""); zos.close(); fos.close(); } private static void compress(File file, ZipOutputStream zos, String parentPath) throws IOException { if (file.isDirectory()) { // 如果是文件夹,则递归处理子文件夹和文件 File[] files = file.listFiles(); for (File subFile : files) { compress(subFile, zos, parentPath + file.getName() + "/"); } } else { // 如果是文件,则压缩文件 FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值