java解壓多層目錄中多個壓縮文件和處理壓縮文件中有內層目錄的狀況

代碼:html

 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

參考:java

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

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

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

java中正則匹配反斜槓問題:.net

http://www.javashuo.com/article/p-clhydltq-hr.htmlcode

相關文章
相關標籤/搜索