使用ant提供的zip进行压缩和解压缩,支持中文

/**
  *
  */
package com.yfei.uti.zip;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;
 
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
 
/**
  * @author yangfei
  * @since 2013-1-27
  */
public class ZipUtilApache {
 
     static final int BUFFER = 1024 ;
 
     public static void zip(String destDirPath, String inputPath)
             throws Exception {
         File inputFile = new File(inputPath);
         // 创建压缩文件
         File destDir = new File(destDirPath);
         if (!destDir.exists()) {
             destDir.mkdir();
         }
         File destFile = new File(destDir + File.separator + inputFile.getName()
                 + ".zip" );
         // 递归压缩方法
         ZipOutputStream out = new ZipOutputStream(
                 new FileOutputStream(destFile));
         // 设置压缩编码.设置为GBK后在windows下就不会乱码了,如果要放到Linux或者Unix下就不要设置了
         out.setEncoding( "GBK" );
         zip(out, inputFile, "" );
         System.out.println( "zip done" );
         out.close();
     }
 
     private static void zip(ZipOutputStream out, File f, String base)
             throws Exception {
         System.out.println( "Zipping   " + f.getName()); // 记录日志,开始压缩
         if (f.isDirectory()) { // 如果是文件夹,则获取下面的所有文件
             File[] fl = f.listFiles();
             if (base.length() > 0 ) {
 
                 out.putNextEntry( new ZipEntry(base + "/" )); // 此处要将文件写到文件夹中只用在文件名前加"/"再加文件夹名
             }
 
             base = base.length() == 0 ? "" : base + "/" ;
             for ( int i = 0 ; i < fl.length; i++) {
                 zip(out, fl[i], base + fl[i].getName());
             }
         } else { // 如果是文件,则压缩
             out.putNextEntry( new ZipEntry(base)); // 生成下一个压缩节点
             FileInputStream in = new FileInputStream(f); // 读取文件内容
             int len;
             byte [] buf = new byte [BUFFER];
             while ((len = in.read(buf, 0 , BUFFER)) != - 1 ) {
                 out.write(buf, 0 , len); // 写入到压缩包
             }
             in.close();
             out.closeEntry();
         }
     }
 
     /**
      * 解压缩zip文件
      *
      * @param fileName
      *            要解压的文件名 包含路径 如:"c:\\test.zip"
      * @param filePath
      *            解压后存放文件的路径 如:"c:\\temp"
      * @throws Exception
      */
     public static void unZip(String fileName, String destFilePath)
             throws Exception {
         ZipFile zipFile = new ZipFile(fileName, "GBK" ); // 以“GBK”编码创建zip文件,用来处理winRAR压缩的文件。
         Enumeration emu = zipFile.getEntries();
         while (emu.hasMoreElements()) {
             ZipEntry entry = (ZipEntry) emu.nextElement();
             if (entry.isDirectory()) {
                 File dir = new File(destFilePath + entry.getName());
                 if (!dir.exists()) {
                     dir.mkdirs();
                 }
                 continue ;
             }
             BufferedInputStream bis = new BufferedInputStream(zipFile
                     .getInputStream(entry));
 
             File file = new File(destFilePath + entry.getName());
             File parent = file.getParentFile();
             if (parent != null && (!parent.exists())) {
                 parent.mkdirs();
             }
             FileOutputStream fos = new FileOutputStream(file);
             BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER);
             byte [] buf = new byte [BUFFER];
             int len = 0 ;
             while ((len = bis.read(buf, 0 , BUFFER)) != - 1 ) {
                 fos.write(buf, 0 , len);
             }
             bos.flush();
             bos.close();
             bis.close();
             System.out.println( "解压文件:" + file.getName());
         }
         zipFile.close();
     }
}

你可能感兴趣的:(ant)