zip压缩解决文件名中文乱码问题-阿里云开发者社区

开发者社区> 开发与运维> 正文

zip压缩解决文件名中文乱码问题

简介:

使用jdk自带的zip工具类Java.util.zip.ZipEntry,java.util.zip.ZipFile,java.util.zip.ZipInputStream,java.util.zip.ZipOutputStream 进行zip压缩时,没法解决文件名中文乱码问题

这里使用apache 旗下的commons-compress 库,官网是:http://commons.apache.org/proper/commons-compress/download_compress.cgi

 

我使用maven 进行构建,pom配置如下:

Xml代码  收藏代码
  1. <dependency>  
  2.             <groupId>org.apache.commons</groupId>  
  3.             <artifactId>commons-compress</artifactId>  
  4.             <version>1.5</version>  
  5.         </dependency>  

 commons-compress 解决了文件名中文乱码问题,参考:http://www.cnblogs.com/un4sure/archive/2011/09/27/2193298.html

范例:

(1)压缩单个文件:

压缩D:\\Temp\\a\\password_密码.xls,压缩后的zip文件是d:\\Temp\\a\\a\\b\\c.zip

Java代码  收藏代码
  1. package com.jn.test;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7.   
  8. import org.apache.commons.compress.archivers.ArchiveException;  
  9. import org.apache.commons.compress.archivers.ArchiveOutputStream;  
  10. import org.apache.commons.compress.archivers.ArchiveStreamFactory;  
  11. import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;  
  12. import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;  
  13. import org.junit.Test;  
  14.   
  15. import com.common.util.SystemUtil;  
  16. import com.io.hw.file.util.FileUtils;  
  17.   
  18. public class ZIPTest {  
  19.   
  20.     @Test  
  21.     public void test_01() {  
  22.         try {  
  23.             FileOutputStream fou = new FileOutputStream("d:\\Temp\\a\\a\\b\\c.zip");  
  24.             ArchiveOutputStream archOuts = new ArchiveStreamFactory()  
  25.                     .createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);  
  26.             if(archOuts instanceof ZipArchiveOutputStream){  
  27.                 ZipArchiveOutputStream zipOut=(ZipArchiveOutputStream)archOuts;  
  28.                 String file="D:\\Temp\\a\\password_密码.xls";  
  29.                 ZipArchiveEntry zipEntry=new ZipArchiveEntry(new File(file),SystemUtil.getFileSimpleName(file));  
  30.                 zipOut.putArchiveEntry(zipEntry);  
  31.                 zipOut.write(FileUtils.readBytes4file(file));  
  32.                   
  33.                 zipOut.closeArchiveEntry();  
  34.                 zipOut.flush();  
  35.                 zipOut.finish();  
  36.             }  
  37.         } catch (FileNotFoundException e) {  
  38.             e.printStackTrace();  
  39.         } catch (ArchiveException e) {  
  40.             e.printStackTrace();  
  41.         } catch (IOException e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.     }  
  45. }  

 运行之后会生成文件d:\\Temp\\a\\a\\b\\c.zip:

 

(1)压缩多个文件:

Java代码  收藏代码
  1. @Test  
  2.     public void test_02() {  
  3.         try {  
  4.             FileOutputStream fou = new FileOutputStream(  
  5.                     "d:\\Temp\\a\\a\\b\\c.zip");  
  6.             ArchiveOutputStream archOuts = new ArchiveStreamFactory()  
  7.                     .createArchiveOutputStream(ArchiveStreamFactory.ZIP, fou);  
  8.             if (archOuts instanceof ZipArchiveOutputStream) {  
  9.                 ZipArchiveOutputStream zipOut = (ZipArchiveOutputStream) archOuts;  
  10.   
  11.                 String file01 = "D:\\Temp\\a\\password_密码.xls";  
  12.                 ZipArchiveEntry zipEntry = new ZipArchiveEntry(  
  13.                         new File(file01), SystemUtil.getFileSimpleName(file01));  
  14.                 zipOut.putArchiveEntry(zipEntry);  
  15.                 zipOut.write(FileUtils.readBytes4file(file01));  
  16.   
  17.                 String file02 = "D:\\Temp\\a\\ccc.jar";  
  18.                 ZipArchiveEntry zipEntry2 = new ZipArchiveEntry(  
  19.                         new File(file01), SystemUtil.getFileSimpleName(file02));  
  20.                 zipOut.putArchiveEntry(zipEntry2);  
  21.                 zipOut.write(FileUtils.readBytes4file(file02));  
  22.   
  23.                 zipOut.closeArchiveEntry();  
  24.                 zipOut.flush();  
  25.                 zipOut.finish();  
  26.             }  
  27.         } catch (FileNotFoundException e) {  
  28.             e.printStackTrace();  
  29.         } catch (ArchiveException e) {  
  30.             e.printStackTrace();  
  31.         } catch (IOException e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.     }  

 压缩后的zip文件:

版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章