您的位置:首页 > 编程语言 > Java开发

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

2016-11-19 20:26 836 查看
由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。 
以下是代码: 

[java] view
plain copy

import java.io.BufferedInputStream;    

import java.io.File;    

import java.io.FileInputStream;    

import java.io.FileOutputStream;    

import java.util.zip.CRC32;    

import java.util.zip.CheckedOutputStream;    

  

import org.apache.log4j.Logger;  

import org.apache.tools.zip.ZipEntry;    

import org.apache.tools.zip.ZipOutputStream;    

  

/** 

 * @ClassName: ZipCompressor 

 * @CreateTime Apr 28, 2013 1:12:16 PM 

 * @author : Mayi 

 * @Description: 压缩文件的通用工具类-采用org.apache.tools.zip.ZipOutputStream实现,较复杂。 

 * 

 */  

public class ZipCompressor {  

    private Logger logger = Logger.getLogger(ZipCompressor.class);  

    static final int BUFFER = 8192;    

    private File zipFile;    

      

    /** 

     * 压缩文件构造函数 

     * @param pathName 压缩的文件存放目录 

     */  

    public ZipCompressor(String pathName) {    

        zipFile = new File(pathName);    

    }    

    

    /** 

     * 执行压缩操作 

     * @param srcPathName 被压缩的文件/文件夹 

     */  

    public void compressExe(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 = "";    

            compressByType(file, out, basedir);    

            out.close();    

        } catch (Exception e) {   

            e.printStackTrace();  

            logger.error("执行压缩操作时发生异常:"+e);  

            throw new RuntimeException(e);    

        }    

    }    

    

    /** 

     * 判断是目录还是文件,根据类型(文件/文件夹)执行不同的压缩方法 

     * @param file  

     * @param out 

     * @param basedir 

     */  

    private void compressByType(File file, ZipOutputStream out, String basedir) {    

        /* 判断是目录还是文件 */    

        if (file.isDirectory()) {    

            logger.info("压缩:" + basedir + file.getName());    

            this.compressDirectory(file, out, basedir);    

        } else {    

            logger.info("压缩:" + basedir + file.getName());    

            this.compressFile(file, out, basedir);    

        }    

    }    

    

    /** 

     * 压缩一个目录 

     * @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++) {    

            /* 递归 */    

            compressByType(files[i], out, basedir + dir.getName() + "/");    

        }    

    }    

    

    /** 

     * 压缩一个文件 

     * @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);    

        }    

    }    

}  

后来发现原来可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。

[java] view
plain copy

import java.io.File;    

  

import org.apache.tools.ant.Project;    

import org.apache.tools.ant.taskdefs.Zip;    

import org.apache.tools.ant.types.FileSet;    

    

/** 

 * @ClassName: ZipCompressorByAnt 

 * @CreateTime Apr 28, 2013 1:23:45 PM 

 * @author : Mayi 

 * @Description: 压缩文件的通用工具类-采用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。 

 * 

 */  

public class ZipCompressorByAnt {    

    

    private File zipFile;    

    

    /** 

     * 压缩文件构造函数 

     * @param pathName 最终压缩生成的压缩文件:目录+压缩文件名.zip 

     */  

    public ZipCompressorByAnt(String finalFile) {    

        zipFile = new File(finalFile);    

    }    

        

    /** 

     * 执行压缩操作 

     * @param srcPathName 需要被压缩的文件/文件夹 

     */  

    public void compressExe(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();    

    }    

}   

测试一下 

Java代码  



package net.szh.zip;  

  

public class TestZip {  

    public static void main(String[] args) {  

        ZipCompressor zc = new  ZipCompressor("E:\\szhzip.zip");  

        zc.compress("E:\\test");  

          

        ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.zip");  

        zca.compress("E:\\test");  

    }  

}  

参考自:ITeye
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: