Java解壓縮zip - 解壓縮多個文件或文件夾

jopen 12年前發布 | 39K 次閱讀 Java Java開發

Java解壓縮zip - 多個文件(包括文件夾)

 

對多個文件和文件夾進行壓縮,對復雜的文件目錄進行解壓。

壓縮方法使用的是可變參數,可以壓縮1到多個文件..可以寫數組的方式或者一個個寫到參數列表里面...

ZipFiles(zip,"abc",new File("d:/English"),new File("d:/發放數據.xls"));

 

測試文件目錄結構:

Java解壓縮zip - 解壓縮多個文件或文件夾

 

測試的壓縮內容:English文件夾和同級的兩個excel文件

File[] files = new File[]{new File("d:/English"),new File("d:/發放數據.xls"),new File("d:/中文名稱.xls")};

下面是壓縮的代碼:

/**

 * 壓縮文件-由于out要在遞歸調用外,所以封裝一個方法用來
 * 調用ZipFiles(ZipOutputStream out,String path,File... srcFiles)
 * @param zip
 * @param path
 * @param srcFiles
 * @throws IOException
 * @author isea533
 */
public static void ZipFiles(File zip,String path,File... srcFiles) throws IOException{
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zip));
    ZipTest.ZipFiles(out,path,srcFiles);
    out.close();
    System.out.println("*****************壓縮完畢*******************");
}
/**
 * 壓縮文件-File
 * @param zipFile  zip文件
 * @param srcFiles 被壓縮源文件
 * @author isea533
 */
public static void ZipFiles(ZipOutputStream out,String path,File... srcFiles){
    path = path.replaceAll("\\*", "/");
    if(!path.endsWith("/")){
        path+="/";
    }
    byte[] buf = new byte[1024];
    try {
        for(int i=0;i<SRCFILES.LENGTH;I++){ while((len="in.read(buf))" len;="" int="" srcfiles[i].getname()));="" zipentry(path="" srcfiles[i].getname());="" +="" system.out.println(path="" fileinputstream(srcfiles[i]);="" in="new" fileinputstream="" else{="" zipfiles(out,path+srcpath,files);="" zipentry(path+srcpath));="" out.putnextentry(new="" }="" ;="" srcpath+="/" ?)){="" if(!srcpath.endswith(?="" ?);="" ?="" srcpath="srcFiles[i].getName();" string="" files="srcFiles[i].listFiles();" file[]="" if(srcfiles[i].isdirectory()){="">0){
                    out.write(buf,0,len);
                }
                out.closeEntry();
                in.close();
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}</SRCFILES.LENGTH;I++){></pre> <p></p>

 

在壓縮的時候,針對文件夾進行判斷,然后遞歸壓縮文件。

 



 

然后是解壓:

/**

 * 解壓到指定目錄
 * @param zipPath
 * @param descDir
 * @author isea533
 */
public static void unZipFiles(String zipPath,String descDir)throws IOException{
    unZipFiles(new File(zipPath), descDir);
}
/**
 * 解壓文件到指定目錄
 * @param zipFile
 * @param descDir
 * @author isea533
 */
@SuppressWarnings("rawtypes")
public static void unZipFiles(File zipFile,String descDir)throws IOException{
    File pathFile = new File(descDir);
    if(!pathFile.exists()){
        pathFile.mkdirs();
    }
    ZipFile zip = new ZipFile(zipFile);
    for(Enumeration entries = zip.getEntries();entries.hasMoreElements();){
        ZipEntry entry = (ZipEntry)entries.nextElement();
        String zipEntryName = entry.getName();
        InputStream in = zip.getInputStream(entry);
        String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;
        //判斷路徑是否存在,不存在則創建文件路徑
        File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
        if(!file.exists()){
            file.mkdirs();
        }
        //判斷文件全路徑是否為文件夾,如果是上面已經上傳,不需要解壓
        if(new File(outPath).isDirectory()){
            continue;
        }
        //輸出文件路徑信息
        System.out.println(outPath);

        OutputStream 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();
        }
    System.out.println("******************解壓完畢********************");
}</pre><br />

解壓的時候,針對文件夾判斷創建不存在的文件夾,對文件夾只創建,不進行解壓..因為解壓是針對文件的,不是文件夾,文件夾需要自己創建。

 

 

 

測試方法:

public static void main(String[] args) throws IOException {
        /**

     * 壓縮文件
     */
    File[] files = new File[]{new File("d:/English"),new File("d:/發放數據.xls"),new File("d:/中文名稱.xls")};
    File zip = new File("d:/壓縮.zip");
    ZipFiles(zip,"abc",files);

    /**
     * 解壓文件
     */
    File zipFile = new File("d:/壓縮.zip");
    String path = "d:/zipfile/";
    unZipFiles(zipFile, path);
}</pre><br />

測試方法并沒有對異常做任何處理,這是不對的,請不要模仿。

輸出結果:

abc/English/templete.xls
abc/English/中文/csdn/isea/533/abc/templete.xls
abc/English/中文/csdn/isea/533/abc/zipfile2/templete.xls
abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/templete.xls
abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/templete.xls
abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/領卡清單.xls
abc/English/中文/csdn/isea/533/abc/zipfile2/領卡清單.xls
abc/English/中文/csdn/isea/templete.xls
abc/English/中文/csdn/isea/領卡清單.xls
abc/English/中文/csdn/templete.xls
abc/English/領卡清單.xls
abc/發放數據.xls
abc/中文名稱.xls
*****************壓縮完畢*******************
d:/zipfile/abc/中文名稱.xls
d:/zipfile/abc/發放數據.xls
d:/zipfile/abc/English/領卡清單.xls
d:/zipfile/abc/English/中文/csdn/templete.xls
d:/zipfile/abc/English/中文/csdn/isea/領卡清單.xls
d:/zipfile/abc/English/中文/csdn/isea/templete.xls
d:/zipfile/abc/English/中文/csdn/isea/533/abc/templete.xls
d:/zipfile/abc/English/templete.xls
d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/templete.xls
d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/templete.xls
d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/templete.xls
d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/zipfile/abc/zipfile2/領卡清單.xls
d:/zipfile/abc/English/中文/csdn/isea/533/abc/zipfile2/領卡清單.xls
******************解壓完畢********************

 

Java解壓縮zip - 解壓縮多個文件或文件夾

轉自: http://blog.csdn.net/isea533/article/details/7995472

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!