//这个解压代码效果一般,不推荐. 
package mypackage.test; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.zip.ZipEntry; 
import java.util.zip.ZipInputStream; 
/** */ 
/** 
* 使用java核心类库打包、解包zip文件。 
* 不足之处在于解压的 ZIP 文件中有中文文件名或有文件夹时,会解压失败 
* 在windows下解压后编码正常显示中文,而其他系统下则不能正常还原; 
*/ 
public class TestZip { 
/** */ 
/** 
  * 定义解压缩zip文件的方法 
  * @param zipFileName 
  * @param outputDirectory 
  */ 
public void unzip(String zipFileName, String outputDirectory) { 
  try { 
   ZipInputStream in = new ZipInputStream(new FileInputStream( 
     zipFileName)); 
   //获取ZipInputStream中的ZipEntry条目,一个zip文件中可能包含多个ZipEntry, 
   //当getNextEntry方法的返回值为null,则代表ZipInputStream中没有下一个ZipEntry, 
   //输入流读取完成; 
   ZipEntry z = in.getNextEntry(); 
   while (z != null) { 
    System.out.println("unziping: " + z.getName()); 
    //创建以zip包文件名为目录名的根目录 
    File f = new File(outputDirectory); 
    f.mkdir(); 
    if (z.isDirectory()) { 
     String name = z.getName(); 
     name = name.substring(0, name.length() - 1); 
     System.out.println("name: " + name); 
     f = new File(outputDirectory + File.separator + name); 
     f.mkdir(); 
     System.out.println("mkdir: " + outputDirectory 
       + File.separator + name); 
    } else { 
     f = new File(outputDirectory + File.separator + z.getName()); 
     f.createNewFile(); 
     FileOutputStream out = new FileOutputStream(f); 
     int b; 
     while ((b = in.read()) != -1) { 
      out.write(b); 
     } 
     out.close(); 
    } 
    //读取下一个ZipEntry 
    z = in.getNextEntry(); 
   } 
   in.close(); 
  } catch (Exception e) { 
   // TODO 自动生成 catch 块 
   e.printStackTrace(); 
  } 
} 
public static void main(String[] args) throws Exception { 
  TestZip t = new TestZip(); 
  t.unzip("D:/temp/mod0.zip", "D:/temp/mod0"); 
  //一定要注意a.zip文件要经java程序压缩出来的文件,这个程序才可以解压 
} 
}



//  这个可以解决中文文件夹,中文文件名等问题,强烈推荐!
解压zip文件,一开始用传统的jdk中的java.util.zip包中的类,实验结果对于含有英文文件名和英文目录的zip文件没有问题,但对于含有中文文件名和中文目录的zip文件便解压不了,这是因为中文编码的问题,jdk本身有这个bug,虽然网上也有一些解决方案,但都没有试验成功。最后发现开源库ant.jar中的org.apache.tools.zip包里的类可以解决上述问题,附代码如下

package mypackage.test; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
/** 
* 此例堪称完美,本人一直在用,强力推荐! 
* 这个可以很好的解决上一例中所遇到的问题,只是需要去下载一个 Ant.jar 包。 
*/ 
public class ZipFileOperUpdate { 
private 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); 
     if (subFile.exists() == false) 
      subFile.mkdir(); 
     directory += File.separator + dir; 
    } 
   } 
  } catch (Exception ex) { 
   System.out.println(ex.getMessage()); 
  } 
} 
public 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("mkdir:" + outputDirectory 
       + File.separator + name); 
    } else { 
     String fileName = zipEntry.getName(); 
     fileName = fileName.replace('\\', '/'); 
     // System.out.println("测试文件1:" +fileName); 
     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()); 
  } 
} 
}


  

