关于使用java自带ZipOutputStream压缩文件名为中文的乱码问题

摘要

由于业务要求,会对文件系统中部分文件处理打包操作,开始我使用java6自带的api处理,当文件名中带有中时,打包之后的压缩文件会产生中文乱码的问题,后听说java7解决了这一问题,因行业的滞后性我没有做这样的尝试,有兴趣的读者可以自己研究一下。下面提供我的一个解决方案(apache下文件流工具)。

//部分包引入样例
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
public class ZipUtil {
    private static final Logger logger = Logger.getLogger(ZipUtil.class);

    /**
     * 功能:压缩多个文件成一个zip文件
     * @param srcfile:源文件列表
     * @param zipfile:压缩后的文件
     */
    public static boolean zipFiles(File[] srcfile,File zipfile){
        boolean reFlag = false;
        byte[] buf=new byte[10240];
        ZipOutputStream out = null;
        FileInputStream in = null;
        try {
            //ZipOutputStream类:完成文件或文件夹的压缩
            out=new ZipOutputStream(new FileOutputStream(zipfile));
            //注意此处编码设置
            out.setEncoding("gbk");
            for(int i=0;i<srcfile.length;i++){
                in=new FileInputStream(srcfile[i]);
                out.putNextEntry(new ZipEntry(srcfile[i].getName()));
                int len;
                while((len=in.read(buf))>0){
                    out.write(buf,0,len);
                }
                out.closeEntry();
                in.close();
                in = null;
            }
            out.close();
            out = null;
            reFlag = true;
            logger.info("压缩完成,文件详细信息为:"+zipfile.getAbsolutePath());
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            if(in!=null){
                try {
                    in.close();
                    in = null;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(out!=null){
                try {
                    out.close();
                    out = null;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return reFlag;
    }
  }
时间: 2024-12-06 19:10:56

关于使用java自带ZipOutputStream压缩文件名为中文的乱码问题的相关文章

java.util.zip.ZipOutputStream压缩无乱码(原创)

package io; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.zip.Adler32; import java.u

java使用c3p0连接mysql,写中文数据乱码的问题

此文说的乱码,是指所有中文的字符都变成了?. 首先,网上普遍搜索到的解决方案都是告诉你要在数据库连接字符串里面增加编码的定义,完整的连接字符串如下: url="jdbc:mysql://127.0.0.1:3306/anydb?useUnicode=true&characterEncoding=UTF-8" 需要注意的是:这段字符串通常是保存在一段xml结构的配置文件中,比如环境变量文件context.xml中,更完整的配置内容如下: <?xml version=&quo

java基础之zip(压缩、解压)

本程序依赖第三方包Ant.jar.因为java自带的java.utils.zip.ZipOutputStream对一些敏感中文路径会抛出异常. package javax.zip; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Ou

Java对zip格式压缩和解压缩

Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格式),它的设计目标是处理单个的文件.gzip在压缩文件中的数据时使用的就是zlib.为了保存与文件属性有关的信息,gzip需要在压缩文件(*.gz)中保存更多的头信息内容,而zlib不用考虑这一点.但gzip只适用于单个文件,所以我们在UNIX/Linux上经常看到的压缩包后缀都是*.tar.gz或

[源码]ObjectIOStream 对象流 ByteArrayIOStream 数组流 内存流 ZipOutputStream 压缩流

1.对象流 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputS

Java中带包(创建及引用)的类的编译与调试

Java中带包(创建及引用)的类的编译与调试 java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac **.java即可,当程序中有包声明还能简简单单的直接javac **.java吗?答案当然是no,下面举个简单的例子证明一下直接javac **.java会怎么样. 如下:F:\javaweb2班\20160531目录下有A.java文件,注意源文件中有包声明 package mypack; public class A { String name; int age; pu

在Editplus中配置java的(带包)编译(javac)和运行(java)的方法

配置的前提是电脑安装了JDK并且配置好了相关的环境变量(JAVA_HOME,path和classpath). 配置好后在命令行中输入javac和java验证是否配置成功: 如果出现上面的情况则说明配置成功. 首先打开Editplus,打开工具-配置自定义工具(或者使用快捷键Alt+G): 然后点击“组名",将Group 1改为“Java编译与运行”: 然后点击“添加工具”-“程序”: 1添加编译功能 “菜单文字”里的内容修改为“JAVAC”:“命令”选择安装JDK后的BIN目录中的编译程序JAV

Java对byte数组压缩 解压缩 (zip,gzip,bzip2,jzlib)

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;import java.util.zip.ZipEntry;import java.

关于Tomcat的点点滴滴(体系架构、处理http请求的过程、安装和配置、目录结构、设置压缩和对中文文件名的支持、以及Catalina这个名字的由来……等)

总结Tomcat的体系架构.处理http请求的过程.安装和配置.目录结构.设置压缩和对中文文件名的支持.以及Catalina这个名字的由来--等. Tomcat和JVM: 一个Tomcat只会启动一个JVM,所有webapps公用一个JVM进程,所以System.exit()会导致影响同个Tomcat中的其他应用.Tomcat通过调用配置的JDK或JRE来启动JVM. 体系结构: Server:A Server element represents the entire Catalina ser