使用Java核心類庫的zip包實現壓縮/解壓文件!
由于需要,這幾天研究了一下使用Java技術實現文件及文件夾打zip包及解zip包,使用的是java.util.zip包下的類;主要用到的是三個類,即:ZipEntry,我的理解是zip文件中壓縮的一個個子文件;ZipInputStream是zip格式的輸入流;ZipOutputStream是zip格式的輸出流;
這方面網上也有一些例子,我也測試了相關的例子,但是在實現部分功能是有些不足,所以將代碼改造后重寫如下,現在實現的功能是對單個文件的打包及解包,對一個文件夾(文件夾內文件及文件夾不限)的打包及解包;
使用Java核心庫的不足就是如果對中文文件夾或文件打包后,文件名或文件夾名會出現亂碼,雖然在window下可以正常的解壓,解壓后也能正常顯示中文,但是對于Unix等系統則不具有通用性;網上能找的解決方式是使用Ant包中的zip類庫,Ant重寫了ZipOutputStream類,所以對于打包后正常顯示中文沒有問題,但是還是不能動態制定壓制zip文件的編碼;
1
import java.io.File;
2
import java.io.FileInputStream;
3
import java.io.FileNotFoundException;
4
import java.io.FileOutputStream;
5
import java.io.IOException;
6
import java.util.zip.ZipEntry;
7
import java.util.zip.ZipInputStream;
8
import java.util.zip.ZipOutputStream;
9
10
/** *//**
11
* 使用java核心類庫打包、解包zip文件,不足之處在于壓縮中文名的文件時,在壓縮包內中文字符是亂碼,
12
* 在windows下解壓后編碼正常顯示中文,而其他系統下則不能正常還原;
13
*/
14
public class TestZip
{
15
16
/** *//**
17
* 定義壓縮文件及目錄為zip文件的方法,重寫下面的zip方法
18
*
19
* @param zipFileName
20
* @param inputFile
21
* @throws Exception
22
*/
23
public void zip(String zipFileName, String inputFile)
{
24
zip(zipFileName, new File(inputFile));
25
}
26
27
/** *//**
28
* 定義壓縮文件及目錄為zip文件的方法,重寫下面的zip方法
29
*
30
* @param zipFileName
31
* @param inputFile
32
* @throws Exception
33
*/
34
public void zip(String zipFileName, File inputFile)
{
35
try
{
36
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
37
zipFileName));
38
zip(out, inputFile, inputFile.getName());
39
System.out.println("zip done");
40
out.close();
41
}
42
catch (FileNotFoundException e)
{
43
// TODO 自動生成 catch 塊
44
e.printStackTrace();
45
}
46
catch (IOException e)
{
47
// TODO 自動生成 catch 塊
48
e.printStackTrace();
49
}
50
}
51
52
/** *//**
53
* 定義壓縮文件及目錄為zip文件的方法
54
*
55
* @param out
56
* @param f
57
* @param base
58
* @throws Exception
59
*/
60
public void zip(ZipOutputStream out, File f, String base)
{
61
try
{
62
System.out.println("Zipping " + f.getName());
63
//判斷File是否為目錄
64
if (f.isDirectory())
{
65
System.out.println("Read Directory !");
66
//獲取f目錄下所有文件及目錄,作為一個File數組返回
67
File[] fl = f.listFiles();
68
out.putNextEntry(new ZipEntry(base + "/"));
69
base = base.length() == 0 ? "" : base + "/";
70
for (int i = 0; i < fl.length; i++)
{
71
zip(out, fl[i], base + fl[i].getName());
72
}
73
}
74
else
{
75
System.out.println("Read File !");
76
out.putNextEntry(new ZipEntry(base));
77
FileInputStream in = new FileInputStream(f);
78
int b;
79
System.out.println("base " + base);
80
while ((b = in.read()) != -1)
{
81
// System.out.println("File reading
");
82
out.write(b);
83
}
84
in.close();
85
}
86
}
87
catch (FileNotFoundException e)
{
88
// TODO 自動生成 catch 塊
89
e.printStackTrace();
90
}
91
catch (IOException e)
{
92
// TODO 自動生成 catch 塊
93
e.printStackTrace();
94
}
95
}
96
97
/** *//**
98
* 定義解壓縮zip文件的方法
99
*
100
* @param zipFileName
101
* @param outputDirectory
102
*/
103
public void unzip(String zipFileName, String outputDirectory)
{
104
try
{
105
ZipInputStream in = new ZipInputStream(new FileInputStream(
106
zipFileName));
107
//獲取ZipInputStream中的ZipEntry條目,一個zip文件中可能包含多個ZipEntry,
108
//當getNextEntry方法的返回值為null,則代表ZipInputStream中沒有下一個ZipEntry,
109
//輸入流讀取完成;
110
ZipEntry z = in.getNextEntry();
111
while (z != null)
{
112
System.out.println("unziping " + z.getName());
113
//創建以zip包文件名為目錄名的根目錄
114
File f = new File(outputDirectory);
115
f.mkdir();
116
if (z.isDirectory())
{
117
String name = z.getName();
118
name = name.substring(0, name.length() - 1);
119
// System.out.println("name " + name);
120
f = new File(outputDirectory + File.separator + name);
121
f.mkdir();
122
// System.out.println("mkdir " + outputDirectory
123
// + File.separator + name);
124
}
125
else
{
126
f = new File(outputDirectory + File.separator + z.getName());
127
f.createNewFile();
128
FileOutputStream out = new FileOutputStream(f);
129
int b;
130
while ((b = in.read()) != -1)
{
131
out.write(b);
132
}
133
out.close();
134
}
135
//讀取下一個ZipEntry
136
z = in.getNextEntry();
137
}
138
in.close();
139
}
140
catch (FileNotFoundException e)
{
141
// TODO 自動生成 catch 塊
142
e.printStackTrace();
143
}
144
catch (IOException e)
{
145
// TODO 自動生成 catch 塊
146
e.printStackTrace();
147
}
148
}
149
150
public static void main(String[] args)
{
151
TestZip t = new TestZip();
152
// t.zip("c:\\test11.zip", "c:\\test1");
153
// t.zip("c:\\test2.zip", "c:\\php");
154
t.unzip("c:\\test11.zip", "c:\\test11");
155
//如果此處不指定解壓的具體目錄,如:test2,那么則直接解壓到根目錄下
156
// t.unzip("c:\\test2.zip", "c:\\test2");
157
}
158
}

2

3

4

5

6

7

8

9

10


11

12

13

14



15

16


17

18

19

20

21

22

23



24

25

26

27


28

29

30

31

32

33

34



35



36

37

38

39

40

41

42



43

44

45

46



47

48

49

50

51

52


53

54

55

56

57

58

59

60



61



62

63

64



65

66

67

68

69

70



71

72

73

74



75

76

77

78

79

80



81


82

83

84

85

86

87



88

89

90

91



92

93

94

95

96

97


98

99

100

101

102

103



104



105

106

107

108

109

110

111



112

113

114

115

116



117

118

119

120

121

122

123

124

125



126

127

128

129

130



131

132

133

134

135

136

137

138

139

140



141

142

143

144



145

146

147

148

149

150



151

152

153

154

155

156

157

158

posted on 2006-01-19 00:24 benbenming 閱讀(2784) 評論(0) 編輯 收藏 所屬分類: Java基礎