使用ant提供的zip進行壓縮和解壓縮,支持中文

yefx 9年前發布 | 866 次閱讀 Java

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(); } }</pre>

 本文由用戶 yefx 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!