zip压缩,使用org.apache.tools.zip实现zip压缩和解压

2023-11-01

1、使用apache的ant解压
org.apache.tools.zip
2、引入pom

 <!-- https://mvnrepository.com/artifact/org.apache.ant/ant -->
    <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant</artifactId>
      <version>1.10.5</version>
    </dependency>

package com.study.zip;

import org.apache.commons.lang3.StringUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

import java.io.*;
import java.util.Enumeration;

/**
 * 
 */
public class ZipUtilApache {
    private static final int buffer = 2048;


    /**
     * 解压zip
     *
     * @param zipPath      zip文件路径 必传
     * @param saveFilePath 如果为空那么解压到zipPath的当前目录,不为空解压到指定目录
     */
    public static void unZip(String zipPath, String saveFilePath) {
        int count = -1;
        String savepath = "";
        File file = null;
        InputStream is = null;
        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        //保存解压文件目录
        if (StringUtils.isNotBlank(saveFilePath)) {
            savepath = new File(saveFilePath) + File.separator;
        } else {
            savepath = new File(zipPath).getParent() + File.separator;
        }
        new File(savepath).mkdir(); //创建保存目录
        ZipFile zipFile = null;
        try {
            //解决中文乱码问题  格式有GBK  UTF8
            zipFile = new ZipFile(zipPath, "GBK");
            Enumeration<?> entries = zipFile.getEntries();
            while (entries.hasMoreElements()) {
                byte buf[] = new byte[buffer];
                ZipEntry entry = (ZipEntry) entries.nextElement();
                String filename = entry.getName();
                boolean ismkdir = false;
                //检查此文件是否带有文件夹
                if (filename.lastIndexOf("/") != -1) {
                    ismkdir = true;
                }
                filename = savepath + filename;
                //如果是文件夹先创建
                if (entry.isDirectory()) {
                    file = new File(filename);
                    file.mkdirs();
                    continue;
                }
                file = new File(filename);
                if (!file.exists()) {
                    //如果是目录先创建
                    if (ismkdir) {
                        //目录先创建
                        new File(filename.substring(0, filename.lastIndexOf("/"))).mkdirs();
                    }
                }
                //创建文件
                file.createNewFile();
                is = zipFile.getInputStream(entry);
                fos = new FileOutputStream(file);
                bos = new BufferedOutputStream(fos, buffer);
                while ((count = is.read(buf)) > -1) {
                    bos.write(buf, 0, count);
                }
                bos.flush();
                bos.close();
                fos.close();
                is.close();
            }
            zipFile.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } finally {
            try {
                if (bos != null) {
                    bos.close();
                }
                if (fos != null) {
                    fos.close();
                }
                if (is != null) {
                    is.close();
                }
                if (zipFile != null) {
                    zipFile.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 压缩文件
     * @param sourceDir 原文件目录
     * @param zipFile 压缩后的文件名称
     * @dirFlag zip文件中第一层是否包含一级目录,true包含;false没有
     * @throws Exception
     */
    public static void doZip(String sourceDir, String zipFile,boolean dirFlag) throws Exception{
        OutputStream os= new FileOutputStream(new File(zipFile));
        BufferedOutputStream bos = new BufferedOutputStream(os);
        ZipOutputStream zos = new ZipOutputStream(bos);
        File file = new File(sourceDir);
        String basePath = null;
        if (file.isDirectory()) {
            basePath = file.getPath();
        } else {
            basePath = file.getParent();
        }
        zipFile(file, basePath, zos,dirFlag);
        zos.closeEntry();
        zos.close();
    }

    /**
     * 压缩文件
     * @param source
     * @param basePath
     * @param zos
     * @param dirFlag  zip文件中第一层是否包含一级目录,true包含;false没有
     * @throws Exception
     */
    private static void zipFile(File source, String basePath, ZipOutputStream zos, boolean dirFlag) throws Exception {
        File[] files = new File[0];
        if (source.isDirectory()) {
            files = source.listFiles();
        } else {
            files = new File[1];
            files[0] = source;
        }
        File basePathFile = new File(basePath);
        String directoryName = basePathFile.getName();
        String pathName;
        byte[] buf = new byte[1024];
        int length = 0;
        for (File file : files) {
            if (file.isDirectory()) {
                pathName = file.getPath().substring(basePath.length() + 1)+ "/";
                if (dirFlag) {
                    pathName = directoryName + File.separator + pathName;
                }
                zos.putNextEntry(new ZipEntry(pathName));
                zipFile(file, basePath, zos, dirFlag);
            } else {
                pathName = file.getPath().substring(basePath.length() + 1);
                if (dirFlag) {
                    pathName = directoryName + File.separator + pathName;
                }
                InputStream is = new FileInputStream(file);
                BufferedInputStream bis = new BufferedInputStream(is);
                zos.putNextEntry(new ZipEntry(pathName));
                while ((length = bis.read(buf)) > 0) {
                    zos.write(buf, 0, length);
                }
                is.close();
            }
        }
    }

    public static void main(String[] args) throws Exception {
       // doZip("D:\\test\\b", "D:\\test\\10.zip",false);
       // doZip("D:\\test\\a", "D:\\test\\a.zip",false);

       // unZip("D:/test/ffff.zip",null);

        unZip("D:/test/a.zip", "D:/test/ccc");
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

zip压缩,使用org.apache.tools.zip实现zip压缩和解压 的相关文章

  • RedisUtil工具类

    package com test util import java util ArrayList import java util List import java util Map import java util Set import
  • 通用工具类

    package com struts2 jquery utils import java io File import java io IOException import java io OutputStream import java
  • 工具类用于ajax使用json请求时返回一个json

    package com noe utils import java util HashMap 工具类 封装响应内容 会被转成json响应 MyStatus ok gt new MyStatus 0 gt code 0 new MyStatu
  • java远程连接linux并发送命令,两种方案比较Jsch与ganymed-ssh2

    通过Jsch连接 step 1引入jar包
  • 打造利器Qt Creator:代码todo工具的使用

    打造利器Qt Creator 代码todo工具的使用 前言 俗话说 工欲善其事必先利其器 工作生活中 能有一款出色易用 高效简便的工具 对提高效率 达成价值有着莫大的影响 Qt是一套C 库 封装了许多好用的模块和功能 且带有先进的GUI设计
  • 使用XStream实现Java对象与XML互相转换(不断更新中)

    添加pom依赖
  • Git恢复本地误删文件

    转 https www cnblogs com yangshifu p 9680993 html Step 1 git status Step 2 git reset HEAD 被删除的文件或文件夹 Step 3 git checkout
  • java实现域名解析

    java实现域名解析 域名解析过程 浏览器检查是否有该域名缓存 检查本机host文件之内是否有该域名对应ip 检查本机DNS缓存 递归或迭代向DNS根域名服务器获取该域名ip地址 1 windows控制台 win r 输入cmd进入控制台
  • 【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio构建Java、Python项目

    文章目录 一 云IDE 1 云IDE简介 2 云IDE和云虚拟桌面区别 二 Cloud Studio 简介 1 简介 2 AI代码助手 3 企业源代码安全 三 快速开始 1 登录Cloud Studio 2 新建工作空间 3 代码空间 四
  • centos安装docker后,ping不能服务器ip

    工作中碰的问题 记录下解决过程 问题描述 2台内网服务器 A 172 20 72 77 和B 172 17 3 222 在A服务上ping B 安装 docker之前是可以ping通 安装docker之后确ping不通了 查找原因 在安装d
  • Java基础——大杂烩

    今天阿Q给大家来一节大杂烩 讲一下专题性不强的java基础知识 main方法详解 public static void main String args 这里面只有args能改变 public 被jvm调用 访问权限足够大 static 被
  • 推荐一个将MD格式的文档轻松转换到微信公众号的工具

    因为微信公众号自带的编辑器不是特别友好 这也是一个痛点 之前也有使用过google插件 但不是特别灵活 现在推荐的这款工具可以很好的支持将MD格式的文档直接进行渲染 还是非常好用的 话不多说 先给出工具地址 https md openwri
  • Android 调用系统发短信界面,给指定号码发短信,并带短信内容

    工具类如下ContentUtil java package com zhoucj messagedemo util import android content Context import android content Intent i
  • APP的接口版本管理 实现多版本共存

    思路 用户请求url gt 拦截器拦截 gt 转发到真正处理类和方法 gt 返回结果 url注解类 package com jc app util apiVersion import java lang annotation 需要拦截的AP
  • IDEA下SpringBoot指定环境、配置文件启动

    1 idea下的SpringBoot启动 指定配置文件 Springboot项目有如下配置文件 主配置文件application yml 测试环境 application test yml 生产环境 application pro yml
  • httpclient工具类

    import java io IOException import java net URI import java util ArrayList import java util List import java util Map imp
  • UUID工具类

    import java util UUID public class Uuid public static String id32 String uuid UUID randomUUID toString uuid uuid replace
  • MD5学习总结

    1 MD5简介 MD5 即消息摘要算法第五版 是一种被广泛使用的密码散列函数 散列算法的基本原理是 进行数据 如一段文字 运算 将原始数据变为另一段固定长度的值 MD5 可以产生出一个 128位 16字节 的散列值 hash value 用
  • JSON工具类

    在实际开发中通服都是使用JSON格式数据 那么如何跟JSON打交道呢 下面就写一些JSON的常用转换工具 以及JSON数据提取 目录 阿里的FastJSON JSONObject类 JSON类 JSONArray JSONPath Json
  • VS2019安装Qt插件教程,发现下载不了问题解决

    1 打开VS 最上方工具栏中点击扩展窗口 选择管理扩展 2 在右边搜索中搜索qt出现以下界面 这时可能出现问题 再点击下载发现迟迟下载不了 或者是下载到一定地步后无法下载 再或者是下载完成后安装无反应 解决办法 点击有点的详细信息或者进入如

随机推荐

  • 数字信号处理知识点

    数字信号处理知识点 1 频谱图中 横坐标取值范围的含义 2 MATLAB常用函数 2 1 波形产生 2 2 滤波器分析 2 3 滤波器实现 2 4 线性系统变换 2 5 滤波器设计 2 5 1 FIR滤波器 2 5 2 IIR滤波器 2 6
  • vue Cannot create property ‘xxx字段‘ on string

    看一下入参格式是否正确
  • const char *、char const*、char *const三者的区别

    一 const char 对于const char s来说 const char 是指向常量的指针 而不是指针本身为常量 可以不被初始化 该指针可以指向常量也可以指向变量 只是从该指针的角度而言 它所指向的是常量 s是不变的 s是可以改变的
  • git如何提交功能分支代码

    1 当你要写一个功能之前 先创建一个分支 在项目的终端输入 例如 git checkout b login 现在我们就创建了一个login登录分支 输入git branch 可以看到我们正处在login这个分支上面 2 当你写完这个登录功能
  • 数组越界访问会发生什么错误?怎样避免该错误?_SEGMENTATION FAULT IN LINUX 原因与避免...

    原作者 ZX WING xing5820 163 com 写得很好 加上之前的确遇到过很多信号问题 产生了很多疑问 1 什么是 Segmentation fault in Linux 我们引用wiki上的一段话来回答这个问题 A segme
  • vue 3.x 的生命周期函数与vue2的变化

    vue3 中取消了 beforeCreate与 created 这两个生命周期函数 其他的生命周期函数也发生了改变 图标中左侧是vue2中的名称 右侧是对应的vue3中的名称 beforeMount onBeforeMount mounte
  • Kibana介绍、安装和使用

    ELK中的K Kibana 下面就Kibana对ES的查询监控作介绍 就是常提到的大数据日志处理组件ELK里的K 什么是Kibana 现引用园友的一段对此的介绍 个人觉得比较全 Kibana是一个针对Elasticsearch的开源分析及可
  • Linux网络编程——TCP编程

    文章目录 前言 tcp编程相关函数 1 socket函数 2 bind函数 3 listen函数 4 accept函数 5 connect函数 6 send函数 7 recv函数 8 close函数 总结 前言 tcp编程的实现流程 tcp
  • IOException parsing XML document from class path resource [applicationContext.xml]

    今天在学习Spring框架时遇到了错误 经过报错分析发现是applicationContext xml文件位置放错了 在本地测试时 applicationContext xml文件应该放在src目录下 在服务端测试时放在WEB INF目录下
  • unity dll 位置

    在unityengine里面加 cs 然后在vs里面中看 C Program Files x86 Reference Assemblies Microsoft Framework NETFramework v3 5 Profile Unit
  • linux性能监控工具

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 引言 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的
  • 虚拟机安装Kali Linux操作系统

    博主主站地址 微笑涛声 www cztcms cn Kali Linux是基于Debian的Linux发行版 设计用于数字取证操作系统 每一季度更新一次 由Offensive Security Ltd维护和资助 最先由Offensive S
  • 超详细!Win10(UEFI启动)安装Ubuntu18.04双系统

    UEFI模式 首先必须说明的是 有两种不同的启动模式 在安装双系统的时候的操作也不尽相同 本文是针对UEFI启动模式的安装双系统的成功案例 如果您的计算机的启动模式是Legacy 请参考其他文章 如何知道自己的电脑是哪种启动模式 找到 运行
  • VoiceChat使用心得:探索沟通的全新维度

    在数字时代 沟通方式的多样性为我们提供了更多选择 最近 我发现了一个令人兴奋的新工具 它让我重新审视了沟通的全新维度 VoiceChat 作为一个热衷于技术和交流的人 我迫不及待地想分享一下我的使用心得 VoiceChat是一种即时语音通话
  • c语言实现等价关系的判断以及等价类的输出

    原理 设X 1 2 3 n 关系R的关系矩阵是M mij 判断等价关系 1 R是自反的 lt gt m11 m22 mnn 1 2 R是对称的 lt gt lt gt mij mji 3 R是传递的 lt gt tr R R 求等价类 如果
  • C#语言参考

    C 语言参考 注意 本文并非最终文档 在最终的商业版本发布前 可能会有重大修改 而且 它属微软公司所有 它是根据接受者和微软公司间的非公开协议公布的 本文档只是为了报告的目的提供的 并且 在本文档中 微软公司并没有作任何明示或暗示的担保 对
  • Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution论文阅读笔记

    题目 Deep Laplacian Pyramid Networks for Fast and Accurate Super Resolution 中文 深度拉普拉斯金字塔网络 可实现快速 准确的超分辨率 参考 摘要 本文提出了拉普拉斯金字
  • virtual,override,new ,extern,abstract修饰符

    方法定义中可以使用的修饰符有 a new b public c protected d internal e private f static g virtual h override i extern j abstract 对于virtu
  • 常见混沌系统—Lorenz模型

    1963年 Lorenz发现了第一个混沌吸引子 Lorenz系统 从此揭开了混沌研究的序幕 概念 在数学中 一个动力系统被称为自治的 当且仅当这个系统由一组常微分方程组成 并且这些方程的表达式与动力系统的自变量无关 在有关物理的动力系统中
  • zip压缩,使用org.apache.tools.zip实现zip压缩和解压

    1 使用apache的ant解压 org apache tools zip 2 引入pom