文档章节

ZIP4J---ZIP文件压缩与解压缩学习

皮蛋猫
 皮蛋猫
发布于 2013/09/06 14:41
字数 1810
阅读 7599
收藏 31

          最近公司准备让各项目组提供公共工具组件,手中正好无事便研究其中一个工具 - 文件压缩与解压缩工具。

          目前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:该包下例子都是关于解压压缩包的例子,包括解压加密文件等;


示例代码

示例代码中需要对文件进行操作,为方便程序运行创建以下三个文件 可以直接运行大多数代码

  1. sample.txt
  2. myvideo.avi
  3. mysong.mp3


示例1 创建压缩包添 加文件到压缩包中(未设置加密)

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 创建压缩包添加文件到 指定目录中进行压缩

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 添加文件夹到压缩包中

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 创建加密压缩包

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 创建分卷压缩包

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 通过流的方式添加文件到压缩包中

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 解压压缩文件

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();
	}

}
  • 如果解压的文件需要密码,可以添加以下代码:
  • 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中压缩算法:

  1.     DEFLATE_LEVEL_FASTEST 
  2.     DEFLATE_LEVEL_FASTEST
  3.     DEFLATE_LEVEL_NORMAL
  4.     DEFLATE_LEVEL_MAXIMUM
  5.     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提供的一些常用的工具方法,总结在此,方便自己与大家使用。如果有更好的工具或者有不正确的地方欢迎大家指出!






© 著作权归作者所有

上一篇: XXX公司总结
下一篇: JSON数据操作方法
皮蛋猫
粉丝 7
博文 34
码字总数 17739
作品 0
成都
程序员
私信 提问
加载中

评论(2)

山川尽美
山川尽美
很不错
小-菜
小-菜
的确是我找到最好用的zip助手
POI读取通过xml修改的docx文件报错。

我通过zip4j解压docx,修改其中的document.xml文件来实现编辑word。然后我将修改完的文件压缩,然后通过POI来读取,报错: zip4j压缩代码: POI读取代码: 错误信息是在看不懂,zip4j的压缩方...

KeybMan
2017/10/25
371
0
Java 的 zip 开发包 - ZIP4J

ZIP4J 是一个开源的 Java 处理 zip 压缩文件的开发包。 主要特性: Create, Add, Extract, Update, Remove files from a Zip file Read/Write password protected Zip files Supports AES 12......

匿名
2014/11/07
4.8K
0
zip压缩问题

java压缩了zip文件,linux下用unzip解压,中文名称乱码,网上查的都不对,1是用 ant下面的试过也是乱码2设置gbk还是乱码,3用过zip4j 解压还是乱码,设置编码gbk utf-8 也试过了,还是乱码,...

obhen
2017/10/25
383
5
springboot添加邮件发送及压缩功能

springboot添加邮件发送及文件压缩功能 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190233.html   先来一段诗 `   就这样吧   忍受折磨   然后,躺进医院   然后,死去...

funnyZpC
2018/07/14
0
0
Zip4j开源jar包的简单使用

package com.fenghao.zip; import java.io.File; import java.util.ArrayList; import java.util.Collections; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception......

余平的余_余平的平
2018/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

社区投稿 | 线程简介和 MySQL 调试环境搭建

作者:高鹏 文章末尾有他著作的《深入理解MySQL主从原理 32讲》,深入透彻理解MySQL主从,GTID相关技术知识。 本文节选自《深入理解MySQL主从原理》第29节 注意:本文分为正文和附件两部分,...

爱可生
6分钟前
1
0
DDOS攻击可以分为什么类型?怎么样才能解决?

DDoS 是一种多源网络攻击,其目的是针对终端用户扰乱其网络的资源或服务。其不断进化的复杂性能够造成各种各样的伤害,例如欺诈以及勒索等。DDoS 攻击通常透过多重受损的系统或者装置注入殭尸...

云漫网络Ruan
10分钟前
1
0
从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念

作者| 阿里巴巴资深技术专家、CNCF 9个 TCO 之一 李响 一、什么是 Kubernetes Kubernetes,从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译...

阿里巴巴云原生
10分钟前
1
0
修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)

上周在定位问题时,发现Spring容器实例化Bean的时候抛出异常,为了查看更详细的信息,决定修改spring-context-4.0.2.RELEASE.jar中的CommonAnnotationBeanPostProcessor类的代码,在里面打印...

程序员欣宸
13分钟前
1
0
MongoDB集群配置

MongoDB集群配置 2019年06月30日 13:21:05 2014Team 阅读数 77更多 分类专栏: MongoDB 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文...

linjin200
13分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部