主要特性

  • Create, Add, Extract, Update, Remove files from a Zip file针对ZIP压缩文件创建、添加、抽出、更新和移除文件
  • Read/Write password protected Zip files(读写有密码保护的Zip文件)
  • Supports AES 128/256 Encryption(支持AES 128/256算法加密)
  • Supports Standard Zip Encryption(支持标准Zip算法加密)
  • Supports Zip64 format(支持zip64格式)
  • Supports Store (No Compression) and Deflate compression method(支持Store(非压缩)和Deflate压缩方法---不太明白)
  • Create or extract files from Split Zip files (Ex: z01, z02,...zip)(针对分块zip文件创建和抽出文件)
  • Supports Unicode file names(支持Unicode编码文件名)Progress Monitor(进度监控)

使用
zip4j默认采用utf-8编码,支持中文,也支持密码和多种压缩算法,可以说是功能强大,只是简单的解压文件,按照下面几步

public static void upzip(File zipFile,String dest,String password) {try {ZipFile zFile = new ZipFile(zipFile);//指向压缩文件.zip//设置文件名编码,在gbk系统中需要设置,文件名称是中文就不会乱码zFile.setFileNameCharset("gbk");if(!zFile.isValidZipFile()) {// 检查文件是否合法throw new Exception("文件名不合法");}File destFile = new File(dest);//解压目录if(destFile.isDirectory()&&!destFile.exists()) {destFile.mkdirs();}if(zFile.isEncrypted()) {//如果设置了密码zFile.setPassword(password.toCharArray());}zFile.extractAll(dest);//将文件输出到目标目录} catch (Exception e) {e.printStackTrace();}}

注意,如果解压的文件中文件名包含中文,一定要设置文件名字符集编码

zFile.setFileNameCharset("gbk");

对文件名编码字符集方法的调用一定要靠前,必须在isValidZipFile方法前调用,因为isValidZipFile方法的调用,会去设置文件名的编码

zFile.isValidZipFile()
zipModel = headerReader.readAllHeaders(this.fileNameCharset);

压缩和解压

public class CompressUtil {private static Logger logger = Logger.getLogger(CompressUtil.class);/*** 解压文件* * @param zipFile  压缩文件* @param dest     解压文件的存放目录* @param password 压缩文件的密码*/public static void unzip(File zipFile, String dest, String password) {try {ZipFile zFile = new ZipFile(zipFile);// 指向压缩文件.zipzFile.setFileNameCharset("gbk");// 设置文件名编码,在gbk系统中需要设置if (!zFile.isValidZipFile()) {// 检查文件是否合法throw new Exception("文件名不合法");}File destFile = new File(dest);// 解压目录if (destFile.isDirectory() && !destFile.exists()) {destFile.mkdirs();}if (zFile.isEncrypted()) {// 如果设置了密码zFile.setPassword(password.toCharArray());}zFile.extractAll(dest);} catch (Exception e) {e.printStackTrace();}}/*** 返回的是解压后的文件数组* * @param zipFile 压缩文件路径* @param desc    解压后文件的存放路径* @param passwd  密码* @param charset 文件名称编码* @return*/public static File[] getFilesByUnzip(File zipFile, String dest, String passwd, String charset) {try {ZipFile zFile = new ZipFile(zipFile);zFile.setFileNameCharset(charset);if (!zFile.isValidZipFile()) {throw new Exception("文件名称不合法");}File destFile = new File(dest);if (destFile.isDirectory() && !destFile.exists()) {destFile.mkdirs();}if (zFile.isEncrypted()) {zFile.setPassword(passwd);}zFile.extractAll(dest);// 获取文件列表List fileHeaders = zFile.getFileHeaders();List<File> extractFiles = new ArrayList<>();if (fileHeaders != null && fileHeaders.size() > 0) {for (int i = 0; i < fileHeaders.size(); i++) {FileHeader header = (FileHeader) fileHeaders.get(i);if (header != null) {extractFiles.add(new File(destFile, header.getFileName()));}}}File[] arr = new File[extractFiles.size()];return extractFiles.toArray(arr);} catch (Exception e) {e.printStackTrace();}return null;}/*** 使用给定密码压缩指定文件或文件夹到指定位置. dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者"".* 如果传null或者""则将压缩文件存放在当前目录,即跟源文件同目录,压缩文件名取源文件名,以.zip为后缀;* 如果以路径分隔符(File.separator)结尾,则视为目录,压缩文件名取源文件名,以.zip为后缀,否则视为文件名.* @param src         要压缩的文件或文件夹路径* @param dest        压缩文件存放路径* @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效. 如果为false,将直接压缩目录下文件到压缩文件.* @param passwd      压缩使用的密码* @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败.*/public static String zip(String src, String dest, boolean isCreateDir, String passwd) {File srcFile = new File(src);dest = buildDestinationZipFilePath(srcFile, dest);//获取压缩文件的存放路径 ZipParameters zipParameters = new ZipParameters();zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);//设置压缩方法是deflatezipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);//设置压缩级别if(passwd!=null&&passwd.trim().length()>0) {// 如果密码不为空,压缩包进行加密,需要设置压缩算法zipParameters.setEncryptFiles(true);zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);//加密算法设置为standardzipParameters.setPassword(passwd.toCharArray());}try {ZipFile zipFile = new ZipFile(dest);if(srcFile.isDirectory()) {if(!isCreateDir) {//如果false,表示不按照目录结构进行压缩ArrayList<File> list = new ArrayList<>();Collections.addAll(list, srcFile.listFiles());zipFile.addFiles(list, zipParameters);}else {//按照目录结构压缩zipFile.addFolder(srcFile, zipParameters);}}else {zipFile.addFile(srcFile, zipParameters);}} catch (ZipException e) {logger.error("-----文件压缩失败-----");logger.error(e.getMessage());dest = null;}return dest;}/*** 构建压缩文件存放路径,如果不存在将会创建 * 传入的可能是文件名或者目录,也可能不传,此方法用以转换最终压缩文件的存放路径 * * @param srcFile 源文件 * @param destParam 压缩目标路径 * * @return 正确的压缩文件存放路径*/private static String buildDestinationZipFilePath(File srcFile, String destParam) {if (destParam == null || destParam.trim() == "") {if (srcFile.isDirectory()) {destParam = srcFile.getParent() + File.separator + srcFile.getName() + ".zip";} else {String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));destParam = srcFile.getParent() + File.separator + fileName + ".zip";}} else {createDestDirectoryIfNecessary(destParam); // 在指定路径不存在的情况下将其创建出来if (destParam.endsWith(File.separator)) {String fileName = "";if (srcFile.isDirectory()) {fileName = srcFile.getName();} else {fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));}destParam += fileName + ".zip";}}return destParam;}/*** 创建压缩文件存放目录* @param destParam*/private static void createDestDirectoryIfNecessary(String destParam) {File file = null;if(destParam.endsWith(File.separator)) {file = new File(destParam);}else {file = new File(destParam.substring(0, destParam.lastIndexOf(File.separator)));}if(file.exists()) {file.mkdirs();}}
}

删除

进行删除操作前, 也要设置文件名编码为gbk,因为如果是中文名称的文件,就会抛出could not find file header for file的错误

删除文件

根据文件名称或者FileHeader删除

public RemoveFileFromZipFile() {try {// Initiate ZipFile object with the path/name of the zip file.ZipFile zipFile = new ZipFile("d:\\1.zip");zipFile.setFileNameCharset("gbk");// Note: If this zip file is a split file then this method throws an exception as// Zip Format Specification does not allow updating split zip files// Please make sure that this zip file has more than one file to completely test// this example// Removal of a file from a zip file can be done in two ways:// 1. 直接根据文件名称删除zipFile.removeFile("新建文本文档.txt");// 2. 创建FileHeader,根据FileHeader删除if (zipFile.getFileHeaders() != null && zipFile.getFileHeaders().size() > 0) {zipFile.removeFile((FileHeader)zipFile.getFileHeaders().get(0));} else {System.out.println("This cannot be demonstrated as zip file does not have any files left");}} catch (ZipException e) {e.printStackTrace();}

删除目录

将目录下面的文件删除,在删除目录

/*** 删除压缩文件中的文件或者目录* @param file 压缩文件的路径* @param removeFile 文件名或者目录*/public static void removeDirFromZip(String file,String removeFile) {try {ZipFile zipFile = new ZipFile(file);zipFile.setFileNameCharset("gbk");//设置文件名的编码格式if(!removeFile.endsWith("/")) {//删除文件的方式,第一种是根据文件的名称,第二种是根据文件的fileHeader进行删除//zipFile.removeFile(removeFile);FileHeader header = new FileHeader();header.setFileName(removeFile);zipFile.removeFile(header);}else {//如果是目录的话,需要先将目录下面的文件删除掉,在删除目录if(!removeFile.endsWith("/")) removeFile +="/";List headers = zipFile.getFileHeaders();List<FileHeader> removeFiles = new ArrayList<>();for (int i = 0; i < headers.size(); i++) {FileHeader subHeader =(FileHeader) headers.get(i);if(subHeader.getFileName().contains(removeFile)&&!subHeader.getFileName().equals(removeFile)) {//不能直接删除,会抛出java.lang.IndexOutOfBoundsException
//                      zipFile.removeFile(subHeader);// 这里我们使用一个list记录下删除的subheader,在进行删除removeFiles.add(subHeader);}}for (int i = 0; i < removeFiles.size(); i++) {zipFile.removeFile(removeFiles.get(i));}//最后将目录删除if(zipFile.getFileHeader(removeFile)!=null) {zipFile.removeFile(removeFile);}}} catch (ZipException e) {e.printStackTrace();}}

参考博客:https://blog.csdn.net/zhyh1986/article/details/7921376

zip压缩文件处理方案(Zip4j压缩和解压)相关推荐

  1. java io操作压缩文件_Java操作zip-压缩和解压文件

    一.说明 rar格式的压缩包收费,java支持zip格式的压缩和解压 二.工具类 import java.io.*; import java.util.Enumeration; import java ...

  2. Linux下zip格式文件的解压缩与压缩操作命令详解

    < Linux下zip格式文件的解压缩与压缩操作命令详解 > * 声明:网上找来比较凌乱,整理了一下,方便自己查看 zip格式文件的解压缩与压缩操作: 1.把/home目录下面的huaza ...

  3. 查看一个归档或压缩文件的内容而无需解压它

    查看一个归档或者压缩文件的内容而无需解压它 得益于 Linux 社区,有很多命令行工具可以来达成上面的目标.下面就让我们来看看使用它们的一些示例. 1.使用 vim 编辑器 vim 不只是一个编辑器, ...

  4. 7-Zip如何创建分卷压缩文件,进行分批压缩?

    相信很多小伙伴在传输文件时会选择先压缩成7-Zip等压缩包后再传输,但如果压缩的文件过大大,传输速度就会很慢,或者上传压缩文件到云盘时也会受到文件大小的限制. 要解决以上问题,我们可以把文件压缩成多个 ...

  5. ubuntu16.04 server unrar解压rar文件提示command not found和解压tar.bz2文件

    ubuntu16.04 server unrar解压rar文件提示command not found和解压tar.bz2文件 Unrar解压rar文件失败 unrar e a.rar -sh: unr ...

  6. android 压缩文件夹 jar,Android_JarZip压缩和解压文件

    本文资料来自<android开发权威指南> AndroidSDK中提供了java.util.jar和java.util.zip包中的若干类和接口来完成. 压缩文件基本步骤: 1.创建一个J ...

  7. linux 压缩文件性能,Linux常见压缩格式Tar、Zip和Gz格式之不同

    Linux 中大家在下载文件时常见的压缩文件有 .tar..zip 或 .gz 等扩展名,大多数用户都已经见怪不怪了.那 Linux 中为什么要搞出这么多种压缩格式,Tar.Zip 和 Gz 之间到底 ...

  8. 压缩文件变成了 点击解压.html,解决:解压zip文件却变成cpgz文件

    众所周知,zip是一种压缩文件格式,MAC OS默认支持的文件格式,当时偶尔当你打开zip文件想要解压时,却自动变成了cpgz文件而没有解压,再双击这个cpgz文件,Archive Utility又会 ...

  9. java压缩文件为rar_java 实现压缩多个文件 成zip/rar 等压缩文件

    一下代码实现的是将多个文件进行压缩,采用的是边压缩边下载的方式 /** * 压缩文件 * @param exportFilePathList * @param response */ public s ...

最新文章

  1. java安全编码指南之:堆污染Heap pollution
  2. 在URL地址栏中显示ico
  3. wsl ubuntu update显示err: 404 Not Found解决方法
  4. linux shell less 命令---转
  5. linux 服务器(CentOS7)搭建PHP环境+SSH配置+服务器文件上传配置
  6. 力扣232. 用栈实现队列(JavaScript)
  7. 条件判断_判断疑似陨石应具备什么条件下,才能判断陨石真伪
  8. 因在Java中不会优雅地判空,被CTO屌的快哭了。。。
  9. (转)美国国家科学院院士张首晟演讲全文:人工智能的三大发展支柱
  10. 常用的monkey命令
  11. Unity游戏开始界面制作教学
  12. github电脑壁纸_超有用电脑小工具(二)附福利
  13. 在ensp中配置交换机interface GigabitEthernet 1/0/1报错
  14. 深圳最牛街道办:腾讯华为设总部,百家上市公司年营收超2万亿
  15. Python之条件竞争
  16. 外网如何访问内网/局域网网站【内网穿透】
  17. docker单独挂盘步骤
  18. 学习指南者的第二天——代码解析
  19. Android小代码
  20. C# 闹钟「定时提醒,整点报时」

热门文章

  1. Core Text 实践:自定义每个字的位置
  2. 数据库范式:1NF、2NF、3NF、BCNF
  3. 第4篇-DSP28069外设初始化2
  4. 真人快打服务器维护多久,《真人快打11》故事模式约8小时 玩家表示比较理想...
  5. OFDM 符号的概念
  6. 理科生浪漫java表白代码_数学公式表白-2020理科生专属浪漫表白句子大全
  7. 阿里云对象存储Java-SDK实战
  8. 热烈庆祝女朋友的生日
  9. 向量的外积(outer product)与克罗内克积(Kronecker)
  10. 怎么修改和编辑PDF文件中的文字内容