对于Java本身,很多功能都会遭到大家的质疑,但是真的是Java本身做的不好么? 我想应该不是的。
对于Java自身自带的压缩文件操作来说,最大的弊端应该就是对中文的不支持,所以很多人都会去选择apache公司提供的。然而apache公司提供的同样也有语言问题。但Java自身的就不会。
在我去网上找过相关的资料,发现除了使用apache的之外,还有去修改源码,而修改源码这种方式,对于很多新手来说,是非常头痛的事情。那就没有解决方式了么?
在最近做项目的时候,正好就用到这个压缩文件的操作,倒是解决了个别语言乱码的问题。(当然,肯定不是通过修改源码,也不是通过apache)。
因为我用的是jdk1.7的,所以我就用1.7的来说。
先说一下,我当时要做的功能:
我的功能能就是用户批量上传一大堆的压缩包,然后我通过后台再开一个线程去解析上传的压缩文件,在不解压的情况下,将压缩包中的数据读出来,并将压缩包中需要上传的文件上传到服务器。
功能不麻烦,但唯一不能确定的是压缩包中的文件是否是中文命名,如果是中文命名,用java自身自带的zipInputStream就会报错。
通过查看源码,我发现在ZipInputStream中,有两个构造方法:
public ZipInputStream(InputStream in) { this(in, StandardCharsets.UTF_8); } public ZipInputStream(InputStream in, Charset charset) { super(new PushbackInputStream(in, 512), new Inflater(true), 512); usesDefaultInflater = true; if(in == null) { throw new NullPointerException("in is null"); } if (charset == null) throw new NullPointerException("charset is null"); this.zc = ZipCoder.get(charset); }
期初我用的是第一个,也就是只传了一个inputStream进去。但是当报错失败的时候,发现这个构造方法,默认我们的编码为"UTF-8"。那期初我就很费解,我从页面端传递,到数据库所有都统一是"UTF-8"。并且,我的其他上传用"UTF-8"也成功解决了中文问题,那为何这个就不可以呢?
在我通过使用第二个构造方法时通过:
ZipInputStream zip = new ZipInputStream(in,StandardCharsets.UTF-8);
的方式将UTF-8给传入进去,结果一样的, 当然,这个是意料之中的。(StandardCharsets是Java自身提供的)。
那我的想法是,既然有提供可以自定义编码,那我一个个尝试一下看看?
期初,我是想通过设置为"GBK"的方式,
但是,我发现StandardCharsets这个类提供的编码很少:
public static final Charset US_ASCII = Charset.forName("US-ASCII"); public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); public static final Charset UTF_8 = Charset.forName("UTF-8"); public static final Charset UTF_16BE = Charset.forName("UTF-16BE"); public static final Charset UTF_16LE = Charset.forName("UTF-16LE"); public static final Charset UTF_16 = Charset.forName("UTF-16");
这让我很失望,因为这里面,我能联系到解决中文的方式只有UTF-8。
不过,我很好奇,因为我想不透为何Java只给我们提供考了这几种编码?难道是考虑不周详?
有这个想法后,我就想试试看Java给我们留这几个编码的用意。
"ASCII"码很容易理解,我也感觉也许会把这个流默认读成"ASCII"码呢?
但是,试过之后发现不行,仍然过不了,依然报错。
那就一个一个试一下看看呗。
奇迹来了,在我使用"ISO-8859-1"的时候居然通过了。
然后,我将通过"ISO-8859-1"转化过来的乱码再次转换,以恢复到以前的汉字状态,这样我就能知道zipInputStream流默认的是什么编码了
在我通过new String的方式来转化的时候,发现只有在转化为"GBK"的时候才能显示原来的汉字状态。
那我就大概明白这个问题了。
然后,我就修改自己的代码:
zipFile = new ZipFile(filePath,StandardCharsets.ISO_8859_1); InputStream in = new BufferedInputStream(new FileInputStream(filePath)); //转化为iso_8859_1,保证zip.getNextEntry()能够通过 ZipInputStream zip = new ZipInputStream(in,StandardCharsets.ISO_8859_1); ZipEntry zipEntry; while ((zipEntry = zip.getNextEntry()) != null) { //判断是否为目录条目,此处不用操作。 if(zipEntry.isDirectory()){ }else{ //获取文件名(此文件名会包含路径) String fileName1 = zipEntry.getName(); //此文件名是真正的文件名 String fileName2 = getFileNameByFilePath(fileName1); System.out.println(fileName2.toString()); } }
将流转为”ISO-8859-1“后,让其顺利通过zip.getNextEntry(),
如果要保存压缩包中文件的真实名字的话,就可以通过
byte[] b = fileName2.getBytes("ISO_8859_1"); new String(b,"GBK");
来获取原来的名字。
相关推荐
java压缩文件成zip实现无乱码 内置类与jar包
解决java压缩zip文件时的中文乱码问题 实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。 使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码...
网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...
使用java压缩也解压zip文件方法,解决中文乱码问题。使用java自带的压缩解压算法,会出现中文乱码问题。使用apache io的zip包,有效解决该问题。Ant的压缩解压,也是使用该类。
主要介绍了java压缩zip文件中文乱码问题的解决方法,需要的朋友可以参考下
解决android 自带zip解压缩中文乱码的问题,导入zip.jar即可使用(与系统提供的用法相同),大小仅24k
在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...
这几天做一个操作docx的文档的功能,Apache的POI功能有限,就参考了相关资料写的一个Java压缩和解压zip文件的工具类。全部使用的是Java自带的类库,中文的文件名会有乱码的问题。
解决java压缩中文乱码,java.util.zip中不支持中文,通过该代码进行修改即可支持中文,不用第三方插件
ZipOutputStream 压缩 乱码
java中使用ZipEntry对文件目录下的所有文件进行压缩,已解决中文乱码问题,亲测可用,请放心下载。
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。
CompresszZipFile 中带是 zip解压 ZipFileUtil 是文件的压缩 和rar的解压
在Java中通过ZipFile解析Android apk 压缩文件,获取版本号等信息,获取的manifest文件格式无法识别为xml,导致无法解析,该jar文件用来处理乱码文件,apk压缩文件解压缩乱码问题
zip,然后下载删除源文件与压缩文件。 3、可以指定文件都为最后生成为zip文件下载,且删除源文件。 1、压缩文件或者目录(只是压缩不删除):zipFileOrDirectory 2、程序自动判断如果是文件那么就是源文件下载,...
时间紧迫,暂时存在中文文件夹名称乱码问题 不影响文件夹内各类型文件内容 实现方法见功能说明txt文档,只需传入文件夹路径,Zip文件路径,密码 本人JAVA实习生,因业务需求研究此方法,代码质量不高,只为了...
* 描述:压缩/解压缩zip包处理类 * 创建者:XXX * 创建日期:2015年5月7日 - 下午1:35:02 * 版本: V0.1 * 修改者: * 修改日期: */ public class ZipUtil { /** * * ...
zip解压缩乱码的解决方案,解决常见字符串乱码的问题,特点:易上手,可二次开发和封装.
使用java压解有中文字符的文件乱码,apache项目中的ant.jar包可完美解决此问题,代码是用eclipse项目,项目下有ant.jar包,使用前请把ant.jar包导入.