用zt-zip Java库进行zip文件处理

2023-05-16

Java 标准库本身自带java.util.zip包,利用该包可以解决zip文件的处理问题。但是该包提供的功能相对底层,想要实现zip文件的处理,需要写一 些代码,该包并没有封装API到调用一个方法就实现了压缩或者解压功能的层次。zt-zip库提供了这种上层的封装,只需要调用一个方法,可以很方便的实 现zip压缩与解压,zt-zip在底层也利用了java.util.zip包。

maven中央仓库里已经有这个库

<dependency>
    <groupId>org.zeroturnaround</groupId>
    <artifactId>zt-zip</artifactId>
    <version>1.8</version>
    <type>jar</type>
</dependency>

解压

检查zip压缩包中是否具有某个文件

boolean exists = ZipUtil.containsEntry(new File("/tmp/demo.zip"), "foo.txt");

从zip压缩包中提取一个文件,然后放入byte数组

byte[] bytes = ZipUtil.unpackEntry(new File("/tmp/demo.zip"), "foo.txt");

从zip压缩包中提取一个文件到文件系统中

ZipUtil.unpackEntry(new File("/tmp/demo.zip"), "foo.txt", new File("/tmp/bar.txt"));

解压zip压缩包

ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"));

压缩包本身作为一个目录存放从zip压缩包中提取的文件

ZipUtil.explode(new File("/tmp/demo.zip"));

提取zip压缩包中的一个目录,保留目录名

ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"), new NameMapper() {
  public String map(String name) {
    return name.startsWith("doc/") ? name : null;
  }
});

提取zip压缩包中的一个目录,不保留目录名

final String prefix = "doc/"; 
ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"), new NameMapper() {
  public String map(String name) {
    return name.startsWith(prefix) ? name.substring(prefix.length()) : name;
  }
});

从zip压缩包中提取符合文件名模式的文件

ZipUtil.unpack(new File("/tmp/demo.zip"), new File("/tmp/demo"), new NameMapper() {
  public String map(String name) {
    if (name.contains("/doc")) {
      return name;
    }
    else {
      // returning null from the map method will disregard the entry
      return null;
    }
  }
});

打印在zip压缩包中的.class文件的名称

ZipUtil.iterate(new File("/tmp/demo.zip"), new ZipInfoCallback() {
  public void process(ZipEntry zipEntry) throws IOException {
    if (zipEntry.getName().endsWith(".class"))
      System.out.println("Found " + zipEntry.getName());
  }
});

打印zip压缩包中的.txt文件 (IoUtils为Apache Commons IO中的类)

ZipUtil.iterate(new File("/tmp/demo.zip"), new ZipEntryCallback() {
  public void process(InputStream in, ZipEntry zipEntry) throws IOException {
    if (zipEntry.getName().endsWith(".txt")) {
      System.out.println("Found " + zipEntry.getName());
      IOUtils.copy(in, System.out);
    }
  }
});

压缩

把目录里的内容压缩到zip包中

ZipUtil.pack(new File("/tmp/demo"), new File("/tmp/demo.zip"));

把目录本身压缩成zip包

ZipUtil.unexplode(new File("/tmp/demo"));

把目录里的文件以带有上级目录的形式压缩到zip内

ZipUtil.pack(new File("/tmp/demo"), new File("/tmp/demo.zip"), new NameMapper() {
  public String map(String name) {
    return "foo/" + name;
  }
});

向zip压缩包里新增一个文件

ZipUtil.addEntry(new File("/tmp/demo.zip"), "doc/readme.txt", new File("f/tmp/oo.txt"), new File("/tmp/new.zip"));

以byte数组的形式向zip压缩包里新增一个文件

ZipUtil.addEntry(new File("/tmp/demo.zip"), "doc/readme.txt", "bar".getBytes(), new File("/tmp/new.zip"));

同时以文件形式和byte数组形式向zip压缩包里新增文件

ZipEntrySource[] entries = new ZipEntrySource[] {
    new FileSource("doc/readme.txt", new File("foo.txt")),
    new ByteSource("sample.txt", "bar".getBytes())
};
ZipUtil.addEntries(new File("/tmp/demo.zip"), entries, new File("/tmp/new.zip"));

同时以文件形式和byte数组形式向zip压缩包里新增文件,并且以OutputStream的形式给出结果

ZipEntrySource[] entries = new ZipEntrySource[] {
    new FileSource("doc/readme.txt", new File("foo.txt")),
    new ByteSource("sample.txt", "bar".getBytes())
};
OutputStream out = null;
try {
  out = new BufferedOutputStream(new FileOutputStream(new File("/tmp/new.zip")));
  ZipUtil.addEntries(new File("/tmp/demo.zip"), entries, out);
}
finally {
  IOUtils.closeQuietly(out);
}

