java解压zip、rar(多级文件)

/**
     * 解压上传文件    
     * @param importZipFilePath
     * 上传文件地址
     * @param importFilePath
     * 解压文件存放地址
     * @param cancel
     * @return
     */
    public Map<String, Object> unCompressFiles(String importZipFilePath,String importFilePath,String cancel){
        Map<String,Object> result = new HashMap<>();
        File importZipFile = new File(importZipFilePath);
        File[] compressFiles = importZipFile.listFiles();
        List<String> list = new ArrayList<>();
        if(!StringUtils.isNull(cancel)){
            String[] params =null;
            if(cancel.indexOf(",")>0){
                params = cancel.split(",");
                list = Arrays.asList(params);
            }else{
                list.add(cancel);
            }
        }
        if(compressFiles !=null && compressFiles.length>0){
            for(File compressFile :compressFiles){
                String fileName = compressFile.getName();
                String realName =  compressFile.getName();
                String filePath = compressFile.getPath();
                if(list.contains(fileName)){
                    continue;
                }
                String fileType = fileName.substring(fileName.lastIndexOf(".")+1);
                if(fileName.toLowerCase().endsWith(".zip") || fileName.toLowerCase().endsWith(".rar")){
                    fileName = fileName.substring(0, fileName.lastIndexOf("."));
                }
                String unCompressFilePath =importFilePath+separator+fileName;
                File importFile = new File(unCompressFilePath);
                 if(importFile.exists()){
                     FileUtils.deleteDirectory(unCompressFilePath);
                     importFile.mkdirs();
                 }else{
                     importFile.mkdirs();
                 }
                 try {
                    if(fileType.equals("zip")){
                         unZipFile(filePath, unCompressFilePath);
                     }else if(fileType.equals("rar")){
                         unRarFile(filePath, unCompressFilePath);
                     }
                } catch (Exception e) {
                    if(result.isEmpty() || (!result.isEmpty() && result.get("201")==null)){
                        result.put("201", realName+":上传文件已损坏。");
                    }else{
                        result.put("201", realName+"、"+result.get("201"));
                    }
                    FileUtils.deleteDirectory(unCompressFilePath);
                }finally{
                    System.gc();
                    FileUtils.deleteDirectory(filePath);
                }
            }
        }else{
            result.put("500", "文件上传失败。");
        }
        if(result !=null && result.size()>0){
            return result;
        }
        return null;
        

    }

