在windows下文件名正常,但部署linux下文件名却出现乱码
搞了一个晚上,知道是编码的问题,网上查到的大致有两种解决方面(好像都不行):
1、修改java.util.zip下对应的类。这个方法改了太麻烦了,而且ant包中的已经有现成的了,而且也没有用(可能是我没改好吧)
2、用ant提供的来代替,把import 里的java.util.zip改成org.apache.tools.zip。这种方法在window下支持中文了,但在linux下还是会乱码。
今天再回头看,只要在第二种方法的情况下为ZipOutputStream对象加一句setEncoding("gbk")就可以了。把自己的理解记下来以便大家遇到相似的问题可以查看,说的有有问题还请指出来哦
解决办法:
原因:org.apache.tools.zip.ZipOutputStream使用的默认编码是系统编码(window是gbk而linux是utf-8),在window下解压时用的是gbk,因些如果是在linux下压缩的文件,到window下解压就会出现乱码,因些在压缩时就为其指定编码为gbk
代码如下:
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
/**
* 多个指定文件压缩Zip文件/目录的方法。
*
* @param inputFileNames
* 需要添加到压缩文件的文件名/目录
* @param outputFileName
* 压缩文件的文件名
*/
public static boolean zipFiles(List inputFileNames, String outputFileName) {
boolean result = true;
try {
ZipOutputStream out = null;
try {
File parent = new File(new File(outputFileName).getParent()); // 得到父文件夹
if (!parent.exists()) {
parent.mkdirs();
}
out = new ZipOutputStream(new FileOutputStream(outputFileName));
out.setEncoding("gbk");//指定编码为gbk,否则部署到linux下会出现乱码
File inputFile = null;
for (Object obj:inputFileNames) {
Object[] input = (Object[])obj;
if(input.length != 2)
continue;
inputFile = new File((String) input[0]);
String fileN = (String)input[1];
zip(out, inputFile, fileN);
}
System.out.println("zip done ");
} catch (Exception e) {
result = false;
} finally {
if (out != null)
out.close();
}
} catch (Exception e) {
result = false;
e.printStackTrace();
}
return result;
}
private static boolean zip(ZipOutputStream out, File file, String base) {
boolean result = true;
try {
if (file.isDirectory()) {
File[] subfiles = file.listFiles();
if (base.length() != 0) {
out.putNextEntry(new ZipEntry(base + File.separator));
base += File.separator;
}
for (int i = 0; i < subfiles.length; i++) {
zip(out, subfiles[i], base + subfiles[i].getName());
}
} else {
String filename = base;//java.net.URLEncoder.encode(base,"UTF-8");
out.putNextEntry(new ZipEntry(filename));
FileInputStream in = new FileInputStream(file);
int b;
System.out.println(filename);
try {
while ((b = in.read()) != -1) {
out.write(b);
}
} catch (Exception e) {
result = false;
} finally {
in.close();
}
}
} catch (Exception e) {
result = false;
}
return result;
}
分享到:
相关推荐
本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码问题。 首先,我们来看`ZipOutputStream`的基本用法。这个类继承自`FilterOutputStream`,提供了创建ZIP文件的功能。以下是一个简单的...
尤其是在Windows系统下,文件名通常采用GB2312或GBK编码,而Java中的`ZipInputStream`和`ZipOutputStream`类默认使用的是Unicode编码,这种编码差异导致了中文文件名在压缩与解压过程中的乱码现象。 #### 二、解决...
总之,"zip库(解决文件名中文乱码问题).zip" 是一个专门为C++开发的、修复了中文文件名乱码问题的ZIP操作库。它提供了方便的API接口,使得开发者能够在处理中文文件名时更加得心应手,避免了编码转换带来的困扰。...
在处理包含中文字符的压缩文件时,如果编码设置不正确,可能会导致解压缩后的文件出现乱码。这是因为不同的编码方式对非ASCII字符的表示方式不同,如GBK和UTF-8。当压缩或解压缩时,如果不指定正确的编码,程序可能...
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
2. 创建一个`ZipOutputStream`,并将其关联到一个输出流,例如`FileOutputStream`,这样我们可以通过这个`ZipOutputStream`将压缩后的数据写入一个新的ZIP文件。 3. 使用`ZipOutputStream`的`putNextEntry`方法来...
这里我们关注的是“文件解压和压缩”以及处理“中文乱码”的问题。在Java编程语言中,提供了多种库和工具来处理这些问题。 首先,`CompresszZipFile`是一个可能的自定义类或方法,它专门用于处理ZIP文件的解压。在...
中文乱码问题在很多编程场景下都是一个棘手的问题,尤其是在处理文件名或路径名时。在ZIP格式中,如果编码方式不正确,可能会导致中文字符显示为问号或者其他不可读的字符。`ZipUtil`类通过正确设置编码,如UTF-8,...
因此,如果源文件包含中文字符且这些字符不是默认字符集的一部分,压缩后解压时就可能出现乱码。 解决这个问题的一种方法是自定义`DeflaterOutputStream`和`InflaterInputStream`,覆盖它们的`write`方法,确保使用...
解决Java原生压缩组件不支持中文文件名乱码的问题 Java原生压缩组件不支持中文文件名...通过使用Apache的ant压缩组件和设置编码为GBK,可以正确地压缩中文文件名,解决了Java原生压缩组件不支持中文文件名乱码的问题。
在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...
Windows通常使用GBK或UTF-8,而Unix/Linux系统更倾向于UTF-8。因此,当你创建、读取或写入包含中文字符的文件名时,必须确保正确的编码被用于转换。 在Java中,`java.nio.file`包提供了处理文件名的API,如`Path`和...
在Java中,`java.util.zip`包提供了对ZIP文件的基本操作,但默认使用的是平台默认的字符集,这可能在跨平台操作时引发乱码问题。 为了解决这个中文乱码问题,我们需要在创建ZipEntry时指定合适的字符集,通常是UTF-...
用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。
本项目名为“压缩工具类改良版(解决中文乱码)”,它专注于解决使用`ZipEntry`进行文件压缩时遇到的中文乱码问题。这个问题通常是由于字符编码不兼容导致的,特别是当默认编码与文件或系统使用的编码不一致时。这里...
Java在处理包含中文字符的压缩文件时,可能会遇到中文乱码的问题。这主要涉及两个方面:内容的中文乱码和压缩文件注释的中文乱码。以下是对这两个问题的详细解释以及解决方法。 1. 内容的中文乱码问题: 当Java...
描述中提到的“解决ZipOutputStream压缩包内中文文件名乱码的问题,setEncoding("GBK")”,揭示了一个关键点:在使用`ZipOutputStream`创建包含中文文件名的Zip文件时,我们需要指定正确的字符编码。默认情况下,`...
* @param zipFileName 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名 * @param relativePath 相对路径,默认为空 * @param directory 文件或目录的绝对路径 * void */ ...
在Java编程中,处理包含中文字符的文件进行压缩时,可能会遇到中文乱码的问题。这是因为Java标准库的`java.util.zip`包在处理非ASCII字符时可能存在不兼容性,尤其是在某些编码环境下。为了解决这个问题,我们可以...
本文将深入探讨如何使用Java在Android环境中处理这些任务,特别是解决中文文件名在压缩和解压缩过程中可能出现的乱码问题。 首先,让我们关注文件的下载和上传。在Android中,我们可以使用`java.net.URL`和`java...