ant压缩文件夹

package com.sniper.test;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class ZipUtil {
   
    public static final int BUFFER = 1024 * 4;
   
    /**
     * 压缩一个文件夹到一个指定文件
     * @param zipPath 需要压缩的文件夹路径
     * @param destFile 压缩到的文件
     * @throws IOException
     */
    public static void zipFiles(String zipPath, String destFile) throws IOException{
    File parentFile = new File(zipPath);
    Set<String> fileSet = new HashSet<String>();
    listFile(parentFile, fileSet);
   
    zipFiles(fileSet, new File(zipPath), destFile);
    }
   
    /**
     * @param filePathList 压缩的文件列表
     * @param destFile 压缩到的文件
     * @param rootDir 根路径
     * @throws IOException
     */
    public static void zipFiles(Set<String> filePathList, File destFile, String rootDir) throws IOException {
        byte[] buf = new byte[BUFFER];
        ZipEntry ze = null;
        int readLen = 0;
        ZipOutputStream out = null;
        InputStream in = null;
        try {
            out = new ZipOutputStream(new FileOutputStream(destFile));
for (String filePath : filePathList) {
File srcFile = new File(filePath);
                //是文件
                if (srcFile.isFile()) {
                    //创建一个ZipEntry,并设置Name和其它的一些属性
                    ze = new ZipEntry(getRelativeFileName(rootDir, srcFile));
                    ze.setSize(srcFile.length());
                    ze.setTime(srcFile.lastModified());
                   
                    //将ZipEntry加到out中,再写入实际的文件内容
                    out.putNextEntry(ze);
                    try {
                        in = new BufferedInputStream(new FileInputStream(srcFile));
                        while ( (readLen = in.read(buf, 0, BUFFER)) != -1) {
                            out.write(buf, 0, readLen);
                        }
                    }
                    finally {
                        if (in != null) {
                            try {
                                in.close();
                            }
                            catch (Exception ignore) {
                            }
                        }
                    }
                }
                //是目录
                else if (srcFile.isDirectory()){
                    ze = new ZipEntry(getRelativeFileName(rootDir, srcFile));
                    //仅仅将ZipEntry加到out中
                    out.putNextEntry(ze);
                }
                else {
                System.out.println(srcFile + " is neither a file nor a directory, ignore it");
                continue;
                }
                out.closeEntry();
            }
        }
        finally {
            if (in != null) {
                try {
                    in.close();
                }
                catch (Exception ignore) {
                }
                finally {
                    in = null;
                }
            }
            if (out != null) {
                try {
                    out.close();
                }
                catch (Exception ignore) {
                }
                finally {
                    out = null;
                }
            }
        }
    }
   
    public static void listFile(File parentFile, Set<String> fileSet) {
        if (parentFile.isDirectory()) {
            File[] files = parentFile.listFiles();
            for (int i = 0; i < files.length; i++) {
                listFile(files[i], fileSet);
            }
            //fileSet.add(parentFile.getAbsolutePath()); // no parent
        }
        else {
        fileSet.add(parentFile.getAbsolutePath());
        }
    }
   
    public static String getRelativeFileName(String baseDir, File realFile) {
        File real = realFile;
        File base = new File(baseDir);
        String ret = real.getName();
        if (!realFile.isFile()) {
        ret += '/';
        }
        while (true) {
            real = real.getParentFile();
            if (real == null) {
                break;
            }
            if (real.equals(base)) {
                break;
            }
            else {
                //这里不能使用File.separator替代“/”,因为压缩/解压都只识别“/”分割符
                ret = real.getName() + '/' + ret;
            }
        }
        System.out.println(ret);
        return ret;
    }


    public static void main(String[] args) throws Exception {

    String zipPath = "c:/zip";
    File parentFile = new File(zipPath);
    Set<String> fileSet = new HashSet<String>();
    listFile(parentFile, fileSet);
   
    for(String fileStr : fileSet){
    //System.out.println(fileStr);
    }
   
    zipFiles(fileSet, new File("c:/zip.zip"), zipPath);
   
   
}

}

猜你喜欢

转载自zjhdreams.iteye.com/blog/2353242