`
张豆包
  • 浏览: 16717 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java压缩zip文件乱码问题

    博客分类:
  • Java
阅读更多

对于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文件解决中文乱码问题

    在Java中,`java.util.zip`包提供了对ZIP文件的基本操作,但默认使用的是平台默认的字符集,这可能在跨平台操作时引发乱码问题。 为了解决这个中文乱码问题,我们需要在创建ZipEntry时指定合适的字符集,通常是UTF-...

    解决java压缩zip文件时的中文乱码问题(包含jar包和工具类)

    解决java压缩zip文件时的中文乱码问题 实现:java压缩文件成zip实现无乱码。 包括:写好的工具类与jar包。 使用方法:导入ant.jar包,调用CompressExcelOperate中的方法,即可实现压缩文件,并保证没有中文乱码...

    java zip压缩解压工具解决中文乱码问题

    在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...

    java zip解压中文乱码问题

    网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...

    java android zip解压缩(解决压缩中文乱码问题)

    在Android开发中,处理压缩文件是一项常见的任务,尤其...这是一个轻量级且高效的方法,对于处理跨平台的压缩文件问题尤其有用。在实际开发中,我们应该始终关注字符编码问题,确保在各种环境下数据的正确性和一致性。

    java压缩zip文件中文乱码问题解决方法

    总之,解决Java压缩ZIP文件中文乱码问题的关键在于使用支持设置编码的第三方库,并在处理中文内容和注释时明确指定正确的字符编码。这样,无论在何种编码环境中,都能确保中文字符正确无误地被压缩和解压。

    基于Java向zip压缩包追加文件

    当需要向已存在的ZIP文件追加文件时,首先使用`ZipUtil`解压缩ZIP文件到一个临时目录,然后在该目录中添加新的文件,最后重新压缩整个目录并覆盖原有的ZIP文件。以下是大致的步骤: - 使用`ZipUtil`的`unzip`方法...

    Java压缩和解压缩zip文件

    本篇文章将详细探讨如何使用Java内置的类库来实现ZIP文件的压缩和解压缩,以及解决中文文件名出现乱码的问题。 首先,我们要了解Java中处理ZIP文件的核心类:`java.util.zip.ZipOutputStream` 和 `java.util.zip....

    解压zip压缩文件,支持多文件目录解压,中文乱码问题

    在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...

    用java对文件进行压缩并且解决乱码问题

    总的来说,使用Java的`ZipOutputStream`进行文件压缩时,必须注意文件名和路径的正确编码,以避免乱码问题。通过使用合适的编码方式(如UTF-8)并在`ZipOutputStream`构造函数中明确指定,可以确保在跨平台操作时...

    ZipOutputStream 压缩文件以及乱码问题解决方案

    在IT行业中,文件压缩是一种常见的数据存储和传输方式,ZipOutputStream是Java标准库中的一个类,用于将数据流写入ZIP格式的压缩文件。本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码...

    java zip文件压缩与解压缩

    解压缩ZIP文件则可以使用`org.apache.commons.compress.archivers.zip.ZipArchiveInputStream`类。同样,我们需要设置正确的编码来正确读取中文文件名: ```java import org.apache.commons.compress.archivers.zip...

    文件解压和压缩 解决中文乱码

    这里我们关注的是“文件解压和压缩”以及处理“中文乱码”的问题。在Java编程语言中,提供了多种库和工具来处理这些问题。 首先,`CompresszZipFile`是一个可能的自定义类或方法,它专门用于处理ZIP文件的解压。在...

    ZipUtil文件压缩工具类(解决中文乱码)

    此外,`ZipUtil`类可能还包含其他实用功能,比如解压缩ZIP文件,检查ZIP文件是否存在中文乱码,或者提供配置选项以自定义压缩级别、是否保留原文件的最后修改时间等。 总之,`ZipUtil`文件压缩工具类通过结合`Zip...

    java解决压缩中文乱码

    以下将详细阐述如何解决Java压缩中文乱码问题。 首先,我们要理解为什么会出现乱码。在Java中,`java.util.zip`类库使用的是默认的平台字符集,而不是通用的Unicode(UTF-8)编码。因此,如果源文件包含中文字符且...

    java压缩(zip)中文问题完美解决

    此外,如果你在其他Java压缩库或API中遇到类似问题,可以考虑采用类似的方法,即明确指定编码方式,比如在使用`java.util.zip`时,可以使用`ZipOutputStream`的`setEncoding()`方法来指定编码。但是,通常情况下,...

    zip解压缩乱码的解决方案

    然而,当我们在解压缩ZIP文件时,有时会遇到“乱码”的问题,这通常是由于编码不兼容或者设置不当导致的。本文将深入探讨ZIP解压缩乱码的解决方案,帮助你解决这个问题。 1. **理解字符编码** - 字符编码是计算机...

    如何解决java压缩文件乱码问题

    解决 Java 压缩文件乱码问题可以通过使用 Apache 的开源类库 ZipOutputStream 和 ZipEntry,设置编码方式为 gbk,使用 setEncoding 方法设置压缩文件的注释编码方式为 gbk,从而解决中文乱码问题。

    java zipentry.jar 解决解压失败问题

    在Java编程中,处理压缩文件,如ZIP格式,是一项常见的任务。然而,当ZIP文件包含中文文件名时,可能会遇到解压失败的问题。这主要源于字符编码不匹配或处理方式不当。本文将深入探讨这个问题,并提供解决方案。 ...

    java 下载文件 压缩且删除源文件(支持文件夹与文件)

    zip,然后下载删除源文件与压缩文件。 3、可以指定文件都为最后生成为zip文件下载,且删除源文件。 1、压缩文件或者目录(只是压缩不删除):zipFileOrDirectory 2、程序自动判断如果是文件那么就是源文件下载,...

Global site tag (gtag.js) - Google Analytics