java用apache的ZipEntry压缩文件名为中文的word文件时,文件名乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java用apache的ZipEntry压缩文件名为中文的word文件时,文件名乱码相关的知识,希望对你有一定的参考价值。

public void zipFiles(File[] srcFile,File zipFile)
byte[] buf = new byte[1024];
try
ZipOutputStream out = new ZipOutputStream(zipFile);
for(int i =0;i<srcFile.length;i++)
if(srcFile[i]!=null)
FileInputStream 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();


out.close();
catch (Exception e)
e.printStackTrace();
log.error("文件压缩出错"+e.getMessage());

apache自带的zip方法有缺陷,没有做中文的判断的,这个是它的一个已知bug。
解决办法:用jdk的rt.jar里面的方法实现就可以了。
可以参考下以下工具类:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
*
* @author gdb
*/
public class ZipUtilAll
public static final int DEFAULT_BUFSIZE = 1024 * 16;

/**
* 解压Zip文件
*
* @param srcZipFile
* @param destDir
* @throws IOException
*/
public static void unZip(File srcZipFile, String destDir) throws IOException

ZipFile zipFile = new ZipFile(srcZipFile);
unZip(zipFile, destDir);


/**
* 解压Zip文件
*
* @param srcZipFile
* @param destDir
* @throws IOException
*/
public static void unZip(String srcZipFile, String destDir) throws IOException

ZipFile zipFile = new ZipFile(srcZipFile);
unZip(zipFile, destDir);


/**
* 解压Zip文件
*
* @param zipFile
* @param destDir
* @throws IOException
*/
public static void unZip(ZipFile zipFile, String destDir) throws IOException

Enumeration<? extends ZipEntry> entryEnum = zipFile.entries();
ZipEntry entry = null;
while (entryEnum.hasMoreElements())
entry = entryEnum.nextElement();
File destFile = new File(destDir + entry.getName());
if (entry.isDirectory())
destFile.mkdirs();

else
destFile.getParentFile().mkdirs();
InputStream eis = zipFile.getInputStream(entry);
System.out.println(eis.read());
write(eis, destFile);




/**
* 将输入流中的数据写到指定文件
*
* @param inputStream
* @param destFile
*/
public static void write(InputStream inputStream, File destFile) throws IOException

BufferedInputStream bufIs = null;
BufferedOutputStream bufOs = null;
try
bufIs = new BufferedInputStream(inputStream);
bufOs = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] buf = new byte[DEFAULT_BUFSIZE];
int len = 0;
while ((len = bufIs.read(buf, 0, buf.length)) > 0)
bufOs.write(buf, 0, len);

catch (IOException ex)
throw ex;
finally
close(bufOs, bufIs);



/**
* 安全关闭多个流
*
* @param streams
*/
public static void close(Closeable... streams)

try
for (Closeable s : streams)
if (s != null)
s.close();

catch (IOException ioe)
ioe.printStackTrace(System.err);


/**
* @param args
* @throws java.lang.Exception
*/
public static void main(String[] args) throws Exception

// unZip(new File(ZipDemo.class.getResource("D:/123/HKRT-B2B.zip").toURI()), "D:/123/");
unZip("D:/123/123.zip", "D:/123/");
// new File();

参考技术A

对于输出zip文件的ZipOutputStream对象设置一下编码:

       

ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
                zipFileName));
//设置filenames的编码
out.setEncoding("UTF-8");

通常linux下使用utf8进行文件命名编码,而windows下采用gbk,根据你的系统情况而定

可参考下api:

http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/api/org/apache/tools/zip/ZipOutputStream.html

追问

亲,我试过啦 , 不好使啊 ,还是乱码

追答

你用的是GBK还是utf8?

以上是关于java用apache的ZipEntry压缩文件名为中文的word文件时,文件名乱码的主要内容,如果未能解决你的问题,请参考以下文章

java对 zip文件的压缩和解压(ant解决中文乱码)

怎样用Java生成ZIP文件

对zip文件进行解压操作和对一个文件进行压缩操作

如何使用java压缩文件夹成为zip包

压缩文件的压缩时候中文代码

如何使用 XZ for Java 添加 ZipEntry