由于jdk自带的zip类对中文文件名的支持不好,所以使用了ant的工具类。
网上的大部分都是这样做的,不过不知道为什么,也许是ant版本问题,我用他们的代码依然是中文文件名乱码,经检查发现,需要指定一些输出流的编码方式就可以了。
out.setEncoding( "GBK" ); // ###### 这句话是关键,指定输出的编码方式
完整的源代码如下
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import org.apache.tools.zip.ZipEntry;
- import org.apache.tools.zip.ZipOutputStream;
- /**
- * 整个目录的压缩成一个zip文件.<br>
- * apache-ant-1.7.1
- *
- * @author 老紫竹(JAVA世纪网 java2000.net)
- */
- public class DirectoryZip {
- public static void jar(String inputFileName, String outputFileName) throws Exception {
- ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outputFileName));
- out.setEncoding("GBK"); // ###### 这句话是关键,指定输出的编码方式
- File f = new File(inputFileName);
- jar(out, f, "");
- out.close();
- }
- private static void jar(ZipOutputStream out, File f, String base) throws Exception {
- if (f.isDirectory()) {
- File[] fl = f.listFiles();
- base = base.length() == 0 ? "" : base + "/"; // 注意,这里用左斜杠
- out.putNextEntry(new ZipEntry(base));
- for (int i = 0; i < fl.length; i++) {
- jar(out, fl[i], base + fl[i].getName());
- }
- } else {
- out.putNextEntry(new ZipEntry(base));
- FileInputStream in = new FileInputStream(f);
- byte[] buffer = new byte[1024];
- int n = in.read(buffer);
- while (n != -1) {
- out.write(buffer, 0, n);
- n = in.read(buffer);
- }
- in.close();
- }
- }
- public static void main(String[] args) {
- try {
- jar("D://temp", "d://test.zip");
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }