zoukankan      html  css  js  c++  java
  • 两种方式实现压缩文件或文件夹

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

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

    这里记录通过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实现方法代码中有测试方法

  • 相关阅读:
    php
    php数据排序---array_multisort
    IOS 线程描述
    IOS 进程描述
    IOS 强指针(strong)和弱指针(weak)
    IOS autosizing(设置控件的固定位置大小)
    IOS UIActivityIndicatorView动画
    IOS UIImageView的帧动画
    IOS Block动画
    IOS UIView动画(封装动画)
  • 原文地址:https://www.cnblogs.com/libra0920/p/6030421.html
Copyright © 2011-2022 走看看