java对於文字的编码是以 unicode为基础,因此,若是以ZipInputStream及ZipOutputStream来处理压缩及解压缩的工作,碰到中文档名或路径,那当然是以unicode来处理罗!但是,现在市面上的压缩及解压缩软体,例如winzip,却是不支援unicode的,一碰到档名以unicode编码的档案,它就不处理。 那要如何才能做出让WinRar能够处理的压缩档呢?那就得从修改ZipInputStream及ZipOutputStream对於档名的编码方式来着手了。我们可以从jdk的src.zip取得ZipInputStream及ZipOutputStream的原始码来加以修改
一、ZipOutputStream.java
1.从jdk的src.zip取得ZipOutputStream.java原始码,另存到一个新文件中,档名改为CNZipOutputStream.java。
2.开始修改原始码,将class名称改为CNZipOutputStream
3.建构式也必须更改为CNZipOutputStream
4.新增member,这个member记录编码方式
private static String encoding="UTF-8";
5.再新增一个建构式(这个建构式可以让这个class在new的时候,设定档名的编码)
public CNZipOutputStream(OutputStream out,String encoding) {
this(out);
this.encoding=encoding;
}
6.getUTF8Bytes(String a)方法的最前面加上如下代码
try{
if (s!=null&&s!=""&&!encoding.toUpperCase().equals("UTF-8")){
return s.getBytes(encoding);
}
}catch(Exception byteE){
}
二、ZipInputStream.java
1.从jdk的src.zip取得ZipInputStream.java原始码,另存到一个新文件中,档名改为CNZipInputStream.java。
2.开始修改原始码,将class名称改为CNZipInputStream
3.建构式也必须更改为CNZipInputStream
4.新增member,这个member记录编码方式
private static String encoding="UTF-8";
5.再新增一个建构式如下(这个建构式可以让这个class在new的时候,设定档名的编码)
public CNZipInputStream(InputStream in,String encoding) {
this(in);
this.encoding=encoding;
}
6.找到getUTF8String方法,在方法最前面加上如下代码:
try{
if (b!=null&&!encoding.toUpperCase().equals("UTF-8")){
return new String(b,0,len,encoding);
}
}catch(Exception byteE){
}
还是使用java.util.zip包,然后编译。以上两个档案储存後compile产生CNZipOutputStream.class及CNZipInputStream.class,使用winzip开启 [java_home]\jre\lib\rt.jar这个档案,将CNZipOutputStream.class及 CNZipInputStream.class加进去,以後当压缩及解压缩时有中文档名及路径的问题时,就可以指定编码方式来处理了。
使用方法:
CNZipOutputStream zos=new CNZipOutputStream(OutputStream os,String encoding);
CNZipInputStream zins=new CNZipInputStream(InputStream ins,String encoding);
对于前面文章中文件打包下载中遇到的中文文件问题,解决手法是:
OutputStream os = response.getOutputStream();
CNZipOutputStream zos = new CNZipOutputStream(os,"gbk"); //加上中文编码类型
分享到:
相关推荐
在IT行业中,文件的压缩和解压是一项...总的来说,理解和掌握文件压缩和解压的原理,以及处理中文乱码的方法,对Java开发者来说至关重要,这能够帮助他们有效地处理各种文件操作需求,尤其是涉及到多语言环境的时候。
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...
在Java编程中,处理文件压缩和解压是常见的任务,特别是使用ZIP格式。然而,当涉及到包含中文字符的文件或目录时,可能会遇到乱码问题。这个问题主要源于字符编码的不一致,通常需要正确设置字符集来确保中文字符在...
本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...
总的来说,解决Java压缩中文乱码问题的关键在于正确处理文件名的编码,确保使用UTF-8编码,并在必要时自定义压缩和解压缩流。通过上述方法,即使不依赖第三方库,也可以在Java程序中实现对中文文件名的完美支持。
总之,`ZipUtil`文件压缩工具类通过结合`ZipEntry`和`ZipOutputStream`,提供了一种高效且健壮的解决方案,尤其适合处理包含中文字符的文件和目录,确保在压缩和解压过程中不会出现乱码问题。这对于需要在Java应用...
本文将深入探讨如何在不解压的情况下直接读取ZIP文件,并特别关注如何处理包含中文文件名和内容乱码的问题。我们将以支付宝对账单为例,因为这类文件通常包含大量敏感和重要的财务信息,正确地读取和解析它们至关...
本文将详细讲解如何使用Java来解压和压缩tar包,同时解决在处理中文文件名时可能出现的乱码问题,主要关注`javatar-2.5.jar`库中的功能以及`TarUtil.java`类的应用。 首先,`javatar-2.5.jar`是一个专门用于处理tar...
在IT行业中,文件压缩是一种常见的数据存储和传输方式,ZipOutputStream是Java标准库中的一个类,用于将数据流写入ZIP格式的压缩文件。本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码...
在Java编程中,`ZipInputStream`是用于读取和解压ZIP格式的压缩文件的核心类。然而,正如标题和描述中指出的,当ZIP文件包含带有中文文件名的条目时,使用`ZipInputStream`进行解压可能会遇到问题。这个问题通常表现...
- **重命名文件**:如果只是个别文件名乱码,可以尝试先在压缩包内重命名文件,使用英文或无争议的字符,再进行解压。 - **使用支持Unicode的压缩工具**:例如7-Zip,它在创建和解压ZIP文件时,默认使用UTF-8编码...
* @param zipFileName 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名 * @param relativePath 相对路径,默认为空 * @param directory 文件或目录的绝对路径 * void */ ...
用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。
总之,解决Java压缩ZIP文件中文乱码问题的关键在于使用支持设置编码的第三方库,并在处理中文内容和注释时明确指定正确的字符编码。这样,无论在何种编码环境中,都能确保中文字符正确无误地被压缩和解压。
总之,解决ZIP解压缩乱码的关键在于正确识别和处理文件名的编码。通过选择合适的解压工具、手动指定编码、编写自定义脚本等方式,我们可以有效地避免或解决乱码问题,提高工作效率。在日常工作中,养成良好的编码...
在本例中,虽然没有具体的压缩包子文件的文件名称列表,但上述解决方案适用于任何包含中文文件名的ZIP文件。通过遵循这些最佳实践,你可以在Java环境中成功地解压和处理包含非ASCII字符的压缩文件。
在Java编程中,对文件进行压缩是一个常见的任务,这通常涉及到使用`ZipOutputStream`类。`ZipOutputStream`是Java标准库中的一个类,它继承自`FilterOutputStream`,用于创建ZIP格式的压缩文件。当我们使用这个类...
本文将深入探讨如何使用Java在Android环境中处理这些任务,特别是解决中文文件名在压缩和解压缩过程中可能出现的乱码问题。 首先,让我们关注文件的下载和上传。在Android中,我们可以使用`java.net.URL`和`java...