覆盖zip压缩包中的文件

boolean replaced = ZipUtil.replaceEntry(new File("/tmp/demo.zip"), "doc/readme.txt", new File("/tmp/foo.txt"), new File("/tmp/new.zip"));

以byte数组的形式覆盖zip压缩包中的文件

boolean replaced = ZipUtil.replaceEntry(new File("/tmp/demo.zip"), "doc/readme.txt", "bar".getBytes(), new File("/tmp/new.zip"));

同时以文件形式和byte数组的形式覆盖zip压缩包中的文件

ZipEntrySource[] entries = new ZipEntrySource[] {
    new FileSource("doc/readme.txt", new File("foo.txt")),
    new ByteSource("sample.txt", "bar".getBytes())
};
boolean replaced = ZipUtil.replaceEntries(new File("/tmp/demo.zip"), entries, new File("/tmp/new.zip"));

新增或覆盖zip压缩包中的文件

ZipEntrySource[] addedEntries = new ZipEntrySource[] {
        new FileSource("/path/in/zip/File1.txt", new File("/tmp/file1.txt")),
        new FileSource("/path/in/zip/File2.txt", new File("/tmp/file2.txt")),
        new FileSource("/path/in/zip/File3.txt", new File("/tmp/file2.txt")),
    };
ZipUtil.addOrReplaceEntries(new File("/tmp/demo.zip"), addedEntries);

转换

将zip压缩包中的文件的名称转为大写

boolean transformed = ZipUtil.transformEntry(new File("/tmp/demo"), "sample.txt", new StringZipEntryTransformer() {
    protected String transform(ZipEntry zipEntry, String input) throws IOException {
        return input.toUpperCase();
    }
}, new File("/tmp/demo.zip"));

比较

比较两个zip压缩包是否一致(忽略其中文件的时间差异)

boolean equals = ZipUtil.archiveEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"));

比较两个zip压缩包中有相同名字的文件 (忽略其中文件的时间差异)

boolean equals = ZipUtil.entryEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"), "foo.txt");

比较两个zip压缩包中有不同名字的文件 (忽略其中文件的时间差异)

