zoukankan      html  css  js  c++  java
  • Java 基础【15】 压缩与解压缩

        Java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类。

        还包括使用 DEFLATE 压缩算法(用于 ZIP 和 GZIP 文件格式)对数据进行压缩和解压缩的类。

        依赖 Jdk 编写该工具类,不依赖任何第三方 jar,随用随取,实现功能大体如下:

          1.目录级别递归压缩与解压缩 zip;

          2.单文件压缩和解压缩 zip ;

    import java.io.*;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;
    
    
    /**
     * 通过Java的Zip输入输出流实现压缩和解压文件
     */
    public final class ZipUtil {
    
        private ZipUtil() {
    
        }
    
        /**
         * 压缩文件
         *
         * @param filePath 待压缩的文件路径
         * @return 压缩后的文件
         */
        public static File zip(String filePath) {
            File target = null;
            File source = new File(filePath);
            if (source.exists()) {
                String sourceName = source.getName();
                String zipName = sourceName.contains(".") ? sourceName.substring(0, sourceName.indexOf(".")) : sourceName;
                target = new File(source.getParent(), zipName + ".rar");
                if (target.exists()) {
                    boolean delete = target.delete();//删除旧的压缩包
                }
                FileOutputStream fos = null;
                ZipOutputStream zos = null;
                try {
                    fos = new FileOutputStream(target);
                    zos = new ZipOutputStream(new BufferedOutputStream(fos));
    
                    addEntry(null, source, zos);  //添加对应的文件Entry
                } catch (IOException e) {
                    throw new RuntimeException(e);
                } finally {
                    IOUtil.closeQuietly(zos, fos);
                }
            }
            return target;
        }
    
        /**
         * 扫描添加文件Entry
         *
         * @param base   基路径
         * @param source 源文件
         * @param zos    Zip文件输出流
         * @throws IOException
         */
        private static void addEntry(String base, File source, ZipOutputStream zos) throws IOException {
            String entry = (base != null) ? base + source.getName() : source.getName(); //按目录分级,形如:aaa/bbb.txt
            if (source.isDirectory()) {
                File[] files = source.listFiles();
                if (files != null && files.length > 0) {
                    for (File file : files) {
                        addEntry(entry + "/", file, zos);// 递归列出目录下的所有文件,添加文件 Entry
                    }
                }
            } else {
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                try {
                    byte[] buffer = new byte[1024 * 10];
                    fis = new FileInputStream(source);
                    bis = new BufferedInputStream(fis, buffer.length);
                    int read;
                    zos.putNextEntry(new ZipEntry(entry)); //如果只是想将文件夹下的所有文件压缩,不需名要压缩父目录,约定文件名长度 entry.substring(length)
                    while ((read = bis.read(buffer, 0, buffer.length)) != -1) {
                        zos.write(buffer, 0, read);
                    }
                    zos.closeEntry();
                } finally {
                    IOUtil.closeQuietly(bis, fis);
                }
            }
        }
    
        /**
         * 解压文件
         *
         * @param filePath 压缩文件路径
         */
        public static void unzip(String filePath) {
            File source = new File(filePath);
            if (source.exists()) {
                ZipInputStream zis = null;
                BufferedOutputStream bos = null;
                try {
                    zis = new ZipInputStream(new FileInputStream(source));
                    ZipEntry entry;
                    while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) {
                        File target = new File(source.getParent(), entry.getName());
                        if (!target.getParentFile().exists()) {  
                            target.getParentFile().mkdirs();
                        }
                        bos = new BufferedOutputStream(new FileOutputStream(target));
                        int read;
                        byte[] buffer = new byte[1024 * 10];
                        while ((read = zis.read(buffer, 0, buffer.length)) != -1) {
                            bos.write(buffer, 0, read);
                        }
                        bos.flush();
                    }
                    zis.closeEntry();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                } finally {
                    IOUtil.closeQuietly(zis, bos);
                }
            }
        }
    }

        输入输出 工具类IOUtil :

    import java.io.Closeable;
    import java.io.IOException;
    
    /**
     * IO流工具类
     */
    public class IOUtil {
    
        /**
         * 关闭一个或多个流对象
         * @param closeables 可关闭的流对象列表
         * @throws IOException
         */
        public static void close(Closeable... closeables) throws IOException {
            if (closeables != null) {
                for (Closeable closeable : closeables) {
                    if (closeable != null) {
                        closeable.close();
                    }
                }
            }
        }
    
        /**
         * 关闭一个或多个流对象
         */
        public static void closeQuietly(Closeable... closeables) {
            try {
                close(closeables);
            } catch (IOException e) {
                // do nothing
            }
        }
    
    }
  • 相关阅读:
    结合人工智能的高性能医学:现状、挑战与未来
    2019年人工智能行业25大趋势
    睡眠分期--深度学习算法
    并行技术
    元数据--你有没有注意?
    战略、策略与执行
    机器学习前沿03
    元学习--learn to learn
    机器学习前沿02
    机器学习玩法
  • 原文地址:https://www.cnblogs.com/java-class/p/5662934.html
Copyright © 2011-2022 走看看