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文件:

相关文章
|
存储 SQL 关系型数据库
你对MySQL的int(11)真的了解吗?
首先,需要明确的是,int(3)和int(11)都是表示整数类型,而不是定义整数的存储长度。在MySQL中,INT类型占据4个字节(32位),可以存储范围是-2^31到2^31-1(约-2.1亿到2.1亿),这个范围是固定的,不受括号中数字的影响。
1052 3
你对MySQL的int(11)真的了解吗?
|
机器学习/深度学习 人工智能 测试技术
11种开源即插即用模块汇总 !!(附论文和代码)
11种开源即插即用模块汇总 !!(附论文和代码)
977 1
|
机器学习/深度学习 物联网 开发者
秒级生图,SDXL-turbo、LCM-SDXL魔搭社区最佳实践
最近一个月,快速生图成为文生图领域的热点,其中比较典型的两种方式的代表模型分别为SDXL-turbo 和 LCM-SDXL。
|
消息中间件 容器
【MQ系列】查看RabbitMQ的版本号
如果上述报错,则试试下面的方法。
1954 0
【MQ系列】查看RabbitMQ的版本号
|
存储
在Arduino中使用数学库
在Arduino中使用数学库,可以通过包含`&lt;math.h&gt;`头文件来访问一系列数学函数,如sin、cos、tan等。使用这些函数前需确保已正确引入库,并了解各函数参数与返回值类型,以便进行精准的数学运算。
|
人工智能 自然语言处理 算法
AI 对研发流程的变革
AI编程助手通过自然语言生成代码、解释复杂算法、优化代码等,极大提升了开发效率与代码质量。开发者可利用通义灵码进行代码解释、生成注释及单元测试,简化开发流程。在需求分析、设计、编码、测试到部署的全流程中,AI助手表现优异,尤其在编码和测试阶段显著提高工作效率。尽管目前AI助手在需求分析方面尚需改进,但其未来发展潜力巨大,有望逐步替代部分人力工作。体验地址:[阿里云智能编码](https://www.aliyun.com/solution/tech-solution/intelligent-coding)。
|
Prometheus Cloud Native 调度
Sentinel 新版本发布,提升配置灵活性以及可观测配套
Sentinel 新版本发布,提升配置灵活性以及可观测配套
1736 110
|
Web App开发 数据可视化 前端开发
Pixi入门第一章:绘制一个小精灵
这篇文章是关于Pixi.js的入门教程第一部分,指导读者如何创建并显示一个基本的2D精灵,适用于开始学习Pixi.js进行2D图形开发的初学者。
539 0
Pixi入门第一章:绘制一个小精灵
|
机器学习/深度学习 并行计算 Android开发
Int8量化算子在移动端CPU的性能优化
Int8量化算子在移动端CPU的性能优化
683 0