zoukankan      html  css  js  c++  java
  • Java_压缩与解压工具类

    转载请注明出处:http://blog.csdn.net/y22222ly/article/details/52201675

    zip压缩,解压

    zip压缩与解压主要依靠java api的两个类:
    ZipInputStream
    ZipOutputStream
    做了一个简单的封装.
    使用方法:

            try {
                ZipUtil.compress(getSDCard() + "zipTest", getSDCard() + "zipTest.zip");
                ZipUtil.decompress(getSDCard() + "zipTest.zip", getSDCard() + "zipTestFolder");
            } catch (Exception e) {
                e.printStackTrace();//失败
            }

    工具类ZipUtil:

    package com.raise.raisestudy.zip;
    
    import android.text.TextUtils;
    
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.Closeable;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.zip.CRC32;
    import java.util.zip.CheckedOutputStream;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    /**
     * zip文件加压解压原理如下
     * compress @see {@link ZipOutputStream}
     * * <pre>
     * OutputStream os = ...
     * ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(os));
     * try {
     *     for (int i = 0; i < fileCount; ++i) {
     *         String filename = ...
     *         byte[] bytes = ...
     *         ZipEntry entry = new ZipEntry(filename);
     *         zos.putNextEntry(entry);
     *         zos.write(bytes);
     *         zos.closeEntry();
     *     }
     * } finally {
     *     zos.close();
     * }
     * </pre>
     * decompress @see {@link ZipInputStream}
     * <pre>
     * InputStream is = ...
     * ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));
     * try {
     *     ZipEntry ze;
     *     while ((ze = zis.getNextEntry()) != null) {
     *         ByteArrayOutputStream baos = new ByteArrayOutputStream();
     *         byte[] buffer = new byte[1024];
     *         int count;
     *         while ((count = zis.read(buffer)) != -1) {
     *             baos.write(buffer, 0, count);
     *         }
     *         String filename = ze.getName();
     *         byte[] bytes = baos.toByteArray();
     *         // do something with 'filename' and 'bytes'...
     *     }
     * } finally {
     *     zis.close();
     * }
     * </pre>
     * 支持空文件夹加压解压
     * Created by raise.yang on 16/08/09.
     */
    public class ZipUtil {
    
        private static final String TAG = "ZipUtil";
    
        /**
         * 解压文件到指定文件夹
         *
         * @param zip      源文件
         * @param destPath 目标文件夹路径
         * @throws Exception 解压失败
         */
        public static void decompress(String zip, String destPath) throws Exception {
            //参数检查
            if (TextUtils.isEmpty(zip) || TextUtils.isEmpty(destPath)) {
                throw new IllegalArgumentException("zip or destPath is illegal");
            }
            File zipFile = new File(zip);
            if (!zipFile.exists()) {
                throw new FileNotFoundException("zip file is not exists");
            }
            File destFolder = new File(destPath);
            if (!destFolder.exists()) {
                if (!destFolder.mkdirs()) {
                    throw new FileNotFoundException("destPath mkdirs is failed");
                }
            }
            ZipInputStream zis = null;
            BufferedOutputStream bos = null;
            try {
                zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(zip)));
                ZipEntry ze;
                while ((ze = zis.getNextEntry()) != null) {
                    //得到解压文件在当前存储的绝对路径
                    String filePath = destPath + File.separator + ze.getName();
                    if (ze.isDirectory()) {
                        new File(filePath).mkdirs();
                    } else {
                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        byte[] buffer = new byte[1024];
                        int count;
                        while ((count = zis.read(buffer)) != -1) {
                            baos.write(buffer, 0, count);
                        }
                        byte[] bytes = baos.toByteArray();
                        File entryFile = new File(filePath);
                        //创建父目录
                        if (!entryFile.getParentFile().exists()) {
                            if (!entryFile.getParentFile().mkdirs()) {
                                throw new FileNotFoundException("zip entry mkdirs is failed");
                            }
                        }
                        //写文件
                        bos = new BufferedOutputStream(new FileOutputStream(entryFile));
                        bos.write(bytes);
                        bos.flush();
                    }
    
                }
            } finally {
                closeQuietly(zis);
                closeQuietly(bos);
            }
        }
    
        /**
         * @param srcPath  源文件的绝对路径,可以为文件或文件夹
         * @param destPath 目标文件的绝对路径  /sdcard/.../file_name.zip
         * @throws Exception 解压失败
         */
        public static void compress(String srcPath, String destPath) throws Exception {
            //参数检查
            if (TextUtils.isEmpty(srcPath) || TextUtils.isEmpty(destPath)) {
                throw new IllegalArgumentException("srcPath or destPath is illegal");
            }
            File srcFile = new File(srcPath);
            if (!srcFile.exists()) {
                throw new FileNotFoundException("srcPath file is not exists");
            }
            File destFile = new File(destPath);
            if (destFile.exists()) {
                if (!destFile.delete()) {
                    throw new IllegalArgumentException("destFile is exist and do not delete.");
                }
            }
    
            CheckedOutputStream cos = null;
            ZipOutputStream zos = null;
            try {
                // 对目标文件做CRC32校验,确保压缩后的zip包含CRC32值
                cos = new CheckedOutputStream(new FileOutputStream(destPath), new CRC32());
                //装饰一层ZipOutputStream,使用zos写入的数据就会被压缩啦
                zos = new ZipOutputStream(cos);
                zos.setLevel(9);//设置压缩级别 0-9,0表示不压缩,1表示压缩速度最快,9表示压缩后文件最小;默认为6,速率和空间上得到平衡。
                if (srcFile.isFile()) {
                    compressFile("", srcFile, zos);
                } else if (srcFile.isDirectory()) {
                    compressFolder("", srcFile, zos);
                }
            } finally {
                closeQuietly(zos);
            }
        }
    
        private static void compressFolder(String prefix, File srcFolder, ZipOutputStream zos) throws IOException {
            String new_prefix = prefix + srcFolder.getName() + "/";
            File[] files = srcFolder.listFiles();
            //支持空文件夹
            if (files.length == 0) {
                compressFile(prefix, srcFolder, zos);
            } else {
                for (File file : files) {
                    if (file.isFile()) {
                        compressFile(new_prefix, file, zos);
                    } else if (file.isDirectory()) {
                        compressFolder(new_prefix, file, zos);
                    }
                }
            }
        }
    
        /**
         * 压缩文件和空目录
         *
         * @param prefix
         * @param src
         * @param zos
         * @throws IOException
         */
        private static void compressFile(String prefix, File src, ZipOutputStream zos) throws IOException {
            //若是文件,那肯定是对单个文件压缩
            //ZipOutputStream在写入流之前,需要设置一个zipEntry
            //注意这里传入参数为文件在zip压缩包中的路径,所以只需要传入文件名即可
            String relativePath = prefix + src.getName();
            if (src.isDirectory()) relativePath += "/";//处理空文件夹
            ZipEntry entry = new ZipEntry(relativePath);
            //写到这个zipEntry中,可以理解为一个压缩文件
            zos.putNextEntry(entry);
            InputStream is = null;
            try {
                if (src.isFile()) {
                    is = new FileInputStream(src);
                    byte[] buffer = new byte[1024 << 3];
                    int len = 0;
                    while ((len = is.read(buffer)) != -1) {
                        zos.write(buffer, 0, len);
                    }
                }
                //该文件写入结束
                zos.closeEntry();
            } finally {
                closeQuietly(is);
            }
        }
    
        private static void closeQuietly(final Closeable closeable) {
            try {
                if (closeable != null) {
                    closeable.close();
                }
            } catch (final IOException ioe) {
                // ignore
            }
        }
    }
    

    GZip压缩,解压

    GZip压缩与解压主要依靠java api的两个类:
    GZipInputStream
    GZipOutputStream
    做了一个简单的封装.
    使用方法:

            try {
                ZipUtil.compress(getSDCard() + "zipTest", getSDCard() + "zipTest.zip");
                ZipUtil.decompress(getSDCard() + "zipTest.zip", getSDCard() + "zipTestFolder");
            } catch (Exception e) {
                e.printStackTrace();//失败
            }

    工具类GZipUtil.java

    package com.raise.raisestudy.zip;
    
    import android.text.TextUtils;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.Closeable;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.zip.GZIPInputStream;
    import java.util.zip.GZIPOutputStream;
    
    /**
     * compress @see {@link GZIPOutputStream}
     * <pre>
     * OutputStream os = ...
     * byte[] bytes = ...
     * GZIPOutputStream zos = new GZIPOutputStream(new BufferedOutputStream(os));
     * try {
     *     zos.write(bytes);
     * } finally {
     *     zos.close();
     * }
     * </pre>
     * <p>
     * compress @see {@link GZIPInputStream}
     * <pre>
     * InputStream is = ...
     * GZIPInputStream zis = new GZIPInputStream(new BufferedInputStream(is));
     * try {
     *     // Reading from 'zis' gets you the uncompressed bytes...
     *     processStream(zis);
     * } finally {
     *     zis.close();
     * }
     * </pre>
     * <p>
     * Created by raise.yang on 16/08/13.
     */
    
    public class GZipUtil {
    
        /**
         * 解压文件到指定文件夹
         *
         * @param gzip     源文件
         * @param destPath 目标文件绝对路径
         * @throws Exception 解压失败
         */
        public static void decompress(String gzip, String destPath) throws Exception {
            //参数检查
            if (TextUtils.isEmpty(gzip) || TextUtils.isEmpty(destPath)) {
                throw new IllegalArgumentException("gzip or destPath is illegal");
            }
            File gzipFile = new File(gzip);
            if (!gzipFile.exists()) {
                throw new FileNotFoundException("gzip file is not exists");
            }
            File destFile = new File(destPath);
            if (destFile.exists()) {
                if (!destFile.delete()) {
                    throw new FileNotFoundException("destFile delete is failed");
                }
            }
    
            GZIPInputStream zis = null;
            BufferedOutputStream bos = null;
            try {
                zis = new GZIPInputStream(new BufferedInputStream(new FileInputStream(gzipFile)));
                bos = new BufferedOutputStream(new FileOutputStream(destPath));
                byte[] buffer = new byte[1024 << 3];
                int len = 0;
                while ((len = zis.read(buffer)) != -1) {
                    bos.write(buffer, 0, len);
                }
                bos.flush();
            } finally {
                closeQuietly(zis);
                closeQuietly(bos);
            }
        }
    
        /**
         * @param srcPath
         * @param destPath
         * @throws Exception
         */
        public static void compress(String srcPath, String destPath) throws Exception {
            //参数检查
            if (TextUtils.isEmpty(srcPath) || TextUtils.isEmpty(destPath)) {
                throw new IllegalArgumentException("srcPath or destPath is illegal");
            }
            File srcFile = new File(srcPath);
            if (!srcFile.exists() || srcFile.isDirectory()) {
                throw new FileNotFoundException("srcPath file is not exists");
            }
            File destFile = new File(destPath);
            if (destFile.exists()) {
                if (!destFile.delete()) {
                    throw new IllegalArgumentException("destFile is exist and do not delete.");
                }
            }
            GZIPOutputStream zos = null;
            InputStream is = null;
            try {
                zos = new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream(destPath)));
                is = new FileInputStream(srcFile);
                byte[] buffer = new byte[1024 << 3];
                int len = 0;
                while ((len = is.read(buffer)) != -1) {
                    zos.write(buffer, 0, len);
                }
                zos.flush();
            } finally {
                closeQuietly(is);
                closeQuietly(zos);
            }
        }
    
        private static void closeQuietly(final Closeable closeable) {
            try {
                if (closeable != null) {
                    closeable.close();
                }
            } catch (final IOException ioe) {
                // ignore
            }
        }
    }
    

    参考文章:http://www.importnew.com/14410.html

  • 相关阅读:
    谈谈数据库连接池的原理
    认识wsgi
    mysql存储引擎介绍,索引
    Go语言并发组件--Goroutine
    【高级课程笔记】—— Echarts高级应用(二)
    【高级课程笔记】—— Echarts高级应用(一)
    【高级课程笔记】—— Echarts常用图表
    【高级课程笔记】—— Echarts入门&常用组件
    【重点突破】—— js防抖和节流(转)
    【重点突破】—— moment.js获取时间格式化
  • 原文地址:https://www.cnblogs.com/jpfss/p/9830553.html
Copyright © 2011-2022 走看看