`
jiagyao
  • 浏览: 96017 次
  • 性别: 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 压缩文件以及乱码问题解决方案

    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文件格

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

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

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

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

    解决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条目列表写入输出流,从源文件得到文件输入流,写入缓冲数据等。相关代码:  ...

    zip4j--Java操作zip压缩文件接口

    不过需要使用代理访问,如果读者嫌麻烦那就从这里下载吧,虽然收取3个CSDN积分,但您评论后一般就可以返还积分了,我也需要积分去下载别人的资源,请谅解! 资源包括:jar包、文档、源码和一些官方示例 该项目的...

    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功能比较强大,支持加密、解密压缩,支持文件的添加、删除等。

Global site tag (gtag.js) - Google Analytics