zoukankan      html  css  js  c++  java
  • 解压/压缩工具包

    package com.ytd.ebos.platform.zjmb.controller;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.nio.charset.Charset;
    import java.util.zip.CRC32;
    import java.util.zip.CheckedInputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    /**
     * @author Administrator ZIP 解压缩工具包
     */
    /**
     * @author Administrator
     *
     */
    public class ZipUtils {
    
        /**
         * Default buff byte size
         *
         */
        private static final int DEFAULT_BUFF_SIZE = 1024;
    
        /**
         * Default basedir value
         *
         */
        private static final boolean DEFAULT_DIR = false;
    
        /**
        // 解压操作,程序入口1,输入需要解压的文件全路径,然后在当前文件夹下面解压出文件
         * @param srcPath
         * @throws Exception
         */
        public static void decompress(String srcPath) throws Exception {
            decompress(new File(srcPath));
        }
    
        /**
        // 解压操作,程序入口2,输入需要解压的文件File类,然后在当前文件夹下面解压出文件
         * @param srcFile 
         * @throws Exception
         */
        public static void decompress(File srcFile) throws Exception {
            File baseFile = srcFile.getParentFile();//输出上层目录
            decompress(srcFile, baseFile);
        }
    
        /**
        // 解压操作,程序入口3 ,输入需要解压的的文件全路径,以及解压到目的文件全路径
         * @param srcPath
         * @param destPath
         * @throws Exception
         */
        public static void decompress(String srcPath, String destPath) throws Exception {
            decompress(new File(srcPath), new File(destPath));
        }
    
        /**
        // 解压操作,程序入口4,输入需要解压的文件File类,输入目的文件夹File类
         * @param srcFile
         * @param destFile
         * @throws Exception
         */
        public static void decompress(File srcFile, File destFile) throws Exception {
            CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32());
            ZipInputStream zis = new ZipInputStream(cis);
    //        如果是multipartFile,可以使用如下方法取得zipInputStream
    //        InputStream inputStream = multipartFile.getInputStream();
    //        ZipInputStream zis = new ZipInputStream(new BufferedInputStream(inputStream),Charset.forName("UTF-8"));
            doDecompress(destFile, zis);
            zis.close();
        }
    
        
        /**解压操作,输入目的文件夹File类(解压后放置文件的目录),输入压缩文件流
         * @param destFile 
         * @param zis
         * @throws Exception 
         */
        private static void doDecompress(File destFile, ZipInputStream zis) throws Exception {
            ZipEntry zipEntry = null;
            while ((zipEntry = zis.getNextEntry()) != null) {
                String dir = destFile.getPath() + File.separator + zipEntry.getName();
                File dirFile = new File(dir);
                fileProber(dirFile);
    //            解压出来的是文件文件夹,则直接创建
                if (zipEntry.isDirectory()) {
                    dirFile.mkdirs();
                } else {
                    doDecompressFile(dirFile, zis);
                }
                zis.closeEntry();
            }
        }
    
        /**解压操作,边读边写,把输入流程写到文件
         * @param destFile
         * @param zis
         * @throws Exception 
         */
        private static void doDecompressFile(File destFile, ZipInputStream zis) throws Exception {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
            int len;
            byte[] buff = new byte[DEFAULT_BUFF_SIZE];
            while ((len = zis.read(buff, 0, DEFAULT_BUFF_SIZE)) != -1) {
                bos.write(buff, 0, len);
            }
            bos.close();
        }
    
        /**
         * 文件探测,如果没有父级文件夹,则一直创建
         *
         * When the parent file not exist.Create it.
         * Prober 英 ['prəʊbə]      美 ['proʊbə]   n. 探查者;探测器
         * @param dirFile
         * @throws Exception
         */
        public static void fileProber(File dirFile) throws Exception {
            File parentFile = dirFile.getParentFile();
            if (!parentFile.exists()) {
                fileProber(parentFile);
                parentFile.mkdirs();
            }
        }
        
        
    
        /**
         * 压缩操作,程序入口1
         * @param srcPath 需要压缩的文件夹或者文件全路径
         * @param destPath 压缩后生成的文件全路径
         * @param dirFlag 是否使用默认文件夹名作为所有生成压缩文件的父级文件夹,不输入则为false
         * @throws Exception
         */
        public static void compress(String srcPath, String destPath, boolean dirFlag) throws Exception {
            compress(new File(srcPath), new File(destPath), dirFlag);
        }
    
        /**压缩操作,程序入口2
         * @param srcPath 需要压缩的文件夹或者文件全路径
         * @param destPath 压缩后生成的文件全路径
         * @throws Exception 
         */
        public static void compress(String srcPath, String destPath) throws Exception {
            compress(new File(srcPath), new File(destPath), DEFAULT_DIR);
        }
    
        /**压缩操作,程序入口2
         * @param srcFile 需要压缩的文件夹或者文件 file类
         * @param destFile 压缩后生成的文件file类
         * @param dirFlag 是否使用默认文件夹名作为所有生成压缩文件的父级文件夹 ,不输入则为false
         * @throws Exception
         */
        public static void compress(File srcFile, File destFile, boolean dirFlag) throws Exception {
    //        file类转压缩输出流ZipOutputStream
            compress(srcFile, new ZipOutputStream(new FileOutputStream(destFile)), dirFlag);
        }
    
        /**
         * @param srcFile 需要压缩的文件夹或者文件 file类
         * @param zos 压缩输出流
         * @param dirFlag 是否使用默认文件夹名作为所有生成压缩文件的父级文件夹,不输入则为false
         * @throws Exception
         */
        public static void compress(File srcFile, ZipOutputStream zos, boolean dirFlag) throws Exception {
    //        如果是目录
            if (srcFile.isDirectory()) {
                if (dirFlag) {
                    doCompress(zos, srcFile, srcFile.getName() + File.separator);
                } else {
                    doCompress(zos, srcFile, "");
                }
    //    如果是文件直接压缩        
            } else {
                doCompress(zos, srcFile, "");
            }
            zos.close();
        }
    
        /**
         * @param zos  压缩输出流
         * @param file 需要压缩的文件夹或者文件 file类
         * @param baseDir 所有压缩文件的 父级文件夹名
         * @throws Exception
         */
        public static void doCompress(ZipOutputStream zos, File file, String baseDir) throws Exception {
            if (file.isDirectory()) {
                File[] files = file.listFiles();
                for (int i = 0; i < files.length; i++) {
                    doCompress(zos, files[i], baseDir);
                }
            } else {
                byte[] buff = new byte[DEFAULT_BUFF_SIZE];
                InputStream in = new FileInputStream(file);
                zos.putNextEntry(new ZipEntry(baseDir + File.separator + file.getName()));
                int len;
                while ((len = in.read(buff, 0, DEFAULT_BUFF_SIZE)) != -1) {
                    zos.write(buff, 0, len);
                }
                in.close();
            }
        }
        
        public static void main(String[] args) throws Exception{
            String dir = "C:\Users\Administrator\Desktop\test\" ;
            String src = "C:\Users\Administrator\Desktop\缺少定值清单.zip" ;
    //        解压测试
    //        decompress(src);
    //        decompress(src,dir);
    
    //        压缩测试,如果有子文件夹,也还是全部压缩到了总的文件夹,并没有按子文件夹在压缩在里面
            String deskPath = "C:\Users\Administrator\Desktop\deskPath.zip" ;
    //        compress(dir, deskPath, true);//压缩包文件名为deskPath,内含文件test
            compress(dir, deskPath, true);//压缩包文件名为deskPath,压缩包内没有总的文件夹,直接就是压缩文件
        }
    }



    相关知识:
    https://www.yiibai.com/javazip/javazip_zipoutputstream.html#article-start

    java.util.zip.ZipEntry类用于表示ZIP文件条目。
    java.util.zip.ZipFile类用于读取zip文件中的条目。
    java.util.zip.ZipInputStream类实现用于读取ZIP文件格式文件的输入流过滤器。 包括对压缩和未压缩条目的支持。
    java.util.zip.ZipOutputStream类实现一个输出流过滤器,用于以ZIP文件格式写入文件。 包括对压缩和未压缩条目的支持。

     
  • 相关阅读:
    git版本库管理介绍,撤销git pull操作
    【laravel5.4】自定义404、503等页面
    【laravel5.4】{{$name}}、{{name}}、@{{$name}} 和 @{{name}} 的区别
    python 了解一点属性的延迟计算
    python 了解一下__dict__
    excel怎么把一个sheet的 全部内容打印到一页纸上
    python 简单了解一下 描述器
    python 调用父类方法, 重写父类构造方法, 不显式调用,会报错
    Python 今天抽空学习了@Property
    python 语法糖是什么意思
  • 原文地址:https://www.cnblogs.com/rdchen/p/12959123.html
Copyright © 2011-2022 走看看