java实现zip压缩文件/文件夹

时间:2021-04-29 11:54:48

http://blog.csdn.net/lqclh502/article/details/8875320

For maven project:

<!-- http://mvnrepository.com/artifact/org.apache.ant/ant -->
<dependency>
    <groupId>org.apache.ant</groupId>
    <artifactId>ant</artifactId>
    <version>1.8.2</version>
</dependency>

由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。 
以下是代码: 

[java] view plain copy
  1. import java.io.BufferedInputStream;    
  2. import java.io.File;    
  3. import java.io.FileInputStream;    
  4. import java.io.FileOutputStream;    
  5. import java.util.zip.CRC32;    
  6. import java.util.zip.CheckedOutputStream;    
  7.   
  8. import org.apache.log4j.Logger;  
  9. import org.apache.tools.zip.ZipEntry;    
  10. import org.apache.tools.zip.ZipOutputStream;    
  11.   
  12. /** 
  13.  * @ClassName: ZipCompressor 
  14.  * @CreateTime Apr 28, 2013 1:12:16 PM 
  15.  * @author : Mayi 
  16.  * @Description: 压缩文件的通用工具类-采用org.apache.tools.zip.ZipOutputStream实现,较复杂。 
  17.  * 
  18.  */  
  19. public class ZipCompressor {  
  20.     private Logger logger = Logger.getLogger(ZipCompressor.class);  
  21.     static final int BUFFER = 8192;    
  22.     private File zipFile;    
  23.       
  24.     /** 
  25.      * 压缩文件构造函数 
  26.      * @param pathName 压缩的文件存放目录 
  27.      */  
  28.     public ZipCompressor(String pathName) {    
  29.         zipFile = new File(pathName);    
  30.     }    
  31.     
  32.     /** 
  33.      * 执行压缩操作 
  34.      * @param srcPathName 被压缩的文件/文件夹 
  35.      */  
  36.     public void compressExe(String srcPathName) {    
  37.         File file = new File(srcPathName);    
  38.         if (!file.exists()){  
  39.             throw new RuntimeException(srcPathName + "不存在!");    
  40.         }  
  41.         try {    
  42.             FileOutputStream fileOutputStream = new FileOutputStream(zipFile);    
  43.             CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());    
  44.             ZipOutputStream out = new ZipOutputStream(cos);    
  45.             String basedir = "";    
  46.             compressByType(file, out, basedir);    
  47.             out.close();    
  48.         } catch (Exception e) {   
  49.             e.printStackTrace();  
  50.             logger.error("执行压缩操作时发生异常:"+e);  
  51.             throw new RuntimeException(e);    
  52.         }    
  53.     }    
  54.     
  55.     /** 
  56.      * 判断是目录还是文件,根据类型(文件/文件夹)执行不同的压缩方法 
  57.      * @param file  
  58.      * @param out 
  59.      * @param basedir 
  60.      */  
  61.     private void compressByType(File file, ZipOutputStream out, String basedir) {    
  62.         /* 判断是目录还是文件 */    
  63.         if (file.isDirectory()) {    
  64.             logger.info("压缩:" + basedir + file.getName());    
  65.             this.compressDirectory(file, out, basedir);    
  66.         } else {    
  67.             logger.info("压缩:" + basedir + file.getName());    
  68.             this.compressFile(file, out, basedir);    
  69.         }    
  70.     }    
  71.     
  72.     /** 
  73.      * 压缩一个目录 
  74.      * @param dir 
  75.      * @param out 
  76.      * @param basedir 
  77.      */  
  78.     private void compressDirectory(File dir, ZipOutputStream out, String basedir) {    
  79.         if (!dir.exists()){  
  80.              return;    
  81.         }  
  82.              
  83.         File[] files = dir.listFiles();    
  84.         for (int i = 0; i < files.length; i++) {    
  85.             /* 递归 */    
  86.             compressByType(files[i], out, basedir + dir.getName() + "/");    
  87.         }    
  88.     }    
  89.     
  90.     /** 
  91.      * 压缩一个文件 
  92.      * @param file 
  93.      * @param out 
  94.      * @param basedir 
  95.      */  
  96.     private void compressFile(File file, ZipOutputStream out, String basedir) {    
  97.         if (!file.exists()) {    
  98.             return;    
  99.         }    
  100.         try {    
  101.             BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));    
  102.             ZipEntry entry = new ZipEntry(basedir + file.getName());    
  103.             out.putNextEntry(entry);    
  104.             int count;    
  105.             byte data[] = new byte[BUFFER];    
  106.             while ((count = bis.read(data, 0, BUFFER)) != -1) {    
  107.                 out.write(data, 0, count);    
  108.             }    
  109.             bis.close();    
  110.         } catch (Exception e) {    
  111.             throw new RuntimeException(e);    
  112.         }    
  113.     }    
  114. }  

后来发现原来可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。
[java] view plain copy
  1. import java.io.File;    
  2.   
  3. import org.apache.tools.ant.Project;    
  4. import org.apache.tools.ant.taskdefs.Zip;    
  5. import org.apache.tools.ant.types.FileSet;    
  6.     
  7. /** 
  8.  * @ClassName: ZipCompressorByAnt 
  9.  * @CreateTime Apr 28, 2013 1:23:45 PM 
  10.  * @author : Mayi 
  11.  * @Description: 压缩文件的通用工具类-采用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。 
  12.  * 
  13.  */  
  14. public class ZipCompressorByAnt {    
  15.     
  16.     private File zipFile;    
  17.     
  18.     /** 
  19.      * 压缩文件构造函数 
  20.      * @param pathName 最终压缩生成的压缩文件:目录+压缩文件名.zip 
  21.      */  
  22.     public ZipCompressorByAnt(String finalFile) {    
  23.         zipFile = new File(finalFile);    
  24.     }    
  25.         
  26.     /** 
  27.      * 执行压缩操作 
  28.      * @param srcPathName 需要被压缩的文件/文件夹 
  29.      */  
  30.     public void compressExe(String srcPathName) {    
  31.         File srcdir = new File(srcPathName);    
  32.         if (!srcdir.exists()){  
  33.             throw new RuntimeException(srcPathName + "不存在!");    
  34.         }   
  35.             
  36.         Project prj = new Project();    
  37.         Zip zip = new Zip();    
  38.         zip.setProject(prj);    
  39.         zip.setDestFile(zipFile);    
  40.         FileSet fileSet = new FileSet();    
  41.         fileSet.setProject(prj);    
  42.         fileSet.setDir(srcdir);    
  43.         //fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夹 eg:zip.setIncludes("*.java");    
  44.         //fileSet.setExcludes(...); //排除哪些文件或文件夹    
  45.         zip.addFileset(fileSet);    
  46.         zip.execute();    
  47.     }    
  48. }   


测试一下 
Java代码  java实现zip压缩文件/文件夹
  1. package net.szh.zip;  
  2.   
  3. public class TestZip {  
  4.     public static void main(String[] args) {  
  5.         ZipCompressor zc = new  ZipCompressor("E:\\szhzip.zip");  
  6.         zc.compress("E:\\test");  
  7.           
  8.         ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.zip");  
  9.         zca.compress("E:\\test");  
  10.     }  
  11. }