使用JAVA解压加密的中文ZIP压缩包

近来项目中需要对ZIP压缩包解压,然后将解压后的内容存放到指定的目录下。

该压缩包的特性:

  1. 使用标准的zip压缩格式(压缩算法没有深入探究)
  2. 压缩包中带有目录并且目录名称是中文
  3. 压缩时加了密码

因为jre中自带的java.util.zip.*包不支持中文及加密压缩,所以选择使用zip4j包。

下面是解压的实现代码:

 1 public class UnZip {
 2     private final int BUFF_SIZE = 4096;
 3     
 4     /*
 5     获取ZIP文件中的文件名和目录名
 6     */
 7     public void getEntryNames(String zipFilePath, String password){
 8         List<String> entryList = new ArrayList<String>();
 9         ZipFile zf;
10         try {
11             zf = new ZipFile(zipFilePath);
12             zf.setFileNameCharset("gbk");//默认UTF8,如果压缩包中的文件名是GBK会出现乱码
13             if(zf.isEncrypted()){
14                 zf.setPassword(password);//设置压缩密码
15             }
16             for(Object obj : zf.getFileHeaders()){
17                 FileHeader fileHeader = (FileHeader)obj;
18                 String fileName = fileHeader.getFileName();//文件名会带上层级目录信息
19                 entryList.add(fileName);
20             }
21         } catch (ZipException e) {
22             e.printStackTrace();
23         }
24         return entryList;
25     }
26 
27     /*
28     将ZIP包中的文件解压到指定目录
29     */
30     public void extract(String zipFilePath, String password, String destDir){
31         InputStream is = null;
32         OutputStream os = null;
33         ZipFile zf;
34         try {
35             zf = new ZipFile(zipFile);
36             zf.setFileNameCharset("gbk");
37             if(zf.isEncrypted()){
38                 zf.setPassword(PASSWORD);
39             }
40             
41             for(Object obj : zf.getFileHeaders()){
42                 FileHeader fileHeader = (FileHeader)obj;
43                 String destFile = destDir + "/" + fileHeader.getFileName();
44                 if(!destFile.getParentFile().exists()){
45                     destFile.getParentFile().mkdirs();//创建目录
46                 }
47                 is = zf.getInputStream(fileHeader);
48                 os = new FileOutputStream(destFile);
49                 int readLen = -1;
50                 byte[] buff = new byte[BUFF_SIZE];
51                 while ((readLen = is.read(buff)) != -1) {
52                     os.write(buff, 0, readLen);
53                 }
54             }
55         }catch(Exception e){
56             e.printStackTrace();
57         }finally{
58             //关闭资源
59             try{
60                 if(is != null){
61                     is.close();
62                 }
63             }catch(IOException ioe){}
64             
65             try{
66                 if(os != null){
67                     os.close();
68                 }
69             }catch(IOException ioe){}
70         }
71     }
72 }

 

以上代码未经测试,仅作为伪代码参考

转载于:https://www.cnblogs.com/shenhuiqi/p/7309181.html

压缩文件方法 该方法需要引用zip4j的jar文件 单个文件、多个文件压缩 /** * 使用给定密码压缩指定文件或文件夹到指定位置. * * dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者"". * 如果传null或者""则将压缩文件存放在当前目录,即跟源文件同目录,压缩文件名取源文件名,以.zip为后缀; * 如果以路径分隔符(File.separator)结尾,则视为目录,压缩文件名取源文件名,以.zip为后缀,否则视为文件名. * @param src 要压缩的文件或文件夹路径 * @param dest 压缩文件存放路径 * @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效. * 如果为false,将直接压缩目录下文件到压缩文件. * @param passwd 压缩使用的密码 * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. */ 方法详细见文件! 可选择文件list压缩 /** * 使用给定密码压缩指定文件list * dest可传最终压缩文件存放的绝对路径,也可以传存放目录,也可以传null或者"". * 如果传null或者""则将压缩文件存放在当前目录,即跟源文件同目录,压缩文件名取源文件名,以.zip为后缀; * 如果以路径分隔符(File.separator)结尾,则视为目录,压缩文件名取源文件名,以.zip为后缀,否则视为文件名. * @param src 要压缩的文件集合 * @param dest 压缩文件存放路径 * @param isCreateDir 是否在压缩文件里创建目录,仅在压缩文件为目录时有效. * 如果为false,将直接压缩目录下文件到压缩文件. * @param passwd 压缩使用的密码 * @return 最终的压缩文件存放的绝对路径,如果为null则说明压缩失败. */ 方法详细见文件! 解压 /** * 使用给定密码解压指定的ZIP压缩文件到指定目录 * * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 * @param zipFile 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ 方法详细见文件! 一个简单的demo 欢迎大家指点,一起提升
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值