代码:

 package com.xiaobai;

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

 public class UnZipUtils {

     public static void main(String[] args) {
         try {
             //将temp下所有的压缩文件解压
             unzipFromLoc("F:\\BaiduNetdiskDownload\\03_Hadoop");
         } catch (Exception e) {
             e.printStackTrace();
         }
     }

     //从总目录下解压文件里所有的压缩包至目的文件路径
     public static void unzipFromLoc(String filePath) throws Exception{
         File file = new File(filePath);
         File[] list = file.listFiles();//固定元素,不包含新产生的
         String from = "";
         for(File f : list){
             if(f.isDirectory()) {
                 unzipFromLoc(f.getAbsolutePath());
             }else {
                 boolean bool = f.isFile();
                 if(bool){
                     from =  f.getAbsolutePath();
                     unZipFiles(new File(from),filePath);
                 }
             }
         }
     }

     /**
      * 解压文件到指定目录
      * 解压后的文件名,和之前一致
      * @param zipFile   待解压的zip文件
      * @param descDir   指定目录
      */
     public static void unZipFiles(File zipFile, String descDir) throws IOException {
         try{
             ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK"));//解决中文文件夹乱码
             File pathFile = new File(descDir);
             if (!pathFile.exists()) {
                 pathFile.mkdirs();
             }
 //即使有内层目录,目录里的文件也是可以在这里遍历出来的,只不过在内层目录之后,而且是带内层目录的全路径,所以解压时需要判断路径是否存在,
 // 不存在则创建内层目录dir;判断一下内层目录,continue,目录里面的文件再写
             for (Enumeration<? extends ZipEntry> entries = zip.entries(); entries.hasMoreElements();) {
                 ZipEntry entry = (ZipEntry) entries.nextElement();
                 String zipEntryName = entry.getName();
                 InputStream in = zip.getInputStream(entry);
                 String outPath = (descDir + File.separator + zipEntryName).replaceAll("\\\\", "/");
                 File file = new File(outPath);
                 if(entry.isDirectory()) {//有内层文件夹,需要创建新的内层目录后continue,后面内层文件夹里的压缩文件才有合法新路径,否则内层文件夹里的压缩文件使用路径创建流时报拒绝访问异常,因为父目录不存在
                     file.mkdirs();//是文件而不是文件夹路径的不能写这个,会创建到以文件名为最终目录名的全目录导致与文件路径冲突,下面流关联文件时因读取了同名文件夹而发生异常
                     continue;
                 }
                 // 输出文件路径信息
                 System.out.println(outPath);
                 FileOutputStream out = new FileOutputStream(outPath);
                 byte[] buf1 = new byte[1024];
                 int len;
                 while ((len = in.read(buf1)) > 0) {
                     out.write(buf1, 0, len);
                 }
                 in.close();
                 out.close();
 //                unZipFiles(file, outPath.substring(0, outPath.lastIndexOf('/')));//可递归解压zip,jar文件,不能解压rar文件
             }
             System.out.println("******************解压完毕********************");
             return;
         }catch (Exception e) {
             e.printStackTrace();
         }
     }
 }

参考:

https://blog.csdn.net/weixin_41722928/article/details/80832481

https://blog.csdn.net/SicongFu/article/details/84997715

https://blog.csdn.net/zcc_0015/article/details/40454777

java中正则匹配反斜杠问题:

https://www.cnblogs.com/chenkeyu/p/7574924.html

