Java 实现文件压缩工具类

  1 package com.wdxc.util;
  2 import java.io.BufferedInputStream;  
  3 import java.io.File;  
  4 import java.io.FileInputStream;  
  5 import java.io.FileOutputStream;  
  6 import java.util.zip.CRC32;  
  7 import java.util.zip.CheckedOutputStream;  
  8 import java.util.zip.ZipEntry;
  9 import java.util.zip.ZipOutputStream;
 10 
 11 import org.apache.log4j.Logger;
 12 
 13 /**
 14  * zip文件压缩工具类
 15  * 
 16  * @author : wangbo
 17  */
 18 public class ZipCompressor {
 19     private Logger logger = Logger.getLogger(ZipCompressor.class);
 20     static final int BUFFER = 8192;  
 21     private File zipFile;  
 22     
 23     /**
 24      * 压缩文件构造函数
 25      * @param pathName 压缩的文件存放目录
 26      */
 27     public ZipCompressor(String pathName) {  
 28         zipFile = new File(pathName);  
 29     }  
 30   
 31     /**
 32      * 执行压缩操作
 33      * @param srcPathName 被压缩的文件/文件夹
 34      */
 35     public void compressExe(String srcPathName) {  
 36         File file = new File(srcPathName);  
 37         if (!file.exists()){
 38             throw new RuntimeException(srcPathName + "不存在!");  
 39         }
 40         try {  
 41             FileOutputStream fileOutputStream = new FileOutputStream(zipFile);  
 42             CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,new CRC32());  
 43             ZipOutputStream out = new ZipOutputStream(cos);
 44             
 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     
115     public static void main(String[] args) {  
116         ZipCompressor zc = new  ZipCompressor("E:\\szhzip.zip");
117         zc.compressExe("E:\\ftpdown");  
118           
119     }  
120 }

 

posted @ 2017-07-04 14:49  一线大码  Views(785)  Comments(0Edit  收藏  举报