使用Java自带的类 java.util.zip进行文件/目录的压缩的话,有一点不足,不支持中文的名件/目录命名,如果有中文名,那么打包就会失败。本人经过一段时间的摸索和实践,发现在一般的Ant.jar类库中也有zip类,import org.apache.tools.zip.*,能够解决不支持中文文件目录的问题,同时,Ant的获得途径也比较多,一般的应用服务器中有这个包,实在不行去下载个tomcat5.X,里面也有ant.jar,本人经过测试,可以使用。
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文件的过程:
- ZipFile zipfile = new ZipFile("figs.zip");
ZipFile zipfile = new ZipFile("figs.zip");
- while(e.hasMoreElements()) {
- entry = (ZipEntry) e.nextElement();
- // read contents and save them
- }
while(e.hasMoreElements()) {
entry = (ZipEntry) e.nextElement();
// read contents and save them
}
- is = new
is = new BufferedInputStream(zipfile.getInputStream(entry));
- byte data[] = new byte[BUFFER];
- FileOutputStream fos = new
- dest = new
- while ((count = is.read(data, 0, BUFFER)) != -1) {
- 0, count);
- }
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);
}
- dest.flush();
- dest.close();
- is.close();
dest.flush();
dest.close();
is.close();
完整代码:
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文件中不包含文件夹,也不含中文名。
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. }