zoukankan      html  css  js  c++  java
  • 用java实现zip压缩

    [转自] http://szhnet.iteye.com/blog/199059


    本来是写到spaces live上的,可是代码的显示效果确实不怎么好看。在javaeye上试了试代码显示的顺眼多了。

    今天写了个用java压缩的功能,可以实现对文件和目录的压缩。

    由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。
    以下是代码:

        package net.szh.zip;  
          
        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.tools.zip.ZipEntry;  
        import org.apache.tools.zip.ZipOutputStream;  
          
        public class ZipCompressor {  
            static final int BUFFER = 8192;  
          
            private File zipFile;  
          
            public ZipCompressor(String pathName) {  
                zipFile = new File(pathName);  
            }  
          
            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);  
                }  
            }  
          
            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);  
                }  
            }  
          
            /** 压缩一个目录 */  
            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() + "/");  
                }  
            }  
          
            /** 压缩一个文件 */  
            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来实现,更加简单。
        package net.szh.zip;  
          
        import java.io.File;  
          
        import org.apache.tools.ant.Project;  
        import org.apache.tools.ant.taskdefs.Zip;  
        import org.apache.tools.ant.types.FileSet;  
          
        public class ZipCompressorByAnt {  
          
            private File zipFile;  
          
            public ZipCompressorByAnt(String pathName) {  
                zipFile = new File(pathName);  
            }  
              
            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();  
            }  
        }  


    测试一下
    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");  
        }  
    }  


  • 相关阅读:
    HDU2027 统计元音 一点点哈希思想
    湖南工业大学第一届ACM竞赛 数字游戏 字符串处理
    湖南工业大学第一届ACM竞赛 我素故我在 DFS
    HDU3293sort
    HDU2082 找单词 母函数
    HDU1018 Big Number 斯特林公式
    湖南工业大学第一届ACM竞赛 分糖果 位操作
    UVA 357 Let Me Count The Ways
    UVA 147 Dollars
    UVA 348 Optimal Array Multiplication Sequence
  • 原文地址:https://www.cnblogs.com/pekkle/p/6568731.html
Copyright © 2011-2022 走看看