java解压缩/压缩/加密压缩/加密解压缩 ZIP4J---ZIP文件压缩与解压缩学习
最近公司准备让各项目组提供公共工具组件,手中正好无事便研究其中一个工具 - 文件压缩与解压缩工具。
目前JAVA API已提供对于ZIP文件的压缩与解压缩,但网上总结不支持ZIP文件加密与解密甚至对于中文支持也有问题,于是果断找其他的支持加密解密的第三方包。 winzipaes 与 ZIP4J 都符合项目的要求 ,最终选择ZIP4J来进行使用。
- ZIP4J 是一个支持处理ZIP文件的开源库
- 支持创建,修改,添加,删除,解压 压缩文件
- 支持读/写密码保护
- 支持AES加密 128/256
- 支持标准ZIP加密
- 支持进度监视器
- 自持Unicode 文件名
- 支持创建分卷压缩文件
- 支持将文件添加到压缩包中但不进行压缩
ZIP4J 项目地址为 :http://www.lingala.net/zip4j/ ,但该地址无法直接访问需要使用代理进行访问
再提供一个在线代理网站:http://www.7daili.com/
目前ZIP4J 版本为:1.3.1 ,只需要直接下一载一个zip4j_1.3.1.jar一个jar包即可,同时可以下载官网提供的例子进行学习,例子相当详细(官网提供的例子的jdk 为1.4的版本 导入后需要修改一下)
官网提供的例子程序比较简单与小巧 整个程序也就一百多k,但demo程序对于各种功能的使用讲的非常详细。
项目包结构分为三层:
- ZIP:该包下主要讲述压缩包的新增,修改,删除等例子(包含加密文件创建,通过流的方式创建 、添加压缩文件 、创建分卷压缩文件);
- MISC:该包下主要展示几个工具方法例子,如:是否是分卷压缩包的判断、获取压缩包中的文件信息(文件名 大小等信息)、压缩进度查看、根据文件名删除压缩包对应文件等;
- EXTRACT:该包下例子都是关于解压压缩包的例子,包括解压加密文件等;
示例代码:
示例代码中需要对文件进行操作,为方便程序运行创建以下三个文件 可以直接运行大多数代码
- sample.txt
- myvideo.avi
- mysong.mp3
示例1 创建压缩包添 加文件到压缩包中(未设置加密)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public class AddFilesDeflateComp {
public AddFilesDeflateComp() {
try {
ZipFile zipFile = new ZipFile( "c:\\ZipTest\\AddFilesDeflateComp.zip" );
ArrayList<File> filesToAdd = new ArrayList<File>();
filesToAdd.add( new File( "c:\\ZipTest\\sample.txt" ));
filesToAdd.add( new File( "c:\\ZipTest\\myvideo.avi" ));
filesToAdd.add( new File( "c:\\ZipTest\\mysong.mp3" ));
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); // set compression method to deflate compression parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
zipFile.addFiles(filesToAdd, parameters);
} catch (ZipException e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
new AddFilesDeflateComp();
}
}
|
- 该类主要用于创建普通压缩包。如果压缩包不存在 则会自动创建一个ZIP包;如果已经存在一个不为空的同名ZIP压缩包 会将内容添加到该同名压缩包中。
- 如果手动创建一个格式为ZIP的空压缩包进行保存,则为抛出异常:ZipException :Negative seek offset
- 如果将其他的文件后缀修改为ZIP包再运行程序,也会抛出异常:ZipException: zip headers not found. probably not a zip file
- ZIP4J 提供ZipParameters对象来进行压缩参数设置,其中setCompressionMethod方法可以设置压缩还是 不压缩
示例2 创建压缩包添加文件到 指定目录中进行压缩
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public class AddFilesToFolderInZip {
public AddFilesToFolderInZip() {
try {
ZipFile zipFile = new ZipFile( "c:\\ZipTest\\AddFilesDeflateComp.zip" );
ArrayList<File> filesToAdd = new ArrayList<File>();
filesToAdd.add( new File( "c:\\ZipTest\\sample.txt" ));
filesToAdd.add( new File( "c:\\ZipTest\\myvideo.avi" ));
filesToAdd.add( new File( "c:\\ZipTest\\mysong.mp3" ));
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
parameters.setRootFolderInZip( "test2/" );
zipFile.addFiles(filesToAdd, parameters);
} catch (ZipException e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
new AddFilesToFolderInZip();
}
}
|
- 该程序执行后,会将sample.txt、myvideo.avi、mysong.mp3 添加到test2文件夹中 并生成AddFilesDeflateComp.zip 压缩包
- 如果已经存在AddFilesDeflateComp.zip,则会将需要打包的内容添加到已经存在的压缩包去
示例3 添加文件夹到压缩包中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
public class AddFolder {
public AddFolder() {
try {
ZipFile zipFile = new ZipFile( "c:\\ZipTest\\AddFolder.zip" );
String folderToAdd = "c:\\FolderToAdd" ;
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
zipFile.addFolder(folderToAdd, parameters);
} catch (ZipException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new AddFolder();
}
}
|
- 需要添加的文件夹必须存在,否则抛出异常:ZipException: input folder does not exist
- * 如果已经存在同名文件则会出现一个文件的时候会出现一个问题,程序会生成一个临时包并去修改之前存在的同名压缩文件,最后修改不成功且会抛出异常:ZipException: cannot rename modified zip file最后只留下一个临时包, 建议在生成的时候添加判断 避免出现这种错误
示例4 创建加密压缩包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
public class AddFilesWithAESEncryption {
public AddFilesWithAESEncryption() {
try {
ZipFile zipFile = new ZipFile( "c:\\ZipTest\\AddFilesWithAESZipEncryption.zip" );
ArrayList<File> filesToAdd = new ArrayList<File>();
filesToAdd.add( new File( "c:\\ZipTest\\sample.txt" ));
filesToAdd.add( new File( "c:\\ZipTest\\myvideo.avi" ));
filesToAdd.add( new File( "c:\\ZipTest\\mysong.mp3" ));
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( "123" );
zipFile.addFiles(filesToAdd, parameters);
} catch (ZipException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new AddFilesWithAESEncryption();
}
}
|
加密压缩包后打开时需要输入密码,与rar相同:
示例5 创建分卷压缩包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public class CreateSplitZipFile {
public CreateSplitZipFile() {
try {
ZipFile zipFile = new ZipFile( "c:\\ZipTest\\CreateSplitZipFile.zip" );
ArrayList<File> filesToAdd = new ArrayList<File>();
filesToAdd.add( new File( "c:\\ZipTest\\sample.txt" ));
filesToAdd.add( new File( "c:\\ZipTest\\myvideo.avi" ));
filesToAdd.add( new File( "c:\\ZipTest\\mysong.mp3" ));
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
zipFile.createZipFile(filesToAdd, parameters, true , 65536 );
} catch (ZipException e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
new CreateSplitZipFile();
}
}
|
- 执行程序后会根据设置大小生成多个 压缩包名.z + 数量编号文件,如下图:
- 如果已经存在同名压缩包,则会抛出异常提示已经存在:ZipException: zip file: c:\ZipTest\CreateSplitZipFile.zip already exists. To add files to existing zip file use addFile method
- 需要进行分卷压缩的大小,不能小于规定的65536 bytes
示例6 通过流的方式添加文件到压缩包中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public class AddStreamToZip {
public AddStreamToZip() {
InputStream is = null ;
try {
ZipFile zipFile = new ZipFile( "c:\\ZipTest\\AddStreamToZip.zip" );
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setFileNameInZip( "yourfilename.txt" );
parameters.setSourceExternalStream( true );
is = new FileInputStream( "c:\\ZipTest\\sample.txt" );
zipFile.addStream(is, parameters);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null ) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new AddStreamToZip();
}
}
|
示例7 解压压缩文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class ExtractAllFiles {
public ExtractAllFiles() {
try {
ZipFile zipFile = new ZipFile( "c:\\ZipTest\\ProgressInformation.zip" );
zipFile.extractAll( "c:\\ZipTest1" );
} catch (ZipException e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
new ExtractAllFiles();
}
}
|
- 如果解压的文件需要密码,可以添加以下代码:
- ?1234
if
(zipFile.isEncrypted()) {
// if yes, then set the password for the zip file
zipFile.setPassword(
"test123!"
);
}
- 在进行解压缩时需要判断文件是否为加密压缩,否则会抛出异常:ZipException: empty or null password provided for AES Decryptor
压缩效率
ZIP4J提供5中压缩算法:
- DEFLATE_LEVEL_FASTEST
- DEFLATE_LEVEL_FASTEST
- DEFLATE_LEVEL_NORMAL
- DEFLATE_LEVEL_MAXIMUM
- DEFLATE_LEVEL_ULTRA
根据API提供的几种不同压缩级别进行测试(文件夹压缩),测试结果如下:
一个180M的文件夹压缩后
- WinRAR 30秒 - 78.7 MB ;
- NORMAL - 18 秒 91.2 MB ;
- FAST 13秒 -93.1 MB;
- FASTEST - 最快速10 秒94.7 MB
- MAXIMUM 23 秒 - 90.7 MB;
- ULTRA -50 90.6 MB
与WinRAR 相比较来说,压缩时间还是很不错 但对文件的压缩大小来说还是WINRAR要强一些 (各人电脑配置不同 压缩的时间这些也不同)
以上便是ZIP4J提供的一些常用的工具方法,总结在此,方便自己与大家使用。如果有更好的工具或者有不正确的地方欢迎大家指出!
java解压缩/压缩/加密压缩/加密解压缩 ZIP4J---ZIP文件压缩与解压缩学习相关推荐
- ZIP文件压缩与解压缩
ZIP4J解压优点 ZIP4J 是一个支持处理ZIP文件的开源库 支持创建,修改,添加,删除,解压 压缩文件 支持读/写密码保护 支持AES加密 128/256 支持标准ZIP加密 支持进度监视器 自 ...
- java 操作Zip文件(压缩、解压、加密)
java 操作Zip文件(压缩.解压.加密) 依赖:点击下载 package com.zxl.test;import net.lingala.zip4j.model.ZipParameters; im ...
- java Zip文件压缩含加密
以下是对文件压缩的方法,这里只是单个文件压缩,多个变通一下就可以. 首先下载一个jar包:zip4j-1.3.2.jar /*** 对压缩文件进行加密*/public void ZipFileAndE ...
- 7z001怎么解压在安卓手机上面_安卓zip文件压缩RAR解压手机下载-安卓zip文件压缩RAR解压v1.0最新版下载...
安卓zip文件压缩RAR解压是一款非常好用的手机压缩解压缩神器,在安卓zip文件压缩RAR解压上我们可以看到很多的实用的功能,软件可以帮助我们更好的处理我们手机中的文件,感兴趣的朋友赶紧下载安卓zip ...
- cordova 安卓文件多选_安卓zip文件压缩RAR解压软件下载-安卓zip文件压缩RAR解压下载v3.0.4安卓版...
安卓zip文件压缩RAR解压是一款非常好用的手机压缩解压缩神器,在安卓zip文件压缩RAR解压上我们可以看到很多的实用的功能,软件可以帮助我们更好的处理我们手机中的文件,感兴趣的朋友赶紧下载安卓zip ...
- iOS Zip文件压缩
iOS Zip文件压缩 //文件做压缩 拿到准备压缩的文件路径 拼装到数组中 使用的压缩类库 SSZipArchive//压缩文件路径 NSString *zippedPath; NSArray *p ...
- Java在不解压的前提下处理ZIP文件
Java在不解压的前提下处理ZIP文件 在不解压zip的情况下,通过Zip4J工具包,直接以InputStream的形式,读取里面文件 JDK已经内置了ZipInputStream 能够完成该工作,但 ...
- 利用Java进行zip文件压缩与解压缩
可能存在的业务情况: 1.用户上传了压缩包,需校验压缩包中的文件是否合格. 2.用户上传压缩包,对压缩包中的文件进行批量水印处理 解决思路: 1.读取原压缩包文件,解压缩至临时目录 2.对临时目录中的 ...
- python解压加密zip文件_Python:解压缩前检测一个zip文件否为加密,两种算法。
前一篇文章介绍了如何用python自动解压缩加密的zip文件, 但是有一个问题,在服务器端脚本在解加密zip文件之前,需要检测其是否是加密文件,若是,则询问密码,结合密码解压缩:如果不是,则则直接解压 ...
- [Android开发]zip文件压缩解压缩
//----------------- DirTraversal.java package com.once; import java.io.File; import java.util.Arra ...
最新文章
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
- 获取access中表的相关信息
- mysql一: 登陆
- C语言满分解法:L1-041 寻找250 (10分)(解题报告)
- linux 网络RPS/RFS/XPS
- Android入门:封装一个HTTP请求的辅助类
- cdn对动态网站有作用吗_网站选择cdn加速有什么作用?
- android金币动效_Android 仿余额宝数字跳动动画效果完整代码
- 科技圈CEO用微鲸尬明星脸,除了罗永浩还有哪些大牛光荣上榜?
- html5 牧场游戏,手机QQ首批五款HTML5游戏名单 农场偷菜复活
- 函数----ModifyStyle
- tomcat出现404的原因_tomcat访问项目报404是什么原因?
- A-Playing with Paper
- 《舞!舞!舞!》读后感
- C#汉字转拼音(npinyin)
- Java实现各种节日维护 农历,阳历,二十四节气 自定义节日,根据当前日期获取节日
- 将英文输入变成手写体的在线工具
- 虹科网络流量监控软件解决方案(二)-- 网络探针nProbe
- 米筐量化如何安装使用?
- Sublist3r使用教程-子域名扫描工具
热门文章
- 【Android入门1 概述】
- office Excel中的vlookup函数的使用
- 美股暴跌一夜市值蒸发10万亿,传吉利收购魅族,马斯克或任推特临时CEO,今日更多大新闻在此...
- Ae:文本图层操作基础
- 基于matlab的螺线管仿真,基于COMSOL Multiphysics恒流螺线管的电磁场仿真分析
- 《失恋》班底再《浮沉》 滕华涛:最后一次拍剧
- UnityShader 曲面细分着色器 生成地形 高度贴图
- 大数据告诉你粤东西北12市振兴成效如何
- 老显卡安装Linux黑屏,ubuntu16.04安装gtx1080驱动重启黑屏(blank screen)解决方法
- MySQL使用WHERE子句设置查询条件