public class ZipTest {

 
 private static void createDirectory(String directory, String subDirectory) {
     String dir[];
     File fl = new File(directory);
     try {
       if (subDirectory == "" && fl.exists() != true)
         fl.mkdir();
       else if (subDirectory != "") {
         dir = subDirectory.replace('\\', '/').split("/");
         for (int i = 0; i < dir.length; i++) {
           File subFile = new File(directory + File.separator + dir[i]);
           if (subFile.exists() == false)
             subFile.mkdir();
           directory += File.separator + dir[i];
         }
       }
     }
     catch (Exception ex) {
       System.out.println(ex.getMessage());
     }
   }

 
 public static void unZip(String zipFileName, String outputDirectory) throws Exception {
     try {
       org.apache.tools.zip.ZipFile zipFile = new org.apache.tools.zip.ZipFile(zipFileName);
       java.util.Enumeration e = zipFile.getEntries();
       org.apache.tools.zip.ZipEntry zipEntry = null;
       createDirectory(outputDirectory, "");
       while (e.hasMoreElements()) {
         zipEntry = (org.apache.tools.zip.ZipEntry) e.nextElement();
         System.out.println("unziping " + zipEntry.getName());
         if (zipEntry.isDirectory()) {
           String name = zipEntry.getName();
           name = name.substring(0, name.length() - 1);
           File f = new File(outputDirectory + File.separator + name);
           f.mkdir();
           System.out.println("創建目錄:" + outputDirectory + File.separator + name);
         }
         else {
           String fileName = zipEntry.getName();
           fileName = fileName.replace('\\', '/');
           if (fileName.indexOf("/") != -1)
           {
               createDirectory(outputDirectory,
                               fileName.substring(0, fileName.lastIndexOf("/")));
               fileName=fileName.substring(fileName.lastIndexOf("/")+1,fileName.length());
           }

                    File f = new File(outputDirectory + File.separator + zipEntry.getName());

           f.createNewFile();
           InputStream in = zipFile.getInputStream(zipEntry);
           FileOutputStream out=new FileOutputStream(f);

           byte[] by = new byte[1024];
           int c;
           while ( (c = in.read(by)) != -1) {
             out.write(by, 0, c);
           }
           out.close();
           in.close();
         }
       }
        }
     catch (Exception ex) {
       System.out.println(ex.getMessage());
     }
        
     }

 
 
 public static void main(String[] args) {
 
  //ZipTest.unZip("d:\\export.zip", "d:\\file", 1);
  
   try {
  ZipTest.unZip("d:\\test.zip", "d:\\");
 } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 System.out.println("this is test!!!");
 }
}

1.因為ZipOutputStream壓縮和解壓ZIP文件對文件名都是以UTF-8編碼方式來處理的,而WinZip對文件名只會以ASCII編碼方式來處理。所以他們之間會產生沖突:WinZip解壓Java產生的壓縮文件時文件名亂碼;Java解壓WinZip產生的壓縮文件時出現異常。
解決辦法:Apache Ant有個包專門處理ZIP文件,可以指定文件名的編碼方式。由此可以解決問題。

ant.jar (1.70) 測試通過



------君臨天下,舍我其誰------