`

windows下文件名正常,但linux下用ZipOutputStream压缩后中文文件名乱码

 
阅读更多

在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 压缩文件以及乱码问题解决方案

    NULL 博文链接:https://x1ng-ms.iteye.com/blog/1118908

    zip库(解决文件名中文乱码问题).zip

    从其他网站上下载的库,修改了字符串编码转换的方法,解决中文乱码问题,使用示例可见https://blog.csdn.net/qq_28742901/article/details/116156457

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

    ZipOutputStream 压缩 乱码

    JDK ZipEntry压缩中文文件名乱码解决

    项目中碰到问题.jdk zipEntry 压缩中文文件名乱码  上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项.  第二种 就是拿来主义,因为 开源项目 Ant 里已经有...

    Java ZIP压缩一个或多个文件(解决中文名称乱码).rar

    用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。

    java压缩使用org.apache.tools.zip包解决中文文件名

    使用我自己包,直接放到WEB-INF\classes下解压即可, 在程序中加上 outf.setEncoding("gbk");即可 下面是我的多个文件压缩成一个的压缩,参考 String zipf="D:\\xxx\\xx\\xxb\\xx\\xz.zip"; //---------修改路径---...

    java实现文件解压缩,ZipInputStream,ZipOutputStream

    java实现文件解压缩,ZipInputStream,ZipOutputStream

    org.apache.tools.zip解决解压乱码问题

    * @param zipFileName 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名 * @param relativePath 相对路径,默认为空 * @param directory 文件或目录的绝对路径 * void */ ...

    ava支持的zip压缩和解压缩

    zip扮演着归档和压缩两个角色;gzip并不将文件归档,仅...ZipOutputStream :DeflaterOutputStream的一个子类,把数据压缩成Zip文件格式。 GZIPOutputStream :DeflaterOutputStream的一个子类,把数据压缩成GZip文件格

    ant-1.7.1(org.apache.tools.zip.ZipOutputStream).zip

    解决ZipOutputStream压缩包内中文文件名乱码的问题,setEncoding("GBK")

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

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

    解决java压缩、解压缩含中文字符的文件或文件夹问题

    通过对JDK的java.util.zip下的ZipInputStream和ZipOutputStream类进行改造,彻底解决压缩和解压缩文件时的中文文件名乱码问题。 包含已大好的jar包,以及一个如何使用的Demo程序。

    java解压乱码问题修正

    JAVA中文件压缩引起的乱码问题,是由于Java编码以Unicode 为基础的,所以ZipOutputStream(还有ZipInputStream) 处理压缩工作时,就以Unicode来处理中文。 所以为了能在压缩(或解压)时,不让其产生乱码问题,就得...

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

    使用java压解有中文字符的文件乱码,apache项目中的ant.jar包可完美解决此问题,代码是用eclipse项目,项目下有ant.jar包,使用前请把ant.jar包导入.

    Spring Boot中使用Java实现文件批量下载与压缩功能

    3.初始化输出流和压缩流:通过获取响应输出流和初始化ZipOutputStream来准备将文件写入压缩包。 4.循环处理文件:遍历文件映射关系,对每个文件执行以下步骤: 创建相应的文件夹路径,避免重复创建。 5.对文件名进行...

    Java Zip算法压缩多个文件的例子.rar

    Java Zip算法压缩多个文件的例子,具体的实现原理是:先打开文件并读取,然后利用ZipEntry实例化待压缩的条目列表,将ZIP条目列表写入输出流,从源文件得到文件输入流,写入缓冲数据等。相关代码:  ...

    java压缩目录的类

    java自带的java.util.zip.ZipOutputStream压缩目录时,生成的zip兼容性不是很好。文件格式需转换一下。

    java 压缩类的用法

    压缩的实现比较容易,下面介绍利用ZipEntry、ZipInputStream和ZipOutputStream三个Java 类实现zip数据压缩方式的编程方法。  zip压缩文件结构:一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的 ...

    zip4j-2.4.0.jar

    zip4j功能比较强大,支持加密、解密压缩,支持文件的添加、删除等 使用Java的ZipOutputStream压缩和解压缩文件,在网上找到了zip4j。zip4j功能比较强大,支持加密、解密压缩,支持文件的添加、删除等。

    JAVA文件压缩与解压缩的设计与实现(源代码+论文)

    ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry几个类完成。 ZipOutputStream 实现文件的压缩 ...

Global site tag (gtag.js) - Google Analytics