//以下方法不太好,算是实现读取 zip 内文件内容的功能吧 
//文件名:myZip.java 
import java.io.*; 
import java.util.*; 
import java.util.zip.*; 
/** 
* <p>Title: 文件压缩和解压</p> 
* <p>Description: 使用ZipInputStream和ZipOutputStream对文件和目录进行压缩和解压处理</p> 
* <p>Copyright: Copyright (c) 2007</p> 
* <p>Filename: myZip.java</p> 
* @version 1.0 
*/ 
public class myZip{ 
/** 
*<br>方法说明:实现文件的压缩处理 
*<br>输入参数:String[] fs 压缩的文件数组 
*<br>返回类型: 
*/ 
  public void ZipFiles(String[] fs){ 
   try{ 
     String fileName = fs[0]; 
     FileOutputStream f = 
       new FileOutputStream(fileName+".zip"); 
     //使用输出流检查 
     CheckedOutputStream cs = 
        new CheckedOutputStream(f,new Adler32()); 
      //声明输出zip流 
      ZipOutputStream out = 
        new ZipOutputStream(new BufferedOutputStream(cs)); 
      //写一个注释 
      out.setComment("A test of Java Zipping"); 
      //对多文件进行压缩 
      for(int i=1;i<fs.length;i++){ 
        System.out.println("Write file "+fs); 
        BufferedReader in = 
           new BufferedReader( 
             new FileReader(fs)); 
         out.putNextEntry(new ZipEntry(fs)); 
         int c; 
         while((c=in.read())!=-1) 
          out.write(c); 
        in.close(); 
       } 
       //关闭输出流 
       out.close(); 
       System.out.println("Checksum::"+cs.getChecksum().getValue()); 
    }catch(Exception e){ 
       System.err.println(e); 
    } 
  } 


/** 
*<br>方法说明:解压缩Zip文件 
*<br>输入参数:String fileName 解压zip文件名 
*<br>返回类型: 
*/ 
  public void unZipFile(String fileName){ 
    try{ 
       System.out.println("读取ZIP文件........"); 
       //文件输入流 
       FileInputStream fi = 
         new FileInputStream(fileName+".zip"); 
       //输入流检查 
       CheckedInputStream csi = new CheckedInputStream(fi,new Adler32()); 
       //输入流压缩 
       ZipInputStream in2 = 
         new ZipInputStream( 
           new BufferedInputStream(csi)); 
       ZipEntry ze; 
       System.out.println("Checksum::"+csi.getChecksum().getValue()); 
       //解压全部文件 
       while((ze = in2.getNextEntry())!=null){ 
         System.out.println("Reading file "+ze); 
         int x; 
         while((x= in2.read())!=-1) 
           //这里是写文件,write是以byte方式输出。 
           System.out.write(x); 
       } 
       in2.close(); 
    }catch(Exception e){ 
      System.err.println(e); 
    } 
  } 
/** 
*<br>方法说明:读取Zip文件列表 
*<br>输入参数:String fileName zip文件名 
*<br>返回类型:Vector 文件列表 
*/ 
  public Vector listFile(String fileName){ 
    try{ 
       String[] aRst=null; 
       Vector vTemp = new Vector(); 
       //zip文件对象 
       ZipFile zf = new ZipFile(fileName+".zip"); 
       Enumeration e = zf.entries(); 
       while(e.hasMoreElements()){ 
         ZipEntry ze2 = (ZipEntry)e.nextElement(); 
         System.out.println("File: "+ze2); 
         vTemp.addElement(ze2); 
       } 
       return  vTemp; 
    }catch(Exception e){ 
      System.err.println(e); 
      return null; 
    } 
  } 
/** 
*<br>方法说明:主方法 
*<br>输入参数: 
*<br>返回类型: 
*/ 
  public static void main(String[] args){ 
    try{ 
     String fileName = args[0]; 
     myZip myZip = new myZip(); 
     myZip.ZipFiles(args); 
     myZip.unZipFile(fileName); 
     Vector dd = myZip.listFile(fileName); 
     System.out.println("File List: "+dd); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
  } 
} 

--------------------------------------------ant.jar包---------------------------------- 
import java.io.*;   
import java.util.*; 
import java.io.File; 
import org.apache.tools.zip.*; 
public  class  CDGGzip   
{   
  //boolean  packFrame  =  false;   
  private File srcPath =new File("d:"+File.separator+"邢晓宁"); 
  private String outFilename=new String("d:"+File.separator+"邢晓宁.zip"); 
private int len=srcPath.listFiles().length; 
private String[] filenames = new String[len]; 
public void setSrcPath(String src){ 
   srcPath=new File(src); 
  } 
  public File getSrcPath(){ 
  return srcPath; 
  } 
public void setOutFilename(String out){ 
   outFilename=out; 
  } 
  public String getOutFilename(){ 
  return outFilename; 
  }   
  public void gzip(){ 
byte[] buf = new byte[1024]; 
  try { 
  File[]  files  =  srcPath.listFiles(); 
  for(int  i=0;i<len;i++) 
  { 
  //if(!files.isDirectory()) 
filenames=srcPath.getPath()+File.separator+files.getName(); 
} 
  ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename)); 
  for (int i=0; i<filenames.length; i++) 
  { 
  FileInputStream in = new FileInputStream(filenames); 
  out.putNextEntry(new org.apache.tools.zip.ZipEntry(files.getName())); 
  int len; 
  while ((len = in.read(buf)) > 0) 
  { 
  out.write(buf, 0, len); 
  } 
  out.closeEntry(); 
  in.close(); 
      } 
      out.close(); 
    } 
    catch (IOException e) 
    { 
    System.out.println(e); 
    } 
  } 
   
  public static void main(String arg[]){ 
  CDGGzip cdggzip=new CDGGzip(); 
  cdggzip.gzip(); 
  } 
   
}