zip4j包的简单使用

Zip4j学习

之前开发过程中遇到一个需求:需要往压缩文件的某些目录下插入一些文件。之前使用了一些方案(例如ZipOutputStream),添加原理是新建一 个压缩文件,然后拷贝所有的文件,拷贝过程中添加新的文件进去,速度比较慢。后来发现了Zip4j,可以选择将文件只打包不压缩,然后可以特 别灵活的添加、删除文件。

zip4j功能比较强大,支持加密、解密压缩,支持文件的添加、删除等,所以想好好学习一波。

1.Zip4j介绍

zip4j官网:http://www.lingala.net/zip4j/ 可以在"download"页面下载官方示例进行学习。
特征:

  1. 从Zip文件创建,添加,提取,更新,删除文件
  2. 读/写密码保护的Zip文件
  3. 支持AES 128/256加密
  4. 支持标准邮​​编加密
  5. 支持Zip64格式
  6. 支持存储(无压缩)和Deflate压缩方法
  7. 从Split Zip文件创建或提取文件(例如:z01,z02,... zip)
  8. 支持Unicode文件名
  9. 进度监视器

2.实例

这里只提供几个我用到的例子。 pom文件添加

<dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>1.3.2</version>
</dependency>

2.1. 压缩文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import java.io.File;public class ZipFiles {private static void zipFile() throws ZipException {// 生成的压缩文件ZipFile zipFile = new ZipFile("D:\\test.zip");ZipParameters parameters = new ZipParameters();// 压缩方式parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);// 压缩级别parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);// 要打包的文件夹File currentFile = new File("D:\\test");File[] fs = currentFile.listFiles();// 遍历test文件夹下所有的文件、文件夹for (File f : fs) {if (f.isDirectory()) {zipFile.addFolder(f.getPath(), parameters);} else {zipFile.addFile(f, parameters);}}}public static void main(String[] args) throws ZipException {zipFile();}
}

注释:

  1. 压缩方式
  • COMP_STORE = 0;(仅打包,不压缩)
  • COMP_DEFLATE = 8;(默认)
  • COMP_AES_ENC = 99; 加密压缩
  1. 压缩级别
  • DEFLATE_LEVEL_FASTEST = 1; (速度最快,压缩比最小)
  • DEFLATE_LEVEL_FAST = 3; (速度快,压缩比小)
  • DEFLATE_LEVEL_NORMAL = 5; (一般)
  • DEFLATE_LEVEL_MAXIMUM = 7;
  • DEFLATE_LEVEL_ULTRA = 9;

2.2.解压文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;public class UnZipFiles {private static void unzip() {try {ZipFile zipFile = new ZipFile("D:\\test.zip");zipFile.extractAll("D:\\test");// 如果解压需要密码
//            if(zipFile.isEncrypted()) {
//                zipFile.setPassword("111");
//            }} catch (ZipException e) {e.printStackTrace();}}public static void main(String[] args) {unzip();}
}

2.3.添加文件到压缩文件中

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;
import java.io.File;
import java.util.ArrayList;/*** 添加文件到压缩文件中** @author Wang Erniu* @date 2018/9/8 18:35*/
public class AddFileToZip {public static void addFile() {try {ZipFile zipFile = new ZipFile("D:\\test.zip");ArrayList<File> addFiles = new ArrayList<>();addFiles.add(new File("D:\\addFile1.txt"));addFiles.add(new File("D:\\addFile2.txt"));ZipParameters parameters = new ZipParameters();parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);// 目标路径parameters.setRootFolderInZip("ks/");zipFile.addFiles(addFiles, parameters);// 可以添加单个文件
//            zipFile.addFile(new File("D:\\addFile2.txt"),parameters);} catch (ZipException e) {e.printStackTrace();}}public static void main(String[] args) {addFile();}
}

注释:
发现一个问题,这种方式添加文件时,只能添加一次,再次添加会失败,没有发现原因。

2.4.以流的方式添加文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;/*** 流的方式添加文件** @author Wang Erniu* @date 2018/9/8 18:43*/
public class AddInputStreamToZip {public static void addFile(){InputStream is = null;try {ZipFile zip = new ZipFile("D:\\test.zip");ZipParameters para = new ZipParameters();para.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);para.setFileNameInZip("ks/add.txt");para.setSourceExternalStream(true);is = new ByteArrayInputStream(new String("这是文件内容").getBytes());zip.addStream(is, para);} catch (ZipException e) {e.printStackTrace();} finally {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}}public static void main(String[] args) {addFile();}
}

注释:
这种方想比直接添加文件优势在于可以多次添加。

2.5.删除压缩文件中的文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;public class DeleteFromZip {public static void deleteFile() {try {ZipFile zipFile = new ZipFile("D:\\test.zip");zipFile.removeFile("ks/add");} catch (ZipException e) {e.printStackTrace();}}public static void main(String[] args) {deleteFile();}
}

注释:
测试发现不能删除压缩文件中的文件夹

2.6.创建带密码的压缩文件

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;import java.io.File;public class ZipFileWithPwd {private static void zipFile() throws ZipException {// 生成的压缩文件ZipFile zipFile = new ZipFile("D:\\test.zip");ZipParameters parameters = new ZipParameters();// 压缩方式parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);// 压缩级别parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);parameters.setEncryptFiles( true );parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);parameters.setPassword("111");// 要打包的文件夹File currentFile = new File("D:\\test");File[] fs = currentFile.listFiles();// 遍历test文件夹下所有的文件、文件夹for (File f : fs) {if (f.isDirectory()) {zipFile.addFolder(f.getPath(), parameters);} else {zipFile.addFile(f, parameters);}}}public static void main(String[] args) throws ZipException {zipFile();}
}

由于时间问题,并没有研究太多,只测试了几个基本操作。源码地址:GitHub - Grrui/zip4j: zip4j包的简单使用
更多的例子,可以参考官网的例子。
参考文章:
ZIP4j 压缩与解压_尚云峰的博客-CSDN博客_zip4j解压

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试用例设计--判定表

一. 判定表 定义判定表通常由四部分组成&#xff0c;如上图&#xff1a; 条件桩 : 它列出决定一组条件的对象&#xff1b; 条件项: 它列出各种可能的条件组合&#xff1b; 动作桩: 它列出所有的操作; 动作项: 它列出在对应的条件组合下的动作. 应用的范围在多个条件决定多个动…

王爽 汇编语言第三版 第11章 标志寄存器

条件码&#xff1a; ① OF(Overflow Flag)溢出标志&#xff0c;溢出时为1&#xff0c;否则置0.标明一个溢出了的计算&#xff0c;如:结构和目标不匹配.② SF(Sign Flag)符号标志&#xff0c;结果为负时置1&#xff0c;否则置0.③ ZF(Zero Flag)零标志&#xff0c;运算结果为0时…

Gartner:预计2018年人工智能行业总价值达1.2万亿美元

来源&#xff1a;网络大数据市场研究公司Gartner周三发布最新研究报告称&#xff0c;人工智能行业的总价值将在2018年达到1.2万亿美元&#xff0c;比2017年增长70%。其中&#xff0c;创造商业价值最大的领域是客户体验解决方案。该公司还预计&#xff0c;到2022年的时候&#x…

边标志法填充多边形

这里不仔细讲原理&#xff0c;只是把我写的算法发出来&#xff0c;跟大家分享下&#xff0c;如果有错误的话&#xff0c;还请大家告诉我&#xff0c;如果写的不好&#xff0c;也请指出来&#xff0c;一起讨论进步。 基本思想: 先用一种特殊的颜色在帧缓冲器中将多边形的边界(水…

JAVA将html[动态]页面转成图片

近日项目上接到一个任务&#xff0c;设计并编写住院病案首页页面&#xff0c;然后将其转换成图片显示给医生查看。 天哪&#xff0c;住院病案内容那么多&#xff0c;光编写这个页面就已经够呛了&#xff0c;转图片我也没弄过&#xff0c;于是百度了一下&#xff0c;花了两天时间…

王爽 汇编语言第三版 课程设计 1

From&#xff1a;https://www.cnblogs.com/Since-natural-ran/p/6938133.html 汇编语言-课程设计1: https://www.cnblogs.com/tsembrace/p/3267158.html 王爽课程设计1(汇编语言编写): https://www.imooc.com/article/18785 王爽《汇编语言》课程设计1: https://blog.csdn.net/…

挑战权威还是偏离主流?颠覆性研究或将证明神经信号是机械波

来源&#xff1a;科研圈 翻译 马骁骁 编辑 魏潇 廖红艳就职于哥本哈根尼尔斯玻尔研究所&#xff08;Niels Bohr Institute&#xff09;的托马斯亨伯格&#xff08;Thomas Heimburg&#xff09;&#xff0c;是一位研究量子力学和生物物理的物理学家。然而&#xff0c;他却希…

史上最全的女人坐月子注意事項

希望男人们要精心照顾好妻子&#xff0c;让妻子平安度过这一时期&#xff0c;为了宝宝&#xff0c;为了你们的幸福&#xff0c;因为你爱她就要呵护她&#xff0c;她好你也好&#xff0c;她平安就是你们全家的幸福&#xff0c;精致女人把祝福送给你们&#xff01; 传统上人们将产…

java安全解压文件

方法一 public class Decompression {private static final Logger LOGGER Logger.getLogger(Decompression.class);private static final int BUFFER 512;private static final int TOO_BIG 0x6400000;private static final int TOO_MANY 1024;private Decompression() {…

汇编语言 test 和 cmp 区别

From&#xff1a;https://blog.csdn.net/zz709196484/article/details/77755243 看过破解教程&#xff0c;都知道 test&#xff0c;cmp 是比较关键&#xff0c;可是我一直不清楚它们究竟是怎么比较的&#xff0c;最后下决心找了很多资料&#xff0c;和大家一起把它们弄清楚. 首…

斯坦福大学、DARPA与硅谷公司共同分析前沿科技发展趋势

来源&#xff1a;科技日报 作者&#xff1a;张梦然日前&#xff0c;斯坦福大学研究团队、美国国防部高级研究计划局&#xff08;DARPA&#xff09;以及硅谷创投公司和米资本的专家们&#xff0c;共同研讨了技术将如何重塑行业和社会等问题。他们分析了现今全球前沿科技的未来…

利用cookie的跨域单点登录的简单实现

Configuration:1. Web.Config在两个站点的配置配置文件machine节点上相同的validationKey, decryptionKey and validation的值&#xff0c;如<machineKey validationKey"282487E295028E59B8F411ACB689CCD6F39DDD21E6055A3EE480424315994760ADF21B580D8587DB675FA02F791…

小甲鱼 OllyDbg 教程系列 (一) :二进制破解科普系列之 ReverseMe

小甲鱼 视频教程&#xff08; 4、5 集 &#xff09;&#xff1a;https://www.bilibili.com/video/av6889190?p4 实验程序 reverseME.exe 下载地址&#xff1a;https://pan.baidu.com/s/18NDV3rQ_yV_qzUrNRYmqjA 提取码&#xff1a;e91j http://www.360doc.com/content/1…

java将字符串生成图片

java将字符串保存为图片 因为最近接触到的需求是要将指定的字符串内容保存为图片&#xff0c;我知道肯定要用awt相关的东西&#xff0c;但是以前没有接触过awt&#xff0c;所以只能去网上学习相关的东西和找有关的资料&#xff0c;好在最后可以解决&#xff0c;直接上代码&…

开源的关系型数据持久化组件

Apache Empire-db 是一个开源的关系型数据持久化组件&#xff0c;能够实现数据库无关的动态查询定义&#xff0c;简便的数据读取和更新。与其它持久化组件相比 如&#xff1a;Hibernate、TopLink、iBATIS或JPA实现&#xff0c;Empire-db更注重编译期类型安全&#xff0c;减少冗…

AI 综述专栏 | 超长综述让你走近深度人脸识别

来源&#xff1a;人工智能前沿讲习班 作者&#xff1a; 葛政相信做机器学习或深度学习的同学们回家总会有这样一个烦恼&#xff1a;亲朋好友询问你从事什么工作的时候&#xff0c;如何通俗地解释能避免尴尬&#xff1f;我尝试过很多名词来形容自己的工作&#xff1a;机器学习&…

祝各位网友儿童节快乐!

儿童节就要到了&#xff0c;借此机会&#xff0c;给自己的童心放个假吧。 如果你不知道如何度过&#xff0c;可以参考以下建议&#xff1a; 建议一&#xff1a;在自己的房间开心的裸爬&#xff1b; 建议二&#xff1a;穿着鞋在自己的床上狂蹦&#xff1b; 建议三&#xff1a;披…

机器人也能拥有人类情感:“情感计算”让机器人学会“读心术”

来源&#xff1a;《情感计算与情感机器人系统》作者&#xff1a;吴敏&#xff0c;刘振焘&#xff0c;陈略峰著随着机器人进入日常生活中的各个方面&#xff0c;人们对其提出了更高的要求&#xff0c;希望它们具有感知人类情感、意图的能力&#xff0c;这类机器人称为情感机器人…

C 语言 函数调用栈

From&#xff1a;https://www.cnblogs.com/clover-toeic/p/3755401.html https://www.cnblogs.com/clover-toeic/p/3756668.html 程序的执行过程可看作连续的函数调用。当一个函数执行完毕时&#xff0c;程序要回到调用指令的下一条指令(紧接call指令)处继续执行。函数调用过…