`
jiagyao
  • 浏览: 99216 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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;
    }

分享到:
评论
1 楼 yanbin0830 2012-03-21  
繁体在liunx下,压缩解压完之后还是会出现乱码。可以试试

相关推荐

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

    本文将深入探讨如何使用ZipOutputStream进行文件压缩,并解决可能出现的乱码问题。 首先,我们来看`ZipOutputStream`的基本用法。这个类继承自`FilterOutputStream`,提供了创建ZIP文件的功能。以下是一个简单的...

    Java中压缩与解压--中文文件名乱码解决办法

    尤其是在Windows系统下,文件名通常采用GB2312或GBK编码,而Java中的`ZipInputStream`和`ZipOutputStream`类默认使用的是Unicode编码,这种编码差异导致了中文文件名在压缩与解压过程中的乱码现象。 #### 二、解决...

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

    总之,"zip库(解决文件名中文乱码问题).zip" 是一个专门为C++开发的、修复了中文文件名乱码问题的ZIP操作库。它提供了方便的API接口,使得开发者能够在处理中文文件名时更加得心应手,避免了编码转换带来的困扰。...

    ICSharpCode.SharpZipLib压缩解决中文乱码dll和代码

    在处理包含中文字符的压缩文件时,如果编码设置不正确,可能会导致解压缩后的文件出现乱码。这是因为不同的编码方式对非ASCII字符的表示方式不同,如GBK和UTF-8。当压缩或解压缩时,如果不指定正确的编码,程序可能...

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

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

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

    2. 创建一个`ZipOutputStream`,并将其关联到一个输出流,例如`FileOutputStream`,这样我们可以通过这个`ZipOutputStream`将压缩后的数据写入一个新的ZIP文件。 3. 使用`ZipOutputStream`的`putNextEntry`方法来...

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

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

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

    中文乱码问题在很多编程场景下都是一个棘手的问题,尤其是在处理文件名或路径名时。在ZIP格式中,如果编码方式不正确,可能会导致中文字符显示为问号或者其他不可读的字符。`ZipUtil`类通过正确设置编码,如UTF-8,...

    java解决压缩中文乱码

    因此,如果源文件包含中文字符且这些字符不是默认字符集的一部分,压缩后解压时就可能出现乱码。 解决这个问题的一种方法是自定义`DeflaterOutputStream`和`InflaterInputStream`,覆盖它们的`write`方法,确保使用...

    解决Java原生压缩组件不支持中文文件名乱码的问题

    解决Java原生压缩组件不支持中文文件名乱码的问题 Java原生压缩组件不支持中文文件名...通过使用Apache的ant压缩组件和设置编码为GBK,可以正确地压缩中文文件名,解决了Java原生压缩组件不支持中文文件名乱码的问题。

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

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

    Java处理中文文件名-压缩中文名字的文件.rar

    Windows通常使用GBK或UTF-8,而Unix/Linux系统更倾向于UTF-8。因此,当你创建、读取或写入包含中文字符的文件名时,必须确保正确的编码被用于转换。 在Java中,`java.nio.file`包提供了处理文件名的API,如`Path`和...

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

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

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

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

    压缩工具类改良版(解决中文乱码)

    本项目名为“压缩工具类改良版(解决中文乱码)”,它专注于解决使用`ZipEntry`进行文件压缩时遇到的中文乱码问题。这个问题通常是由于字符编码不兼容导致的,特别是当默认编码与文件或系统使用的编码不一致时。这里...

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

    Java在处理包含中文字符的压缩文件时,可能会遇到中文乱码的问题。这主要涉及两个方面:内容的中文乱码和压缩文件注释的中文乱码。以下是对这两个问题的详细解释以及解决方法。 1. 内容的中文乱码问题: 当Java...

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

    描述中提到的“解决ZipOutputStream压缩包内中文文件名乱码的问题,setEncoding("GBK")”,揭示了一个关键点:在使用`ZipOutputStream`创建包含中文文件名的Zip文件时,我们需要指定正确的字符编码。默认情况下,`...

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

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

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

    在Java编程中,处理包含中文字符的文件进行压缩时,可能会遇到中文乱码的问题。这是因为Java标准库的`java.util.zip`包在处理非ASCII字符时可能存在不兼容性,尤其是在某些编码环境下。为了解决这个问题,我们可以...

    安卓文件下载上传解压相关-javaandroidzip解压缩解决压缩中文乱码问题).rar

    本文将深入探讨如何使用Java在Android环境中处理这些任务,特别是解决中文文件名在压缩和解压缩过程中可能出现的乱码问题。 首先,让我们关注文件的下载和上传。在Android中,我们可以使用`java.net.URL`和`java...

Global site tag (gtag.js) - Google Analytics