A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘丁 黑马帝   /  2012-2-18 20:46  /  3928 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘丁 于 2012-2-20 09:41 编辑
  1. package com.koal.demo.Interview;

  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.io.FileOutputStream;
  5. import java.io.InputStream;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.zip.ZipEntry;
  9. import java.util.zip.ZipOutputStream;

  10. public class ZipOutputStreamDemo {
  11.         public static void main(String[] args) throws Exception{
  12.                 File f1 = new File("E:\\Java基础加强.ppt");
  13.                 File f2 = null;
  14.                 String fileName = f1.getName();
  15.                
  16.                 f2 = f1.isDirectory() ? new File(f1.getParent() + f1.getName() + ".zip") :
  17.                               new File(f1.getParent() + fileName.substring(0, fileName.lastIndexOf('.')) + ".zip");
  18.                 InputStream in = null;
  19.                 ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f2));
  20.                 List<String> list = new ArrayList<String>();
  21.                 test(f1, list);
  22.                 byte[] buf = new byte[1024];
  23.                 int len = 0;
  24.                 for (String s : list) {
  25.                         out.putNextEntry(new ZipEntry(s.substring(s.indexOf(fileName))));
  26.                         in = new FileInputStream(new File(s));
  27.                         while ((len = in.read(buf)) != -1) {
  28.                                 out.write(buf, 0, len);
  29.                         }
  30.                 }
  31.                 in.close();
  32.                 out.close();
  33.                 System.out.println("压缩完成");
  34.         }
  35.        
  36.         public static void test(File file, List<String> list) {
  37.                 if (file.isDirectory()) {
  38.                         File[] files = file.listFiles();
  39.                         for (File file2 : files) {
  40.                                 test(file2, list);
  41.                         }
  42.                 }else {
  43.                         list.add(file.getPath());
  44.                 }
  45.         }
  46. }
复制代码
文件名出现乱码,如何解决。

1 个回复

倒序浏览
我把你的代码拷到我机子上运行了下,没问题!
下面有个博客园的文章,不妨试试

如果要打包的目录名或文件名中包含中文字符,这些目录或文件的名称就会出现乱码,原因是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();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马