黑马程序员技术交流社区
标题:
文件压缩时文件名出现乱码
[打印本页]
作者:
刘丁
时间:
2012-2-18 20:46
标题:
文件压缩时文件名出现乱码
本帖最后由 刘丁 于 2012-2-20 09:41 编辑
package com.koal.demo.Interview;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipOutputStreamDemo {
public static void main(String[] args) throws Exception{
File f1 = new File("E:\\Java基础加强.ppt");
File f2 = null;
String fileName = f1.getName();
f2 = f1.isDirectory() ? new File(f1.getParent() + f1.getName() + ".zip") :
new File(f1.getParent() + fileName.substring(0, fileName.lastIndexOf('.')) + ".zip");
InputStream in = null;
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f2));
List<String> list = new ArrayList<String>();
test(f1, list);
byte[] buf = new byte[1024];
int len = 0;
for (String s : list) {
out.putNextEntry(new ZipEntry(s.substring(s.indexOf(fileName))));
in = new FileInputStream(new File(s));
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
}
in.close();
out.close();
System.out.println("压缩完成");
}
public static void test(File file, List<String> list) {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File file2 : files) {
test(file2, list);
}
}else {
list.add(file.getPath());
}
}
}
复制代码
文件名出现乱码,如何解决。
作者:
左华清
时间:
2012-2-18 21:18
我把你的代码拷到我机子上运行了下,没问题!
下面有个博客园的文章,不妨试试
如果要打包的目录名或文件名中包含中文字符,这些目录或文件的名称就会出现乱码,原因是JDK自带的API中,在写入ZipEntry的时候,采用的编码默认的是UTF8,而win7操作系统中文版在处理zip文件的时候采用的是GBK编码,编码和解码的处理不同,造成了打包之后的文件在win7中文版中看到的是乱码。
可以采用的解决方案是通过利用第三方API实现zip压缩,以解决中文乱码问题。以下是利用apache的compress的zip压缩的实现,所需jar包为commons-compress-1.2.jar,其官方下载地址为http://commons.apache.org/compress/download_compress.cgi:
ArchiveOutputStream os = new ArchiveStreamFactory()
.createArchiveOutputStream(ArchiveStreamFactory.ZIP, out);
if(os instanceof ZipArchiveOutputStream) {
((ZipArchiveOutputStream) os).setEncoding("GBK");
}
//...some code omitted
os.putArchiveEntry(new ZipArchiveEntry(path+"/"+file.getName()));
IOUtils.copy(new FileInputStream(file), os);
os.closeArchiveEntry();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2