2013年12月17日 星期二

Java 解開ZIP檔案

奮戰了幾天,雖然實作了JSP在線解開ZIP檔案的功能
但是有個致命的缺點
ZIP檔的檔案名稱不能含有非ASCII的字元(ISO-8859-1)
一遇上非ISO-8859-1編碼的字串
下面的程式就會停擺
google一下有個package可以解決這個問題
目前還在研究這個package
有收穫再貼上來分享
先看看下面簡易的在線解壓功能
老實說,效能不怎好
解相同的檔案較PHP及C#都要來的慢..


package com.jIAn.decompress;
import java.lang.*;
import java.io.*;
import java.util.zip.*;
public class zip
{
    public zip(){}
    public void DecompressFile(String arg_zipFileName, String arg_outputDirectory) throws Exception
    {
        ZipInputStream objZipInputStream = new ZipInputStream(new FileInputStream(arg_zipFileName));
        ZipEntry objZipEntry;
        InputStream objInputStream = null;
        File objFile ;
        int intStreamLength ;        
        while ((objZipEntry = objZipInputStream.getNextEntry()) != null) 
        {
            
            if (objZipEntry.isDirectory()) 
            {
                String strDirectoryName = objZipEntry.getName();
                strDirectoryName = strDirectoryName.substring(0, strDirectoryName.length() - 1);
                objFile = new File(arg_outputDirectory + File.separator + strDirectoryName);
                objFile.mkdir();
                System.out.println("建立資料夾 " + arg_outputDirectory + File.separator + strDirectoryName);
            }
            else 
            {
                objFile = new File(arg_outputDirectory + File.separator + objZipEntry.getName());
                objFile.createNewFile();
                FileOutputStream objFileOutputStream = new FileOutputStream(objFile);                
                while ((intStreamLength = objZipInputStream.read()) != -1)
                {
                    objFileOutputStream.write(intStreamLength);
                }
                objFileOutputStream.close();
            }
            System.out.println("解壓 " + objZipEntry.getName()+".......ok");
        }
        objZipInputStream.close();
    }

}
如何使用?
建立物件
zip objZip = new zip();
objZip.DecompressFile(欲解開的Zip檔,解到那一個目錄);
objZip.DecompressFile("C:/zip/123.zip","C:\\zip\\123");
還有一個要注意的地方
如果解壓到多層路徑需要先行建立多層路徑的目錄

沒有留言: