zoukankan      html  css  js  c++  java
  • java解压多层目录中多个压缩文件和处理压缩文件中有内层目录的情况

    代码:

     1 package com.xiaobai;
     2 
     3 import java.io.File;
     4 import java.io.FileOutputStream;
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 import java.nio.charset.Charset;
     8 import java.util.Enumeration;
     9 import java.util.zip.ZipEntry;
    10 import java.util.zip.ZipFile;
    11 
    12 public class UnZipUtils {
    13 
    14     public static void main(String[] args) {
    15         try {
    16             //将temp下所有的压缩文件解压
    17             unzipFromLoc("F:\BaiduNetdiskDownload\03_Hadoop");
    18         } catch (Exception e) {
    19             e.printStackTrace();
    20         }
    21     }
    22 
    23     //从总目录下解压文件里所有的压缩包至目的文件路径
    24     public static void unzipFromLoc(String filePath) throws Exception{
    25         File file = new File(filePath);
    26         File[] list = file.listFiles();//固定元素,不包含新产生的
    27         String from = "";
    28         for(File f : list){
    29             if(f.isDirectory()) {
    30                 unzipFromLoc(f.getAbsolutePath());
    31             }else {
    32                 boolean bool = f.isFile();
    33                 if(bool){
    34                     from =  f.getAbsolutePath();
    35                     unZipFiles(new File(from),filePath);
    36                 }
    37             }
    38         }
    39     }
    40 
    41     /**
    42      * 解压文件到指定目录
    43      * 解压后的文件名,和之前一致
    44      * @param zipFile   待解压的zip文件
    45      * @param descDir   指定目录
    46      */
    47     public static void unZipFiles(File zipFile, String descDir) throws IOException {
    48         try{
    49             ZipFile zip = new ZipFile(zipFile, Charset.forName("GBK"));//解决中文文件夹乱码
    50             File pathFile = new File(descDir);
    51             if (!pathFile.exists()) {
    52                 pathFile.mkdirs();
    53             }
    54 //即使有内层目录,目录里的文件也是可以在这里遍历出来的,只不过在内层目录之后,而且是带内层目录的全路径,所以解压时需要判断路径是否存在,
    55 // 不存在则创建内层目录dir;判断一下内层目录,continue,目录里面的文件再写
    56             for (Enumeration<? extends ZipEntry> entries = zip.entries(); entries.hasMoreElements();) {
    57                 ZipEntry entry = (ZipEntry) entries.nextElement();
    58                 String zipEntryName = entry.getName();
    59                 InputStream in = zip.getInputStream(entry);
    60                 String outPath = (descDir + File.separator + zipEntryName).replaceAll("\\", "/");
    61                 File file = new File(outPath);
    62                 if(entry.isDirectory()) {//有内层文件夹,需要创建新的内层目录后continue,后面内层文件夹里的压缩文件才有合法新路径,否则内层文件夹里的压缩文件使用路径创建流时报拒绝访问异常,因为父目录不存在
    63                     file.mkdirs();//是文件而不是文件夹路径的不能写这个,会创建到以文件名为最终目录名的全目录导致与文件路径冲突,下面流关联文件时因读取了同名文件夹而发生异常
    64                     continue;
    65                 }
    66                 // 输出文件路径信息
    67                 System.out.println(outPath);
    68                 FileOutputStream out = new FileOutputStream(outPath);
    69                 byte[] buf1 = new byte[1024];
    70                 int len;
    71                 while ((len = in.read(buf1)) > 0) {
    72                     out.write(buf1, 0, len);
    73                 }
    74                 in.close();
    75                 out.close();
    76 //                unZipFiles(file, outPath.substring(0, outPath.lastIndexOf('/')));//可递归解压zip,jar文件,不能解压rar文件
    77             }
    78             System.out.println("******************解压完毕********************");
    79             return;
    80         }catch (Exception e) {
    81             e.printStackTrace();
    82         }
    83     }
    84 }
    View Code

    参考:

    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

  • 相关阅读:
    关于RadAsm中GetEnvironmentStrings的BUG。
    GetStartupInfo 反调试
    基于TLS的反调试技术
    几种RAID级别的比较
    常用的外网yum源之epel.repo
    常用yum源之(Percona MySQL)
    swap的几点理解
    solaris系统动态查看swap的使用情况
    一次CTS引发的网络故障
    一次goldengate故障引发的操作系统hang起,HA自动切换
  • 原文地址:https://www.cnblogs.com/free-wings/p/10628933.html
Copyright © 2011-2022 走看看