`

zip4j

 
阅读更多

zip4j -- Java处理zip压缩文件的完整解决方案

分类: Java ZIP 1742人阅读 评论(23) 收藏 举报
 
 

前言


一个多月前,因项目需要对Java语言下的zip格式压缩文件的处理作了一些了解,尝试了多种开源项目并写了几篇博客做记录:

 

 ZIP4J,作为解决了我的问题的终极解决方案,本来一开始在搜索引擎上就看到了它的踪迹,但因天朝的网络环境问题,zip4j的官网一直无法访问,最终使我多走了好多冤枉路,期间试过JDK的zip包,试过Apache的zip解决方案,也试过如winzipaes等其它的开源框架,最终没有满足自己的需求,最后,我不得已挂了一下代理将zip4j下载了下来,试用了一下,果然威力无比,所到之处所向披靡...

闲话少说,如果需要可以到zip4j的官网下载该开源项目:

http://www.lingala.net/zip4j/

不过需要提醒的是可能无法直接访问,如果无法正常访问,请自行准备代理访问,如果各位嫌麻烦,可以到这里下载

http://download.csdn.net/detail/zhangyihui1986/4418509

这是我的CSDN资源链接,下载需要3分,您如果分数不多,可以留言索取,呵呵...我也需要积分,请谅解!

官网上下载的资源好像是不带API帮助文档的,我利用其源码生成了一份,也一并打在我的资源文件中,希望能帮到大家。


ZIP4J的官方说明


(自己翻译了一下,英文不好,呵呵...)

Key features(主要特性):

 

  • 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的功能是非常强大的,完全可以利用其写个类似于好压的zip文件管理软件,但我们用地最多的可能还是利用其作一些简单的解压和压缩操作,其它的功能极少触碰,我也一样,呵呵...


使用注意点


zip4j默认采用UTF-8编码,所以它支持中文,同时也支持密码,而且支持多种压缩算法,可以说功能强大,但使用起来却非常简单,当然,如果需求比较复杂,那就得好好去研究了。如果你仅仅是简单地解压一个zip压缩文件,那么只需要简单地几步即可:

  1. public static void unzip(File zipFile, String dest, String passwd) throws ZipException {    
  2.         ZipFile zFile = new ZipFile(zipFile);  // 首先创建ZipFile指向磁盘上的.zip文件     
  3.         zFile.setFileNameCharset("GBK");       // 设置文件名编码,在GBK系统中需要设置     
  4.         if (!zFile.isValidZipFile()) {   // 验证.zip文件是否合法,包括文件是否存在、是否为zip文件、是否被损坏等     
  5.             throw new ZipException("压缩文件不合法,可能被损坏.");    
  6.         }    
  7.         File destDir = new File(dest);     // 解压目录     
  8.         if (destDir.isDirectory() && !destDir.exists()) {    
  9.             destDir.mkdir();    
  10.         }    
  11.         if (zFile.isEncrypted()) {    
  12.             zFile.setPassword(passwd.toCharArray());  // 设置密码     
  13.         }    
  14.         zFile.extractAll(dest);      // 将文件抽出到解压目录(解压)     
  15.     }    
    public static void unzip(File zipFile, String dest, String passwd) throws ZipException {  
            ZipFile zFile = new ZipFile(zipFile);  // 首先创建ZipFile指向磁盘上的.zip文件  
            zFile.setFileNameCharset("GBK");       // 设置文件名编码,在GBK系统中需要设置  
            if (!zFile.isValidZipFile()) {   // 验证.zip文件是否合法,包括文件是否存在、是否为zip文件、是否被损坏等  
                throw new ZipException("压缩文件不合法,可能被损坏.");  
            }  
            File destDir = new File(dest);     // 解压目录  
            if (destDir.isDirectory() && !destDir.exists()) {  
                destDir.mkdir();  
            }  
            if (zFile.isEncrypted()) {  
                zFile.setPassword(passwd.toCharArray());  // 设置密码  
            }  
            zFile.extractAll(dest);      // 将文件抽出到解压目录(解压)  
        }  

 

 当然将指定文件压缩成zip文件也是非常简单的事,此处不再贴代码,如有需要请参看下面的完整示例。

 提示:如果将要解压的压缩文件中的文件名含有中文,解压时需要注意一点,就是设置文件名字符集方法

  1. zFile.setFileNameCharset("GBK");   
zFile.setFileNameCharset("GBK"); 

这个方法的调用一定要靠前,要靠多前呢?其实最好在创建ZipFile之后就设置上,至少要在

  1. zFile.isValidZipFile()    
zFile.isValidZipFile()  

这个方法调用之前调用,我在应用时因为这个问题耽误好久,最后查看源码才弄明白,好像是ZipFile在验证方法中就将编码设置好,以后就不再对文件名编码作改变了。


完整示例


下面提供一个自己写的例子,鄙人才疏学浅,天分也差,写的代码质量很差,斗胆贴上,希望能起到抛砖引玉的作用。

 

  1. package com.ninemax.cul.util;  
  2.   
  3. import java.io.File;  
  4. import java.util.ArrayList;  
  5. import java.util.Collections;  
  6. import java.util.List;  
  7.   
  8. import org.apache.commons.lang3.StringUtils;  
  9.   
  10. import net.lingala.zip4j.core.ZipFile;  
  11. import net.lingala.zip4j.exception.ZipException;  
  12. import net.lingala.zip4j.model.FileHeader;  
  13. import net.lingala.zip4j.model.ZipParameters;  
  14. import net.lingala.zip4j.util.Zip4jConstants;  
  15.   
  16. /** 
  17.  * ZIP压缩文件操作工具类 
  18.  * 支持密码 
  19.  * 依赖zip4j开源项目(http://www.lingala.net/zip4j/) 
  20.  * 版本1.3.1 
  21.  * @author ninemax 
  22.  */  
  23. public class CompressUtil {  
  24.       
  25.     /** 
  26.      * 使用给定密码解压指定的ZIP压缩文件到指定目录 
  27.      * <p> 
  28.      * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 
  29.      * @param zip 指定的ZIP压缩文件 
  30.      * @param dest 解压目录 
  31.      * @param passwd ZIP文件的密码 
  32.      * @return 解压后文件数组 
  33.      * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 
  34.      */  
  35.     public static File [] unzip(String zip, String dest, String passwd) throws ZipException {  
  36.         File zipFile = new File(zip);  
  37.         return unzip(zipFile, dest, passwd);  
  38.     }  
  39.       
  40.     /** 
  41.      * 使用给定密码解压指定的ZIP压缩文件到当前目录 
  42.      * @param zip 指定的ZIP压缩文件 
  43.      * @param passwd ZIP文件的密码 
  44.      * @return  解压后文件数组 
  45.      * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 
  46.      */  
  47.     public static File [] unzip(String zip, String passwd) throws ZipException {  
  48.         File zipFile = new File(zip);  
  49.         File parentDir = zipFile.getParentFile();  
  50.         return unzip(zipFile, parentDir.getAbsolutePath(), passwd);  
  51.     }  
  52.       
  53.     /** 
  54.      * 使用给定密码解压指定的ZIP压缩文件到指定目录 
  55.      * <p> 
  56.      * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 
  57.      * @param zip 指定的ZIP压缩文件 
  58.      * @param dest 解压目录 
  59.      * @param passwd ZIP文件的密码 
  60.      * @return  解压后文件数组 
  61.      * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 
  62.      */  
  63.     public static File [] unzip(File zipFile, String dest, String passwd) throws ZipException {  
  64.         ZipFile zFile = new ZipFile(zipFile);  
  65.         zFile.setFileNameCharset("GBK");  
  66.         if (!zFile.isValidZipFile()) {  
  67.             throw new ZipException("压缩文件不合法,可能被损坏.");  
  68.         }  
  69.         File destDir = new File(dest);  
  70.         if (destDir.isDirectory() && !destDir.exists()) {  
  71.             destDir.mkdir();  
  72.         }  
  73.         if (zFile.isEncrypted()) {  
  74.             zFile.setPassword(passwd.toCharArray());  
  75.         }  
  76.         zFile.extractAll(dest);  
  77.           
  78.         List<FileHeader> headerList = zFile.getFileHeaders();  
  79.         List<File> extractedFileList = new ArrayList<File>();  
  80.         for(FileHeader fileHeader : headerList) {  
  81.             if (!fileHeader.isDirectory()) {  
  82.                 extractedFileList.add(new File(destDir,fileHeader.getFileName()));  
  83.             }  
  84.         }  
  85.         File [] extractedFiles = new File[extractedFileList.size()];  
  86.         extractedFileList.toArray(extractedFiles);  
  87.         return extractedFiles;  
  88.     }  
  89.       
  90.     /** 
  91.      * 压缩指定文件到当前文件夹 
  92.      * @param src 要压缩的指定文件 
  93.      * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. 
  94.      */  
  95.     public static String zip(String src) {  
  96.         return zip(src,null);  
  97.     }  
  98.       
  99.     /** 
  100.      * 使用给定密码压缩指定文件或文件夹到当前目录 
  101.      * @param src 要压缩的文件 
  102.      * @param passwd 压缩使用的密码 
  103.      * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. 
  104.      */  
  105.     public static String zip(String src, String passwd) {  
  106.         return zip(src, null, passwd);  
  107.     }  
  108.       
  109.     /** 
  110.      * 使用给定密码压缩指定文件或文件夹到当前目录 
  111.      * @param src 要压缩的文件 
  112.      * @param dest 压缩文件存放路径 
  113.      * @param passwd 压缩使用的密码 
  114.      * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. 
  115.      */  
  116.     public static String zip(String src, String dest, String passwd) {  
  117.         return zip(src, dest, true, passwd);  
  118.     }  
  119.       
  120.     /** 
  121.      * 使用给定密码压缩指定文件或文件夹到指定位置. 
  122.      * <p> 
  123.      * dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者"".<br /> 
  124.      * 如果传null或者""则将压缩文件存放在当前目录,即跟源文件同目录,压缩文件名取源文件名,以.zip为后缀;<br /> 
  125.      * 如果以路径分隔符(File.separator)结尾,则视为目录,压缩文件名取源文件名,以.zip为后缀,否则视为文件名. 
  126.      * @param src 要压缩的文件或文件夹路径 
  127.      * @param dest 压缩文件存放路径 
  128.      * @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效.<br /> 
  129.      * 如果为false,将直接压缩目录下文件到压缩文件. 
  130.      * @param passwd 压缩使用的密码 
  131.      * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. 
  132.      */  
  133.     public static String zip(String src, String dest, boolean isCreateDir, String passwd) {  
  134.         File srcFile = new File(src);  
  135.         dest = buildDestinationZipFilePath(srcFile, dest);  
  136.         ZipParameters parameters = new ZipParameters();  
  137.         parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);           // 压缩方式   
  138.         parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);    // 压缩级别   
  139.         if (!StringUtils.isEmpty(passwd)) {  
  140.             parameters.setEncryptFiles(true);  
  141.             parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD); // 加密方式   
  142.             parameters.setPassword(passwd.toCharArray());  
  143.         }  
  144.         try {  
  145.             ZipFile zipFile = new ZipFile(dest);  
  146.             if (srcFile.isDirectory()) {  
  147.                 // 如果不创建目录的话,将直接把给定目录下的文件压缩到压缩文件,即没有目录结构   
  148.                 if (!isCreateDir) {  
  149.                     File [] subFiles = srcFile.listFiles();  
  150.                     ArrayList<File> temp = new ArrayList<File>();  
  151.                     Collections.addAll(temp, subFiles);  
  152.                     zipFile.addFiles(temp, parameters);  
  153.                     return dest;  
  154.                 }  
  155.                 zipFile.addFolder(srcFile, parameters);  
  156.             } else {  
  157.                 zipFile.addFile(srcFile, parameters);  
  158.             }  
  159.             return dest;  
  160.         } catch (ZipException e) {  
  161.             e.printStackTrace();  
  162.         }  
  163.         return null;  
  164.     }  
  165.       
  166.     /** 
  167.      * 构建压缩文件存放路径,如果不存在将会创建 
  168.      * 传入的可能是文件名或者目录,也可能不传,此方法用以转换最终压缩文件的存放路径 
  169.      * @param srcFile 源文件 
  170.      * @param destParam 压缩目标路径 
  171.      * @return 正确的压缩文件存放路径 
  172.      */  
  173.     private static String buildDestinationZipFilePath(File srcFile,String destParam) {  
  174.         if (StringUtils.isEmpty(destParam)) {  
  175.             if (srcFile.isDirectory()) {  
  176.                 destParam = srcFile.getParent() + File.separator + srcFile.getName() + ".zip";  
  177.             } else {  
  178.                 String fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));  
  179.                 destParam = srcFile.getParent() + File.separator + fileName + ".zip";  
  180.             }  
  181.         } else {  
  182.             createDestDirectoryIfNecessary(destParam);  // 在指定路径不存在的情况下将其创建出来   
  183.             if (destParam.endsWith(File.separator)) {  
  184.                 String fileName = "";  
  185.                 if (srcFile.isDirectory()) {  
  186.                     fileName = srcFile.getName();  
  187.                 } else {  
  188.                     fileName = srcFile.getName().substring(0, srcFile.getName().lastIndexOf("."));  
  189.                 }  
  190.                 destParam += fileName + ".zip";  
  191.             }  
  192.         }  
  193.         return destParam;  
  194.     }  
  195.       
  196.     /** 
  197.      * 在必要的情况下创建压缩文件存放目录,比如指定的存放路径并没有被创建 
  198.      * @param destParam 指定的存放路径,有可能该路径并没有被创建 
  199.      */  
  200.     private static void createDestDirectoryIfNecessary(String destParam) {  
  201.         File destDir = null;  
  202.         if (destParam.endsWith(File.separator)) {  
  203.             destDir = new File(destParam);  
  204.         } else {  
  205.             destDir = new File(destParam.substring(0, destParam.lastIndexOf(File.separator)));  
  206.         }  
  207.         if (!destDir.exists()) {  
  208.             destDir.mkdirs();  
  209.         }  
  210.     }  
  211.   
  212.     public static void main(String[] args) {  
  213.         zip("d:\\test\\cc""d:\\test\\cc.zip""11");  
  214. //      try {   
  215. //          File[] files = unzip("d:\\test\\汉字.zip", "aa");   
  216. //          for (int i = 0; i < files.length; i++) {   
  217. //              System.out.println(files[i]);   
  218. //          }   
  219. //      } catch (ZipException e) {   
  220. //          e.printStackTrace();   
  221. //      }   
  222.     }  
  223. }  
分享到:
评论

相关推荐

    zip4j.jar包下载 包含zip4j-2.10.0版本

    Zip4j是一个强大的Java库,专门用于处理ZIP文件。它提供了广泛的API,使得在Java应用程序中创建、读取、修改和解压缩ZIP文件变得非常容易。这个库特别有用,因为它支持加密,包括AES-256,这在处理敏感数据时是必需...

    zip4j包-1.3.2.zip

    《深入理解zip4j:Java处理ZIP文件的强大工具》 在Java编程中,处理ZIP文件是一项常见的任务,而zip4j库就是专为此目的设计的一个强大工具。zip4j不仅支持基本的压缩和解压功能,还具备了处理加密ZIP文件的能力,这...

    zip4j-1.3.2.jar 包下载,处理zip压缩文件的开发包

    《使用zip4j库处理Java中的ZIP压缩文件》 在Java开发中,处理ZIP压缩文件是一项常见的任务。zip4j库作为一个强大的工具,为开发者提供了便捷的方法来读取、写入、创建、添加、提取、更新以及从ZIP文件中删除文件,...

    zip4j-1.3.2

    《深入理解zip4j-1.3.2:Java中高效处理ZIP文件的库》 在Java编程领域,处理文件压缩和解压缩是一项常见的任务,其中zip4j库以其高效和易用性受到广大开发者的青睐。zip4j-1.3.2是该库的一个版本,它提供了一套全面...

    ZIP4J压缩包加密解密

    ZIP4J是一个专门为Java设计的库,它提供了对ZIP文件格式的全面支持,包括压缩、解压缩以及加密和解密功能。本篇文章将深入探讨ZIP4J库在ZIP文件加密解密中的应用。 ZIP4J是一个开源的Java库,它允许开发者方便地...

    zip4j--Java操作zip压缩文件接口

    Java操作zip压缩格式的开源项目,功能强大而且使用方便,能完全满足Java操作Zip压缩文件,官方网址为:http://www.lingala.net/zip4j/ 可以下载到jar包、源码和示例,好像没有提供API文档。 不过需要使用代理访问...

    基于zip4j开源框架实现android解压带有密码的zip文件(进度条显示)

    对于这种需求,可以使用各种库,其中`zip4j`是一个流行的开源框架,它提供了方便的API来处理ZIP文件,包括设置密码和显示进度条等功能。本文将详细介绍如何使用`zip4j`在Android上实现解压带有密码的ZIP文件以及展示...

    zip4j官方例子

    # Zip4j官方例子详解 Zip4j是一个强大的Java库,用于处理.zip文件。它提供了丰富的功能,包括创建、读取、更新、删除.zip文件,以及设置密码保护等。在这个官方例子中,我们将深入理解如何利用Zip4j进行各种操作。 ...

    zip4j 源码

    《深入解析zip4j源码》 zip4j是一款用Java编写的开源库,主要用于处理ZIP文件,包括创建、解压、加密以及管理ZIP文件内容等操作。它以其易用性和灵活性在Java开发者中广受欢迎。本文将深入探讨zip4j的源码,揭示其...

    android 解压 zip4j

    在Android平台上进行文件操作时,有时我们需要对ZIP格式的压缩包进行解压,这时可以借助第三方库如`zip4j`。`zip4j`是一个强大的Java库,它提供了全面的功能来处理ZIP文件,包括创建、读取、更新、删除ZIP文件以及解...

    zip4j-1.3.2.zip

    《深入理解Java ZIP4J库:使用1.3.2版本进行文件压缩与解压缩》 ZIP4J是一个流行的Java库,它为开发者提供了一种简单、高效的手段来处理ZIP文件。在标题“zip4j-1.3.2.zip”中,我们看到的是这个库的一个特定版本...

    zip4j 1.3.1

    1. **创建ZIP文件**:zip4j允许开发者通过简单的调用,创建新的ZIP文件,并且能够同时添加多个文件和目录。 2. **添加和删除文件**:用户可以方便地向已存在的ZIP文件中添加新文件或删除不需要的文件,无需解压整个...

    zip4j_1.3.2

    包含 最新的zip4j_1.3.2.jar包,例子及API文档。 希望大家在对zip文件操作时有所帮助。 官网地址 http://www.lingala.net/zip4j/ Key features: Create, Add, Extract, Update, Remove files from a Zip file ...

    zip4j使用指南以及使用优化

    **Zip4J使用指南及优化** Zip4J是一款强大的Java库,用于处理ZIP文件,它提供了创建、读取、更新和解压缩ZIP文件的功能。在本文中,我们将深入探讨Zip4J的使用方法,以及如何对其进行优化以提高性能。 ### 1. 安装...

    zip4j-1.3.2-source

    用于Java 的 zip 解压,压缩、加密压缩工具类,zip 4j-1.3.2 源码

    zip4j 源代码

    《深入解析zip4j:Java中的高效压缩与加密库》 在Java开发中,处理压缩文件是一项常见的任务,其中zip4j是一个强大的开源库,它提供了便捷的API用于压缩、解压缩以及对ZIP文件进行加密和解密。本文将详细探讨zip4j...

    zip4j相关jar包(zip4j-1.3.2.jar)

    《深入理解zip4j:Java Web中的高效压缩与加密库》 在Java Web开发中,数据的压缩和加密是常见的需求,例如为了减小文件传输的大小,提高网络效率,或者保护敏感信息的安全。zip4j是一个强大的Java库,专为处理ZIP...

    基于zip4j的压缩工具

    【基于zip4j的压缩工具】是一个用于处理ZIP文件的Java库,它提供了丰富的功能,使得在Java程序中创建、读取、修改和管理ZIP文件变得简单易行。该工具的核心特性包括多文件合并压缩、目录树压缩以及对字符集和密码...

    zip4j_examples_eclipse_1.3.2

    《使用zip4j进行文件压缩与解压:深入解析zip4j_examples_eclipse_1.3.2》 在IT行业中,数据的压缩与解压是日常工作中常见的一项任务,尤其是在处理大量文件时。zip4j是一个强大的Java库,专为处理.zip文件而设计,...

    Java压缩解压ZIP之Zip4j

    Java中的压缩和解压操作是常见的文件处理任务,Zip4j是一个非常实用的Java库,专为处理ZIP文件而设计。这个库提供了丰富的API,使得开发者可以方便地创建、读取、更新和解压ZIP文件。这篇博客文章“Java压缩解压ZIP...

Global site tag (gtag.js) - Google Analytics