boolean equals = ZipUtil.entryEquals(new File("/tmp/demo1.zip"), new File("/tmp/demo2.zip"), "foo1.txt", "foo2.txt");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用zt-zip Java库进行zip文件处理 的相关文章

  • Centos上VNC 启动和关闭 常见问题汇总

    1 重设密码 root 64 yqrh5u2 vncpasswd Password Verify root 64 yqrh5u2 2 启动和kill vncserver root 64 yqrh5u2 vncserver 1 New 39
  • Redis过期策略

    redis的过期策略大致分为三种 定时删除过期删除惰性删除 1 xff1a 定时删除 基本没人用 含义 xff1a 在设置key的过期时间的同时 xff0c 为该key创建一个定时器 xff0c 让定时器在key的过期时间来临时 xff0c
  • Adversarial Weight Perturbation Helps Robust Generalization(AWP adversarial train )

    目录 主要创新点实验探究Weight loss landscape与robust generalization gap之间的关系Weight loss landscape的绘制在learning processing of vanilla
  • ubuntu 20.04 Docker容器图形界面显示(运行GUI软件)的配置方法

    1 Docker的 可视化 Docker本身的工作模式是命令行的 xff0c 因为主要的使用场景可能是做服务器后端方面的比较多 但有时候我们会有在docker容器里运行一些图形界面的软件 xff0c 或者要调用摄像头 xff0c 输出图像等
  • PX4FMU如何从PX4IO芯片读取数据

    上一篇文章分析了PX4IO芯片中的数据接收和发送实现方式 得出结论是 xff1a PX4IO不会主动向PX4FMU发送任何数据 xff0c 所有的发送都出于接收到数据之后的回复 那么PX4FMU究竟如何从PX4IO芯片读取数据 xff0c
  • H3C防火墙与交换机链路聚合

    1 网络拓扑 2 防火墙配置 聚合端口配置 FW int Route Aggregation 1 FW Route Aggregation1 des connect to switch FW Route Aggregation1 quit
  • 光交断电加电操作方案

    光纤交换机型号 博科 SAN光纤交换机 SW300 断电前交换机检查 通过SSH 登录交换机 通过命令switchshow查看光交连接情况 通过命令cfgshow查询当前zone cfg配置情况 通过命令psshow 查看设备电源状态 通过
  • 华为E9000 融合架构刀片服务器 硬件安装及部件更换

    来自超聚变官网 xff0c 视频讲解 xff0c 很全很详细 CH121 V3 多媒体 https support xfusion com support zh blade servers ch121 v3 pid 21070741 mul
  • 83.Zabbix之iDrac的SNMP监控

    1 启动iDrac的SNMP服务 2 Zabbix server配置 使用系统自带的idrac模板 xff0c 然后全克隆成自己项目的模板 3 为主机添加模板 4 查看SNMP监控情况
  • MySQL查看SQL语句执行效率和mysql几种性能测试的工具

    Explain命令在解决数据库性能上是第一推荐使用命令 xff0c 大部分的性能问题可以通过此命令来简单的解决 xff0c Explain可以用来查看 SQL 语句的执行效 果 xff0c 可以帮助选择更好的索引和优化查询语句 xff0c
  • Huawei-FusionCompute-在Linux系统中安装Tools

    在 Linux 系统中安装 Tools 操作场景 空虚拟机创建并安装操作系统后 xff0c 需在虚拟机上安装华为提供的 Tools xff0c 以便提高虚拟机的 I O 处理性能 实现对虚拟机的硬件监控和其他高级功能 某些特性必须要安装 T
  • Huawei-FusionCompute-在Windows系统中安装Tools(x86)

    在 Windows 系统中安装 Tools xff08 x86 xff09 操作场景 空 x86 架构虚拟机创建并安装操作系统后 xff0c 需在虚拟机上安装华为提供的 Tools xff0c 以便提高虚拟机的 I O 处理性能 实现对虚拟
  • Huawei交换机链路聚合eth-trunk配置

    华三的动态对接华为的lacp 华三的静态对接华为的手工 华为手工模式配置 xff1a 1 执行命令 system view xff0c 进入系统视图 2 执行命令 interface eth trunk trunk id xff0c 进入
  • Windows每月安装补丁

    1 打开windows补丁的网站 Microsoft Update Catalog 2 搜索Cumulative Windows Server 2016 3 点击Download下载2023年4月补丁合集
  • Windows server 2022安装与激活

    1 下载 百度网盘下载 链接 xff1a https pan baidu com s 18c5smZPzbk0ClhEYh4LQ2w 提取码 xff1a w7i8 2 安装 最近版本新出的镜像官方的 EFI 文件在虚拟机上部署有问题 xff
  • 使用UltraISO制作U盘启动安装系统的方法

    1 下载并安装好UltraISO 下载链接ultraiso绿色版下载 ultraiso绿色版免费版下载v9 7 6 3810 软件爱好者 2 安装好UltraISO以后 xff0c 双击图标打开软件 3 点击 文件 菜单 打开 xff0c
  • u盘变成驱动器怎么变回来

    1 首先按下键盘 win 43 r 打开运行 xff0c 输入 cmd 回车确定 2 在其中输入 diskpart 回车确定 3 然后不要关闭 xff0c 右键此电脑 xff0c 打开 管理 4 在磁盘管理下确认一下自己的u盘盘符 5 确认
  • 全国DNS服务器IP地址大全详细介绍

  • Nginx之TCP/UDP反向代理

    Nginx从1 9 13起开始发布ngx stream core module模块不仅能支持TCP代理及负载均衡 其实也是支持UDP协议的 1 Nginx下载 wget http nginx org download nginx 1 24
  • 【无标题】

    错误代码 root 64 xxx nginx sbin nginx t nginx emerg unknown directive 34 stream 34 in usr local nginx conf nginx conf 118 ng

