栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java递归解压zip压缩包

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java递归解压zip压缩包

场景:zip压缩包里面嵌套多层文件夹或者zip压缩包;

使用递归的方式进行解压,解压后得到的目录结构和压缩包目录结构完全一致,非常好用!

package com.zhh.api.util;

import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;


@Slf4j
public class FileUtil {

    
    public static void main(String[] args) {
        // 压缩包路径
        String zipPath = "F:\dt\test\old\zipSum\zipSum6个压缩包.zip";
        // 解压后存放路径
        String folderPath =  "F:\dt\test\old\zipSum\33";
        log.info("开始");
        unZipRecursion(zipPath, folderPath);
        log.info("结束");
    }

    
    public static void unZipRecursion(String zipPath, String targetPath) {
        long start = System.currentTimeMillis();
        // 第一次解压
        boolean flag = unZip(new File(zipPath),targetPath);
        if (flag){
            // 后续递归解压
            scanFilesWithRecursion(targetPath);
        }else {
            log.info("解压失败");
        }
        long end = System.currentTimeMillis();
        log.info("解压完成, 耗时:{} ms",(end - start));
    }

    
    public static boolean unZip(File srcFile, String destDirPath) {
        // 判断源文件是否存在
        if (!srcFile.exists()) {
            log.error("此文件不存在:{}",srcFile.getPath());
            return false;
        }
        // 开始解压
        try (ZipFile zipFile = new ZipFile(srcFile, Charset.forName("GBK"))){
            Enumeration entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry entry = (ZipEntry) entries.nextElement();
                // 如果是文件夹,就创建个文件夹
                if (entry.isDirectory()) {
                    String dirPath = destDirPath + File.separator + entry.getName();
                    File dir = new File(dirPath);
                    boolean mkdirs = dir.mkdirs();
                } else {
                    // 如果是文件,就先创建一个文件,然后用io流把内容copy过去
                    File targetFile = new File(destDirPath + File.separator + entry.getName());
                    // 保证这个文件的父文件夹必须要存在
                    if(!targetFile.getParentFile().exists()){
                        boolean mkdirs = targetFile.getParentFile().mkdirs();
                        log.info("保证这个文件的父文件夹必须要存在:{}",mkdirs);
                    }
                    boolean newFile = targetFile.createNewFile();
                    if (newFile){
                        // 将压缩文件内容写入到这个文件中
                        // try-with-resources 自动关闭流
                        try( InputStream is = zipFile.getInputStream(entry); FileOutputStream fos = new FileOutputStream(targetFile)) {
                            int len;
                            byte[] buf = new byte[2048];
                            while ((len = is.read(buf)) != -1) {
                                fos.write(buf, 0, len);
                            }
                        } catch (Exception e){
                            log.error("解压失败",e);
                        }
                    }
                }
            }
            return true;
        } catch (Exception e) {
            log.error("解压失败",e);
            return false;
        }
    }
    
    public static void scanFilesWithRecursion(String folderPath){
        File directory = new File(folderPath);
        if(!directory.isDirectory()){
            log.error("不是一个文件夹:{}",folderPath);
        }
        // 遍历文件夹
        if(directory.isDirectory()){
            File [] filelist = directory.listFiles();
            for(int i = 0; i < Objects.requireNonNull(filelist).length; i ++){
                String name = filelist[i].getAbsolutePath().substring(filelist[i].getAbsolutePath().lastIndexOf(".") + 1);
                    // 如果是zip文件,解密
                    if ("zip".equals(name)) {
                        //sum--;
                        // 压缩文件名称
                        String zipFolderName = filelist[i].getName().substring(0, filelist[i].getName().lastIndexOf("."));
                        // 创建解压后的存放文件目录,文件名称为压缩包名称
                        String nowUnZipPath = directory.getPath() + File.separator + zipFolderName;
                        File nowUnZipPathFile = new File(nowUnZipPath);
                        nowUnZipPathFile.mkdirs();
                        boolean flag = unZip(new File(filelist[i].getAbsolutePath()), nowUnZipPath);
                        if (flag) {
                            // 解压成功,删除压缩包
                            boolean deleteFlag = filelist[i].delete();
                            log.info("解压成功,删除临时压缩包,路径:{},是否删除成功:{}", filelist[i].getPath(), deleteFlag);
                        }
                        // 递归
                        scanFilesWithRecursion(nowUnZipPathFile.getPath());
                    } else if (new File(filelist[i].getPath()).isDirectory()) {
                        // 递归
                        scanFilesWithRecursion(filelist[i].getPath());
                    }
            }
        }
    }

}

非常好用,百分百可用!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/572294.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号