两种方式实现压缩文件或文件夹

今天做峰会活动候选人报名功能时,涉及一个打包下载附件的功能。

在这里记录一下压缩文件的实现过程,压缩文件有多种实现方式。

这里记录通过java本身自带的ZipOutputStream类、或者Ant.jar下面的Zip类实现

1. Java本身自带的类ZipOutputStream实现方式

public class ZipCompressor {

    static final int BUFFER = 8192;

    private File zipFile;

    /**
     * 创建一个压缩实例
     * 
     * @param pathName 压缩到的地址
     */
    public ZipCompressor(String pathName) {
        zipFile = new File(pathName);
    }

    /**
     * @Description: 执行压缩
     * @param srcPathName 被压缩文件
     */
    public void compress(String srcPathName) {
        File file = new File(srcPathName);
        if (!file.exists()) {
            throw new RuntimeException(srcPathName + "不存在!");
        }
        try {
            // 创建文件输出流
            FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
            CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32());
            ZipOutputStream out = new ZipOutputStream(cos);
            String basedir = "";
            compress(file, out, basedir);
            out.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * @Description: 判断路径是目录还是文件
     * @param file 被压缩文件
     * @param out 容器
     * @param basedir 路径
     */
    private void compress(File file, ZipOutputStream out, String basedir) {
        /* 判断是目录还是文件 */
        if (file.isDirectory()) {
            System.out.println("压缩:" + basedir + file.getName());
            this.compressDirectory(file, out, basedir);
        } else {
            System.out.println("压缩:" + basedir + file.getName());
            this.compressFile(file, out, basedir);
        }
    }

    /**
     * @Description: 压缩一个目录
     * @param dir
     * @param out
     * @param basedir
     */
    private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
        if (!dir.exists()) {
            return;
        }
        // 获取目录下的所有文件
        File[] files = dir.listFiles();
        for (int i = 0; i < files.length; i++) {
            /* 递归 */
            compress(files[i], out, basedir + dir.getName() + "/");
        }
    }

    /**
     * @Description: 压缩一个文件
     * @param file
     * @param out
     * @param basedir
     */
    private void compressFile(File file, ZipOutputStream out, String basedir) {
        if (!file.exists()) {
            return;
        }
        try {
            // 将被压缩文件转化为缓冲输入流
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            // 创建压缩包
            ZipEntry entry = new ZipEntry(basedir + file.getName());
            out.putNextEntry(entry);// 压缩文件名称
            int count;
            byte data[] = new byte[BUFFER];
            while ((count = bis.read(data, 0, BUFFER)) != -1) {
                out.write(data, 0, count);
            }
            bis.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        ZipCompressor zipCompressor = new ZipCompressor("F:\\yswj.zip");
        zipCompressor.compress("F:\\Java\\资源及插件");
    }

}

2. 使用ant.jar下面的Zip类实现,该方式更简单一些

public class ZipCompressorByAnt {

    private File zipFile;   
      
    public ZipCompressorByAnt(String pathName) {   
        zipFile = new File(pathName);   
    }   
    
    /**
     * @param srcPathName 压缩目标
     */
    public void compress(String srcPathName) {
        File srcdir = new File(srcPathName);
        if (!srcdir.exists()) {
            throw new RuntimeException(srcPathName + "不存在!");   
        }
        Project prj = new Project();   
        Zip zip = new Zip();   
        zip.setProject(prj);   
        zip.setDestFile(zipFile);   
        FileSet fileSet = new FileSet();   
        fileSet.setProject(prj);   
        fileSet.setDir(srcdir);   
        //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夹 eg:zip.setIncludes("*.java");   
        //fileSet.setExcludes(...); 排除哪些文件或文件夹   
        zip.addFileset(fileSet);   
        
        zip.execute();
    }
    
    public static void main(String[] args) {
        
    }

}

 

ZipOutputStream实现方法代码中有测试方法

 

posted @ 2016-11-04 15:17  宁采桃花不采臣  阅读(2053)  评论(0编辑  收藏  举报