带中文的目录压缩成一个zip文件


由于jdk自带的zip类对中文文件名的支持不好,所以使用了ant的工具类。
网上的大部分都是这样做的,不过不知道为什么,也许是ant版本问题,我用他们的代码依然是中文文件名乱码,经检查发现,需要指定一些输出流的编码方式就可以了。

out.setEncoding( "GBK" );  // ###### 这句话是关键,指定输出的编码方式


完整的源代码如下
  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import org.apache.tools.zip.ZipEntry;
  5. import org.apache.tools.zip.ZipOutputStream;
  6. /**
  7.  * 整个目录的压缩成一个zip文件.<br>
  8.  * apache-ant-1.7.1
  9.  * 
  10.  * @author 老紫竹(JAVA世纪网 java2000.net)
  11.  */
  12. public class DirectoryZip {
  13.   public static void jar(String inputFileName, String outputFileName) throws Exception {
  14.     ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outputFileName));
  15.     out.setEncoding("GBK"); // ###### 这句话是关键,指定输出的编码方式
  16.     File f = new File(inputFileName);
  17.     jar(out, f, "");
  18.     out.close();
  19.   }
  20.   private static void jar(ZipOutputStream out, File f, String base) throws Exception {
  21.     if (f.isDirectory()) {
  22.       File[] fl = f.listFiles();
  23.       base = base.length() == 0 ? "" : base + "/"// 注意,这里用左斜杠
  24.       out.putNextEntry(new ZipEntry(base));
  25.       for (int i = 0; i < fl.length; i++) {
  26.         jar(out, fl[i], base + fl[i].getName());
  27.       }
  28.     } else {
  29.       out.putNextEntry(new ZipEntry(base));
  30.       FileInputStream in = new FileInputStream(f);
  31.       byte[] buffer = new byte[1024];
  32.       int n = in.read(buffer);
  33.       while (n != -1) {
  34.         out.write(buffer, 0, n);
  35.         n = in.read(buffer);
  36.       }
  37.       in.close();
  38.     }
  39.   }
  40.   public static void main(String[] args) {
  41.     try {
  42.       jar("D://temp""d://test.zip");
  43.     } catch (Exception e) {
  44.       // TODO Auto-generated catch block
  45.       e.printStackTrace();
  46.     }
  47.   }
  48. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值