使用Java自带的类 java.util.zip进行文件/目录的压缩的话,有一点不足,不支持中文的名件/目录命名,如果有中文名,那么打包就会失败。本人经过一段时间的摸索和实践,发现在一般的Ant.jar类库中也有zip类,import org.apache.tools.zip.*,能够解决不支持中文文件目录的问题,同时,Ant的获得途径也比较多,一般的应用服务器中有这个包,实在不行去下载个tomcat5.X,里面也有ant.jar,本人经过测试,可以使用。

 


Java代码

ziparchive类当前状态不支持怎么办_string

 

ziparchive类当前状态不支持怎么办_java_02

ziparchive类当前状态不支持怎么办_buffer_03


1. import
2. import
3. import
4. import
5. /** 
6.  *  
7.  * @author XL 
8.  *  
9.  */
10. public class
11.   
12. /** 
13.      * @param args 
14.      */
15. public static void
16. // 需打包的文件夾 
17. "c:\\tt2";   
18. try
19.             zip(inputFileName);   
20. catch
21.             e.printStackTrace();   
22.         }   
23.     }   
24. public static void zip(String inputFileName) throws
25. "c:\\test.zip";// 打包后文件名字 
26.         System.out.println(zipFileName);   
27. new
28.     }   
29.   
30. public static void zip(String zipFileName, File inputFile) throws
31. new ZipOutputStream(new
32.                 zipFileName));   
33. "");   
34. "zip done");   
35.         out.close();   
36.     }   
37.   
38. public static void
39. throws
40. if
41.             File[] fl = f.listFiles();   
42. new org.apache.tools.zip.ZipEntry(base + "/"));   
43. 0 ? "" : base + "/";   
44. for (int i = 0; i < fl.length; i++) {   
45.                 zip(out, fl[i], base + fl[i].getName());   
46.             }   
47. else
48. new
49. new
50. int
51.             System.out.println(base);   
52. while ((b = in.read()) != -1) {   
53.                 out.write(b);   
54.             }   
55.             in.close();   
56.         }   
57.     }   
58. }


 

类ZipInputStream读出ZIP文件序列(简单地说就是读出这个ZIP文件压缩了多少文件),而类ZipFile使用内嵌的随机文件访问机制读出其中的文件内容,所以不必顺序的读出ZIP压缩文件序列。
  
ZipInputStream和ZipFile之间另外一个基本的不同点在于高速缓冲的使用方面。当文件使用ZipInputStream和FileInputStream流读出的时候,ZIP条目不使用高速缓冲。然而,如果使用ZipFile(文件名)来打开文件,它将使用内嵌的高速缓冲,所以如果ZipFile(文件名)被重复调用的话,文件只被打开一次。缓冲值在第二次打开时使用。如果你工作在UNIX系统下,这是什么作用都没有的,因为使用ZipFile打开的所有ZIP文件都在内存中存在映射,所以使用ZipFile的性能优于ZipInputStream。然而,如果同一ZIP文件的内容在程序执行期间经常改变,或是重载的话,使用ZipInputStream就成为你的首选了。

    下面显示了使用类ZipFile来解压一个ZIP文件的过程:

  1. 通过指定一个被读取的ZIP文件,或者是文件名,或者是一个文件对象来创建一个ZipFile对象:

    Java代码

    ziparchive类当前状态不支持怎么办_string

    ziparchive类当前状态不支持怎么办_java_02

    ziparchive类当前状态不支持怎么办_buffer_03

  1. ZipFile zipfile = new ZipFile("figs.zip");   
ZipFile zipfile = new ZipFile("figs.zip");
  1. 使用entries方法,返回一个枚举对象,循环获得文件的ZIP条目对象:

    Java代码

    ziparchive类当前状态不支持怎么办_string

    ziparchive类当前状态不支持怎么办_java_02

    ziparchive类当前状态不支持怎么办_buffer_03

  1. while(e.hasMoreElements()) {    
  2.     entry = (ZipEntry) e.nextElement();    
  3. // read contents and save them 
  4. }  
while(e.hasMoreElements()) { 
    entry = (ZipEntry) e.nextElement(); 
    // read contents and save them 
}
  1. ZIP条目作为参数传递给getInputStream方法,可以读取ZIP文件中指定条目的内容,能过其返回的输入流(InputStram)对象可以方便的读出ZIP条目的内容:

    Java代码

    ziparchive类当前状态不支持怎么办_string

    ziparchive类当前状态不支持怎么办_java_02

    ziparchive类当前状态不支持怎么办_buffer_03

  1. is = new
is = new BufferedInputStream(zipfile.getInputStream(entry));
  1. 获取ZIP条目的文件名,创建输出流,并保存:

    Java代码

    ziparchive类当前状态不支持怎么办_string

    ziparchive类当前状态不支持怎么办_java_02

    ziparchive类当前状态不支持怎么办_buffer_03

  1. byte data[] = new byte[BUFFER];    
  2. FileOutputStream fos = new
  3. dest = new
  4. while ((count = is.read(data, 0, BUFFER)) != -1) {    
  5. 0, count);    
  6. }   
byte data[] = new byte[BUFFER]; 
FileOutputStream fos = new FileOutputStream(entry.getName()); 
dest = new BufferedOutputStream(fos, BUFFER); 
while ((count = is.read(data, 0, BUFFER)) != -1) { 
    dest.write(data, 0, count); 
}
  1. 最后关闭所有的输入输出流

    Java代码

    ziparchive类当前状态不支持怎么办_string

    ziparchive类当前状态不支持怎么办_java_02

    ziparchive类当前状态不支持怎么办_buffer_03

  1. dest.flush();    
  2. dest.close();    
  3. is.close();   
dest.flush(); 
dest.close(); 
is.close();

完整代码:


Java代码

ziparchive类当前状态不支持怎么办_string

 

ziparchive类当前状态不支持怎么办_java_02

ziparchive类当前状态不支持怎么办_buffer_03



1. public class
2. static final int BUFFER = 2048;   
3. public static void
4. "c:/testlog.zip";   
5. "c:/2/2/";   
6.         unZip(fileName, unZipDir);   
7.     }   
8.   
9. public static void
10.   
11. try
12. // 先判断目标文件夹是否存在,如果不存在则新建,如果父目录不存在也新建 
13. new
14. if
15.                 f.mkdirs();   
16.             }   
17.   
18. null;   
19. null;   
20.             ZipEntry entry;   
21. new
22.             Enumeration e = zipfile.entries();   
23. while
24.                 entry = (ZipEntry) e.nextElement();   
25. "Extracting: "
26. new
27. int
28. byte data[] = new byte[BUFFER];   
29. new FileOutputStream(unZipDir + "/"
30.                         + entry.getName());   
31. "entry.getName(): "
32. new
33. while ((count = is.read(data, 0, BUFFER)) != -1) {   
34. 0, count);   
35.                 }   
36.                 dest.flush();   
37.                 dest.close();   
38.                 is.close();   
39.             }   
40. catch
41.             e.printStackTrace();   
42.         }   
43.     }   
44.   
45. public static boolean
46. boolean b = false;   
47. try
48. new
49. if
50.                 b = f.mkdirs();   
51.             }   
52. catch
53.             e.printStackTrace();   
54. return
55.         }   
56. return
57.     }   
58. }


首先我们实现最简单的解压缩zip文件,该zip文件中不包含文件夹,也不含中文名。


Java代码

ziparchive类当前状态不支持怎么办_string

 

ziparchive类当前状态不支持怎么办_java_02

ziparchive类当前状态不支持怎么办_buffer_03



1. /** 
2.  * <pre> 
3.  * 参考: 
4.  *  http://www.ibm.com/developerworks/cn/java/l-compress/index.html 
5.  * </pre> 
6.  */
7. import
8. import
9. import
10. import
11. import
12. import
13. import
14.   
15. public class
16. /** 定义一个2K的缓冲区 */
17. static final int BUFFER = 2048;   
18.   
19. public static void
20. "c:/testlog.zip";   
21. // String unZipDir = "c:/abcd/abcd/abcd/abcd/abcd/"; 
22. "c:/1/2/";   
23.         unZip(fileName, unZipDir);   
24. // System.out.println(makeDir(unZipDir)); 
25.     }   
26.   
27. /** 
28.      * @param fileName 
29.      *            String 待解压缩的文件名 
30.      * @param unZipDir 
31.      *            String 存放解压缩后生成的文件的文件夹 
32.      */
33. public static void
34. try
35.   
36. // 先判断目标文件夹是否存在,如果不存在则新建,如果父目录不存在也新建 
37. new
38. if
39.                 f.mkdirs();   
40.             }   
41.   
42. null;   
43.   
44. // 将用文件输入流读入ZIP文件 
45. new
46. // 类ZipInputStream读取ZIP文件 
47. new
48. new
49.             ZipEntry entry;   
50. "";   
51. // ZIP输入流打开后,你可以使用getNextEntry方法来读取ZIP文件中的条目数, 
52. // 该方法返回一个ZipEntry对象。如果到达文件的尾部,getNextEntry返回null 
53. while ((entry = zis.getNextEntry()) != null) {   
54. "Extracting: "
55. int
56. byte data[] = new byte[BUFFER];   
57. // write the files to the disk 
58. "/"
59. "newFileName: "
60. new
61. new
62. while ((count = zis.read(data, 0, BUFFER)) != -1) {   
63. 0, count);   
64.                 }   
65.                 dest.flush();   
66.                 dest.close();   
67.             }   
68.             zis.close();   
69. catch
70.             e.printStackTrace();   
71.         }   
72.     }   
73.   
74. public static boolean
75. boolean b = false;   
76. try
77. new
78. if
79.                 b = f.mkdirs();   
80.             }   
81. catch
82.             e.printStackTrace();   
83. return
84.         }   
85. return
86.     }   
87. }