java操作.ZIP压缩包

//这个解压代码效果一般,不推荐.
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());
  }
}
}

trackback  :    http://www.gzas.org/kxybbs/asp/showtopic.asp?TopBh=1003810701
  
  
//以下方法不太好,算是实现读取 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();
  }
  
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值