随机推荐

  • pm2常用的命令用法介绍

    pm2 是一个带有负载均衡功能的Node应用的进程管理器 当你要把你的独立代码利用全部的服务器上的所有CPU 并保证进程永远都活着 0秒的重载 PM2是完美的 下面我们来看pm2常用的命令用法介绍吧 PM2 xff08 github上的源码
  • 华为CE12808更换主控板

    在更换主控板的过程中 xff0c 务必缓慢 平稳地插拔单板 xff0c 避免左右晃动而导致触碰相邻单板 xff0c 造成正在运行中的单板发生故障 在主控板拔插的过程中严禁用手接触单板上的元器件 xff0c 以免损坏单板 新的主控板在出厂时已
  • 迪普防火墙FW1000普通双击热备配置

    一 组网图 二 端口聚合配置 三 配置三层接口地址 四 配置普通双机热备 五 配置安全域 六 配置地址对象 七 配置服务对象 八 配置静态路由 九 配置VRRP 十 配置NAT地址池 十一 配置源NAT 十二 配置目的NAT 十三 配置包过
  • 迪普防火墙F1000静默双击热备配置

    一 组网图 二 创建端口聚合 三 配置心跳接口IP地址 四 配置静默双击热备 五 配置三层接口IP地址 六 配置安全域 七 配置地址对象 八 配置服务对象 九 配置静态路由 十 配置NAT地址池 十一 配置源NAT 十二 配置目的NAT 十
  • Zabbix用户及用户组权限概述

    本文简单介绍用户及用户组权限 xff0c 参考官方文档 xff1a https www zabbix com documentation 5 2 manual config users and usergroups 一 概述 Zabbix
  • 使用nginx反向代理MRCP SERVER

    MRCP V2 的消息组成 MRCP xff08 V2 xff09 的交互过程可以分为三部分 1 SIP交互 xff1a Session Initiation Protocol xff0c 缩写SIP 正如协议的名称所言 xff0c 用于初
  • 一文搞懂如何使用STM32驱动直流电机(普通PWM输出和L298N、高级定时器输出带死区双通道互补PWM和IR2110S及自举电路、H桥电路和电机正反转)

    本文将用最通俗易懂的语言讲解怎么使用STM32驱动直流电机 xff0c 以及在使用过程中容易遇到的问题和解决办法 本文将介绍两种驱动方式 xff1a 普通PWM驱动L298N驱动直流电机 xff1b 互补PWM驱动IR2110S驱动直流电机
  • Linux —— 线程池

    目录 一 什么是线程池 二 线程池的优点 三 线程池的应用 四 实现一个简单的线程池 五 单例模式 1 饿汉实现方式 2 懒汉实现方式 3 单例模式实现线程池 xff08 懒汉方式 xff09 六 其他常见的各种锁 一 什么是线程池 线程池
  • 跟我一起写Shell脚本之二十二--常用命令(xargs)

    1 介绍 xargs 是一个强有力的命令 xff0c 它能够捕获一个命令的输出 xff0c 然后传递给另外一个命令 命令格式 xff1a xargs options command 选项 xff1a a file 从文件中读入作为 stdi
  • 解决Win10笔记本电脑Wifi频繁断线的问题

    Win10无线总是掉线怎么回事 经常有网友抱怨 xff0c 电脑升级Win10之后 xff0c 无线网络经常容易掉线或者不稳定的情况 有时候即便是勾选了自动连接Wifi xff0c 断线后也不会自动连接 Win10笔记本Wifi总是断线解决
  • 国内各个界面库比较,告诉你怎么选择界面库?

    目前网络上的界面库多彩多样 这里以个人的观点 xff0c 来评价一下界面库 如果有不当的地方望批评指出 1 Skin 43 43 www uipower com 该界面库是基于WIN32的界面库 xff0c 以上海勇进公司的形式来运作 xf
  • Docker端口映射

    为什么要端口映射 xff1f 在启动容器时 xff0c 如果不配置宿主机器与虚拟机的端口映射 xff0c 外部程序是无法访问虚拟机的 xff0c 因为没有端口 端口映射的指令是什么 xff1f docker指令 xff1a docker r
  • pyqt QStatusBar显示提示信息

    span class token keyword from span PyQt5 span class token keyword import span QtCore span class token keyword from span
  • 打jar包出现错误: The packaging for this project did not assign a file to the build artifact

    转载 xff1a 打jar包出现错误 xff1a The packaging for this project did not assign a file to the build artifact 曼彻斯特的天空是红色的的博客 CSDN博
  • 常见错误——使用CP命令复制目录出现 omitting directory 错误

    错误名称 omitting directory 使用命令 cp 描述 在Linux下使用cp命令拷贝对象时 xff0c 若出现了 omitting directory 错误 xff0c 确认CP命令复制的对象是否为非空目 录 在复制非空目录
  • 个人简历

    大家好 xff1a 本人系重庆大学2003级硕士研究生 xff0c 将于2006年7月毕业 相关技能 xff1a 1 计算机 xff1a 熟悉计算机软 硬件体系结构 xff0c 了解计算机接口技术 xff1b 熟悉C 43 43 汇编等语言
  • Adversarial Robustness - Theory and Practice

    文章目录 第一章 Introduction to adversarial robustness第二章 linear models第三章 Adversarial examples solving the inner maximization1
  • 筋斗云移动应用框架

    筋斗云框架是用于移动产品开发的一揽子解决方案 筋斗云的设计思想是做优雅的全平台应用 xff0c 可以制作各类移动端 xff08 如安卓 苹果平台 xff09 或桌面端 xff08 如Windows等桌面系统 xff09 的Web应用和原生应
  • 筋斗云接口编程 / 虚拟表和视图

    虚拟表和视图 表ApiLog中有一个字段叫app xff0c 表示前端应用名 xff1a 64 ApiLog id tm addr app userId userId 如果app 61 user xff0c 则关联到User表 xff1b
  • 用zt-zip Java库进行zip文件处理

    Java 标准库本身自带java util zip包 xff0c 利用该包可以解决zip文件的处理问题 但是该包提供的功能相对底层 xff0c 想要实现zip文件的处理 xff0c 需要写一 些代码 xff0c 该包并没有封装API到调用一