/**
     * @decription 解压zip文件。
     * @param zipfile
     * @param descDir
     * @throws IOException
     */
    @SuppressWarnings("rawtypes")
    public static void unZipFile(String zipPath, String descDir){
        org.apache.tools.zip.ZipFile zipFile = null;
        InputStream in = null;
        FileOutputStream out = null;
        try{
            zipFile = new org.apache.tools.zip.ZipFile(zipPath);
            Enumeration e = zipFile.getEntries();
            org.apache.tools.zip.ZipEntry zipEntry = null;
            while(e.hasMoreElements()){
                zipEntry = (org.apache.tools.zip.ZipEntry) e.nextElement();
                if (zipEntry.isDirectory()) {
                     String name = zipEntry.getName();
                     name = name.substring(0, name.length() - 1);
                     File f = new File(descDir + File.separator + name);
                     f.mkdir();
                }else{
                     String fileName = zipEntry.getName();
                     fileName = fileName.replace('\\', '/');
                     if (fileName.indexOf("/") != -1) {
                          createDirectory(descDir, fileName.substring(0,fileName.lastIndexOf("/")));
                          fileName = fileName.substring(fileName.lastIndexOf("/") + 1, fileName
                              .length());
                     }
                     File f = new File(descDir + separator+ zipEntry.getName());
                     f.createNewFile();
                     in = zipFile.getInputStream(zipEntry);
                     out = new FileOutputStream(f);
        
                     byte[] by = new byte[1024];
                     int c;
                     while ((c = in.read(by)) != -1) {
                      out.write(by, 0, c);
                     }
                }
           }
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }finally{
            if(out!=null){
                try {
                    out.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            System.gc();
            FileUtils.deleteDirectory(zipPath);
        }
    }
     /**
      * 创建目录
      * @param directory
      * 父目录
      * @param subDirectory
      * 子目录
      */
    private static void createDirectory(String directory, String subDirectory) {
        String dir[];
        File file = new File(directory);
        if(subDirectory == "" && file.exists() != true){
            file.mkdir();
        }else if (subDirectory != ""){
           dir = subDirectory.replace('\\', '/').split("/");
           for (int i = 0; i < dir.length; i++) {
                File subFile = new File(directory + separator + dir[i]);
                if (subFile.exists() == false){
                    subFile.mkdir();
                }
                directory += separator + dir[i];
           }
        }
    }
    /**
     * @author Hanhh
     * @data 2016-11-02
     * 根据原始rar路径,解压到指定文件夹下.      
     * @param srcRarPath 原始rar路径
     * @param dstDirectoryPath 解压到的文件夹      
     * @throws IOException
     * @throws RarException
     */
     public static void unRarFile(String srcRarPath, String dstDirectoryPath){
         Archive archive = null;
         FileOutputStream os = null;
         try{
             archive = new Archive(new File(srcRarPath));
         if (archive != null) {
             //a.getMainHeader().print(); // 打印文件信息.
             FileHeader fh = archive.nextFileHeader();
             while(fh != null) {
                      //防止文件名中文乱码问题的处理
                 String fileName = fh.getFileNameW().isEmpty()?fh.getFileNameString():fh.getFileNameW();
                 if(fh.isDirectory()){ // 文件夹
                     File fol = new File(dstDirectoryPath + separator + fileName);
                     fol.mkdirs();
                 }else{ // 文件
                     File out = new File(dstDirectoryPath + separator + fileName.trim());
                     if(!out.exists()){
                         if(!out.getParentFile().exists()){// 相对路径可能多级,可能需要创建父目录.
                             out.getParentFile().mkdirs();
                         }
                         out.createNewFile();
                     }
                     os = new FileOutputStream(out);
                     archive.extractFile(fh, os);
                 }
                 fh = archive.nextFileHeader();
             }
            
         }
         }catch  (Exception ex) {
             ex.printStackTrace();
         }finally{
             if(archive !=null){
                 try {
                    archive.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
             }
             if(os !=null){
                 try {
                     os.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
             }
             System.gc();
             FileUtils.deleteDirectory(srcRarPath);
         }
     }

<think>我们正在回答用户关于“如何解压zip文件的方法或工具”的问题。根据提供的引用资料,我们可以总结出几种解压ZIP文件的方法和工具。引用[1]提到了“解压专家”,这是一款轻量级的解压工具,支持多种格式,包括ZIPRAR等。它操作简单,适合日常使用。引用[2]介绍了7-Zip,这是一款免费开源的文件压缩与解压缩工具,支持多种格式,具有高压缩比和高速度。引用[3]提到了一款基于C++的Zip压缩解压缩工具,可以处理文件夹和多文件。引用[4]和[5]则分别提到了Java和SpringBoot中的ZIP解压工具类。因此,我们可以将解压ZIP文件的方法分为两类:使用现成的软件工具和使用编程工具类。回答结构:1.介绍使用软件工具解压ZIP文件(适合普通用户)-解压专家(引用[1])-7-Zip(引用[2])2.介绍使用编程方法解压ZIP文件(适合开发者)-Java工具类(引用[4])-SpringBoot工具类(引用[5])-C++工具(引用[3])注意:用户可能是一般用户,也可能是开发者,所以我们需要覆盖这两种情况。同时,根据指令,我们需要在回答末尾生成相关问题。另外,注意在适当的地方添加引用标识。</think>### 如何解压 ZIP 文件:方法与工具指南 解压 ZIP 文件可通过专用软件或编程工具实现,以下是具体方法: #### 一、软件工具(适合普通用户) 1. **解压专家**(轻量级工具) - **支持格式**:ZIPRAR、7z 等 - **操作步骤**: - 安装后,将 ZIP 文件拖入软件窗口 - 或右键点击文件选择“使用解压专家解压” - **特点**:操作简单,解压速度快,适合日常小文件[^1] 2. **7-Zip**(专业开源工具) - **支持格式**:ZIP、7Z、GZIP 等 - **操作步骤**: - 安装后右键点击 ZIP 文件 - 选择 `7-Zip > 解压到指定文件夹` - **特点**:高压缩比,支持加密文件,跨平台(Windows/Linux)[^2] #### 二、编程方法(适合开发者) 1. **Java 解压工具类** - 使用 `ZipUtil` 类处理多级文件夹: ```java // 示例:解压 ZIP 到指定路径 new ZipUtil().unzip("file.zip", "output_folder/"); ``` - 依赖库:`commons-compress`(需添加 Maven 依赖)[^4][^5] 2. **C++ 解压工具** - 支持递归解压文件夹: ```cpp // 伪代码示例 unzip("archive.zip", "target_dir/", recursive=true); ``` - 适用场景:处理文本/图像/音视频等格式[^3] 3. **Python 标准库** - 使用内置 `zipfile` 模块: ```python import zipfile with zipfile.ZipFile("file.zip", 'r') as zip_ref: zip_ref.extractall("output_path/") ``` #### 三、高效处理建议 - **大文件传输**:优先用 7-Zip(压缩率高)[^1][^2] - **批量处理**:编程工具类(如 Java/C++)更高效[^3][^4] - **跨平台需求**:选 7-Zip 或 Python 脚本
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值