欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ant压缩文件夹

程序员文章站 2022-05-02 14:38:38
...
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);
   
   
}

}
相关标签: ant