对于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中,`java.util.zip`包提供了对ZIP文件的基本操作,但默认使用的是平台默认的字符集,这可能在跨平台操作时引发乱码问题。 为了解决这个中文乱码问题,我们需要在创建ZipEntry时指定合适的字符集,通常是UTF-...
解决java压缩zip文件时的中文乱码问题 实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。 使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码...
在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...
网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...
在Android开发中,处理压缩文件是一项常见的任务,尤其...这是一个轻量级且高效的方法,对于处理跨平台的压缩文件问题尤其有用。在实际开发中,我们应该始终关注字符编码问题,确保在各种环境下数据的正确性和一致性。
当需要向已存在的ZIP文件追加文件时,首先使用`ZipUtil`解压缩ZIP文件到一个临时目录,然后在该目录中添加新的文件,最后重新压缩整个目录并覆盖原有的ZIP文件。以下是大致的步骤: - 使用`ZipUtil`的`unzip`方法...
总之,解决Java压缩ZIP文件中文乱码问题的关键在于使用支持设置编码的第三方库,并在处理中文内容和注释时明确指定正确的字符编码。这样,无论在何种编码环境中,都能确保中文字符正确无误地被压缩和解压。
本篇文章将详细探讨如何使用Java内置的类库来实现ZIP文件的压缩和解压缩,以及解决中文文件名出现乱码的问题。 首先,我们要了解Java中处理ZIP文件的核心类:`java.util.zip.ZipOutputStream` 和 `java.util.zip....
在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...
总的来说,使用Java的`ZipOutputStream`进行文件压缩时,必须注意文件名和路径的正确编码,以避免乱码问题。通过使用合适的编码方式(如UTF-8)并在`ZipOutputStream`构造函数中明确指定,可以确保在跨平台操作时...
在IT行业中,文件压缩是一种常见的数据存储和传输方式,ZipOutputStream是Java标准库中的一个类,用于将数据流写入ZIP格式的压缩文件。本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码...
解压缩ZIP文件则可以使用`org.apache.commons.compress.archivers.zip.ZipArchiveInputStream`类。同样,我们需要设置正确的编码来正确读取中文文件名: ```java import org.apache.commons.compress.archivers.zip...
这里我们关注的是“文件解压和压缩”以及处理“中文乱码”的问题。在Java编程语言中,提供了多种库和工具来处理这些问题。 首先,`CompresszZipFile`是一个可能的自定义类或方法,它专门用于处理ZIP文件的解压。在...
以下将详细阐述如何解决Java压缩中文乱码问题。 首先,我们要理解为什么会出现乱码。在Java中,`java.util.zip`类库使用的是默认的平台字符集,而不是通用的Unicode(UTF-8)编码。因此,如果源文件包含中文字符且...
在Java编程中,处理压缩文件,如ZIP格式,是一项常见的任务。然而,当ZIP文件包含中文文件名时,可能会遇到解压失败的问题。这主要源于字符编码不匹配或处理方式不当。本文将深入探讨这个问题,并提供解决方案。 ...
此外,`ZipUtil`类可能还包含其他实用功能,比如解压缩ZIP文件,检查ZIP文件是否存在中文乱码,或者提供配置选项以自定义压缩级别、是否保留原文件的最后修改时间等。 总之,`ZipUtil`文件压缩工具类通过结合`Zip...
此外,如果你在其他Java压缩库或API中遇到类似问题,可以考虑采用类似的方法,即明确指定编码方式,比如在使用`java.util.zip`时,可以使用`ZipOutputStream`的`setEncoding()`方法来指定编码。但是,通常情况下,...
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
然而,当我们在解压缩ZIP文件时,有时会遇到“乱码”的问题,这通常是由于编码不兼容或者设置不当导致的。本文将深入探讨ZIP解压缩乱码的解决方案,帮助你解决这个问题。 1. **理解字符编码** - 字符编码是计算机...
解决 Java 压缩文件乱码问题可以通过使用 Apache 的开源类库 ZipOutputStream 和 ZipEntry,设置编码方式为 gbk,使用 setEncoding 方法设置压缩文件的注释编码方式为 gbk,从而解决中文乱码问题。