java解压多层目录中多个压缩文件和处理压缩文件中有内层目录的情况的更多相关文章

  1. 关于Java解压文件的一些坑及经验分享(MALFORMED异常)

    文章也已经同步到我的csdn博客: http://blog.csdn.net/u012881584/article/details/72615481 关于Java解压文件的一些坑及经验分享 就在本周, ...

  2. tar 只解压tar包中某个文件

    sh-4.1# ls test.tar sh-4.1# tar -tf test.tar ./ecs20161207.png ./ecs.png ./ecs.xml ./rds.png ./Scree ...

  3. 您试图从目录中执行CGI、ISAPI 或其他可执行程序,但该目录不允许执行程序

    您试图从目录中执行CGI.ISAPI 或其他可执行程序,但该目录不允许执行程序 本人使用WIN2003 INTERNET信息服务(IIS)管理器建立一个网站虚拟目录,结果浏览网页时出现错误,错误提示信 ...

  4. Java解压上传zip或rar文件,并解压遍历文件中的html的路径

    1.本文只提供了一个功能的代码 public String addFreeMarker() throws Exception { HttpSession session = request.getSe ...

  5. java解压多目录Zip文件(解决中文乱码问题)--转载

    原文地址:http://zhangyongbo.iteye.com/blog/1749439 import java.io.BufferedOutputStream; import java.io.F ...

  6. java 解压 zip 包并删除

    需求是这样的,  在服务器上有 运营上传的zip 包,内容是用户的照片,我需要做的是 获取这些照片上传,并保存到 数据库. 这里面的 上传照片,保存数据库都不难,主要问题是解压zip包,和删除zip ...

  7. Java 解压zip压缩包

    因为最近项目需要批量上传文件,而这里的批量就是将文件压缩在了一个zip包里,然后读取文件进行解析文件里的内容. 因此需要先对上传的zip包进行解压.以下直接提供代码供参考: 1.第一个方法是用于解压z ...

  8. 利用java解压,并重命名

    由于工作需要,写了一个小工具,利用java来解压文件然后对文件进行重命名 主要针对三种格式,分别是zip,rar,7z,经过我的多次实践我发现网上的类库并不能解压最新的压缩格式 对于zip格式: ma ...

  9. 【转】JAVA解压.TAR.Z及.ZIP文件

     解压.ZIP文件 package app.qdupr.Method; import java.io.File; import java.io.FileOutputStream; import jav ...

随机推荐

  1. java设计模式之策略模式

    策略模式 定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户(大话设计模式). 策略模式UML图   策略模式代码 古代的各种计谋都是一种策略,这次我们 ...

  2. synergy 两台Windows电脑配置过程

    Synergy 介绍 软件作用 Synergy 两台独立电脑,共享一套鼠标和键盘的工具, 软件原理(我自己想的) 保证两台电脑在一个局域网内,可以相互Ping通的电脑(这样才能直接通过TCP连接) 将 ...

  3. asp.net 运行时,&quot;未能映射路径&quot;

    asp.net 站点出现:未能映射路径,解决方案之一:发现原来是iis 应用程序池中设置了.net framework 版本为4.0了,而且VS中站点的版本为2.0引起的. 解决方案是把VS 中的站点 ...

  4. 作用域内优先级及this指针

    函数声明>变量声明 作用域:顶部----------------------> 函数声明会覆盖变量声明,但不会覆盖变量赋值 this指针不是变量.当调用括号的左边不是引用类型而是其它类型, ...

  5. vimium

    安装在chrome上的一个插件,可以实现chrome无鼠标无键盘操作. 事实上vimium就是提供了一系列的快捷键列表,所以只要熟悉了这些快捷键就可以方便使用了. 要查看快捷键列表,打开chrome, ...

  6. ECshop使用财付通接口支付时出现“[3006]您的请求无效,请重新再试

    ECshop使用财付通接口支付时出现“[3006]您的请求无效,请重新再试.”解决方案\includes\modules\payment\tenpay.php 行 104原来的为 $bill_no = ...

  7. 通过Orchard认识的Autofac

    反射Reflection 这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:'程序集(Assembly)'.'模块(Module)'.'类型(class)'组成,而反射提供一种编程 ...

  8. java字符串类型常量拼接与变量拼接的区别

    前言 首先看下下面代码结果是什么? package cn.demo_01; public class StringDemo02 { public static void main(String[] a ...

  9. select 如何在选中后获取选中的时是什么元素 ,(原生js)

    在日常开发中,我们经常遇到选择框的业务处理:如何去获取我们所选中的数据呢? 很多小伙伴还不是很熟悉! <!DOCTYPE html> <html lang="en" ...

  10. 编写程序,使用while循环将50到100的整数相加

    #include<iostream> int main(int argc, char const *argv[]) { using std::cout; ,b=; ){ a++; b=+b ...