JAVA中对jar文件或zip文件解压的时候,能够使用JDK内置的API:JarFile和ZipFile,在windows下解压这2种格式文件的时候,常常报下面错误:

Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED
at java.util.zip.ZipCoder.toString(ZipCoder.java:58)
at java.util.zip.ZipFile.getZipEntry(ZipFile.java:531)
at java.util.zip.ZipFile.access$900(ZipFile.java:56)
at java.util.zip.ZipFile$1.nextElement(ZipFile.java:513)
at java.util.zip.ZipFile$1.nextElement(ZipFile.java:483)

出现这样的问题有2种可能:

1、拿到的zip或jar本身就是损坏的,这个时候能够使用winRAR等软件进行解压。

假设没有报错,那么能够证明:拿到的压缩文件是没有问题的。

2、字符集问题,zip或jar中含有中文的文件名称或文件路径。

//windows下自己用winRAR压缩文件
File file = new File("C:/Users/aty/Desktop/demo.zip"); ZipFile zip = new ZipFile(file); Enumeration<? extends ZipEntry> entrys = zip.entries(); while (entrys.hasMoreElements()) {
ZipEntry entry = entrys.nextElement(); System.out.println(entry.getName());
}
zip.close();

在windows下,将名称含有中文的文件或文件夹,用winRAR制作一个demo.zip文件,执行上面代码会发现抛异常。这是由于中文windows环境下,操作系统默认的字符集是GBK,可是ZipFile仅仅能识别UTF-8格式。所以当zip文件里含有中文(但不是UTF-8编码)的时候,java的 ZipFile就会报错。

这个问题在JDK1.7及其之后,解决问题是非常easy的。JDK提供了构造函数,同意我们指定zip文件的字符集。

public ZipFile(String name, Charset charset) throws IOException  

假设在JDK1.6或之前,那么能够使用ant.jar中提供的org.apache.tools.zip.ZipFile,使用方式跟JDK1.7中的ZipFile非常相似。

能够看到JDK1.7中ZipFile同意我们指定字符集,可是JarFile这个类还是固定使用UTF-8格式。

最新文章

  1. 大数据之Oozie——源码分析(一)程序入口
  2. 读书笔记--SQL必知必会06--用通配符进行过滤
  3. 使用session页面控制登录入口及购物车效果的实现
  4. Mysql 该如何 Entity Framework 数据库迁移 和 如何更好的支持EntityFramework.Extended
  5. Java TCP编程
  6. Node.js superagent 采集 URL 编码问题
  7. C# 中关闭当前线程的四种方式 .
  8. bootstrap form
  9. 【转】RTSP协议学习笔记
  10. Kruscal 、 Prime Template
  11. [js高手之路]深入浅出webpack教程系列4-插件使用之html-webpack-plugin配置(上)
  12. HDU 2865 Birthday Toy [Polya 矩阵乘法]
  13. c提高第四次作业
  14. 隔壁老主精讲web页面性能优化。
  15. (三)apache的安装与配置
  16. tfs 禁止多人签出
  17. DOM内容操作和自定义、样式改变
  18. 安装cacti
  19. nginx实现ldap认证
  20. 310. Minimum Height Trees -- 找出无向图中以哪些节点为根,树的深度最小

热门文章

  1. unalias---取消命令别名
  2. Java语言的Hook实现
  3. Android仿Win8界面的button点击
  4. AQS -&gt; AbstractQueuedSynchronizer
  5. Funui-Theme 资源的替换
  6. amazeui的表单开关插件的自定义事件必须添加.bootstrapSwitch 命名空间,给了我们什么启示
  7. mysql中配置ssl_key、ssl-cert、ssl-ca的路径及建立ssl连接(适用于5.7以下版本,5.7及以上请看本文末尾的备注)
  8. 【CS Round #43 C】Rectangle Partition
  9. Java Web学习总结(12)——使用Session防止表单重复提交
  10. 阿里云部署Docker(3)----指令学习