因为项目要用到压缩、解压缩zip格式压缩包,只好自己封装一个,对于网上流行的中文乱码的问题,本文的解决方法是用apache的包代替jdk里的。基本上还是比较好用的。
package com.resoft.util;
2
3
import java.io.BufferedOutputStream;
4
import java.io.File;
5
import java.io.FileInputStream;
6
import java.io.FileNotFoundException;
7
import java.io.FileOutputStream;
8
import java.io.IOException;
9
import java.io.InputStream;
10
import java.io.OutputStream;
11
import java.util.Enumeration;
12
13
import org.apache.tools.zip.ZipEntry;
14
import org.apache.tools.zip.ZipFile;
15
import org.apache.tools.zip.ZipOutputStream;
16
17
/**
18
* 压缩/解压缩zip包处理类
19
*
20
* @author yayagepei
21
* @date 2008-8-25
22
*/
23
public class ZipUtil {
24
25
/**
26
* 压缩
27
*
28
* @param zipFileName
29
* 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名
30
* @param relativePath
31
* 相对路径,默认为空
32
* @param directory
33
* 文件或目录的绝对路径
34
* @throws FileNotFoundException
35
* @throws IOException
36
* @author yayagepei
37
* @date 2008-8-26
38
*/
39
public static void zip(String zipFileName, String relativePath,
40
String directory) throws FileNotFoundException, IOException {
41
String fileName = zipFileName;
42
if (fileName == null || fileName.trim().equals("")) {
43
File temp = new File(directory);
44
if (temp.isDirectory()) {
45
fileName = directory + ".zip";
46
} else {
47
if (directory.indexOf(".") > 0) {
48
fileName = directory.substring(0, directory
49
.lastIndexOf("."))
50
+ "zip";
51
} else {
52
fileName = directory + ".zip";
53
}
54
}
55
}
56
ZipOutputStream zos = new ZipOutputStream(
57
new FileOutputStream(fileName));
58
try {
59
zip(zos, relativePath, directory);
60
} catch (IOException ex) {
61
throw ex;
62
} finally {
63
if (null != zos) {
64
zos.close();
65
}
66
}
67
}
68
69
/**
70
* 压缩
71
*
72
* @param zos
73
* 压缩输出流
74
* @param relativePath
75
* 相对路径
76
* @param absolutPath
77
* 文件或文件夹绝对路径
78
* @throws IOException
79
* @author yayagepei
80
* @date 2008-8-26
81
*/
82
private static void zip(ZipOutputStream zos, String relativePath,
83
String absolutPath) throws IOException {
84
File file = new File(absolutPath);
85
if (file.isDirectory()) {
86
File[] files = file.listFiles();
87
for (int i = 0; i < files.length; i++) {
88
File tempFile = files[i];
89
if (tempFile.isDirectory()) {
90
String newRelativePath = relativePath + tempFile.getName()
91
+ File.separator;
92
createZipNode(zos, newRelativePath);
93
zip(zos, newRelativePath, tempFile.getPath());
94
} else {
95
zipFile(zos, tempFile, relativePath);
96
}
97
}
98
} else {
99
zipFile(zos, file, relativePath);
100
}
101
}
102
103
/**
104
* 压缩文件
105
*
106
* @param zos
107
* 压缩输出流
108
* @param file
109
* 文件对象
110
* @param relativePath
111
* 相对路径
112
* @throws IOException
113
* @author yayagepei
114
* @date 2008-8-26
115
*/
116
private static void zipFile(ZipOutputStream zos, File file,
117
String relativePath) throws IOException {
118
ZipEntry entry = new ZipEntry(relativePath + file.getName());
119
zos.putNextEntry(entry);
120
InputStream is = null;
121
try {
122
is = new FileInputStream(file);
123
int BUFFERSIZE = 2 << 10;
124
int length = 0;
125
byte[] buffer = new byte[BUFFERSIZE];
126
while ((length = is.read(buffer, 0, BUFFERSIZE)) >= 0) {
127
zos.write(buffer, 0, length);
128
}
129
zos.flush();
130
zos.closeEntry();
131
} catch (IOException ex) {
132
throw ex;
133
} finally {
134
if (null != is) {
135
is.close();
136
}
137
}
138
}
139
140
/**
141
* 创建目录
142
*
143
* @param zos
144
* zip输出流
145
* @param relativePath
146
* 相对路径
147
* @throws IOException
148
* @author yayagepei
149
* @date 2008-8-26
150
*/
151
private static void createZipNode(ZipOutputStream zos, String relativePath)
152
throws IOException {
153
ZipEntry zipEntry = new ZipEntry(relativePath);
154
zos.putNextEntry(zipEntry);
155
zos.closeEntry();
156
}
157
158
/**
159
* 解压缩zip包
160
*
161
* @param zipFilePath
162
* zip文件路径
163
* @param targetPath
164
* 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下
165
* @throws IOException
166
* @author yayagepei
167
* @date 2008-9-28
168
*/
169
public static void unzip(String zipFilePath, String targetPath)
170
throws IOException {
171
OutputStream os = null;
172
InputStream is = null;
173
ZipFile zipFile = null;
174
try {
175
zipFile = new ZipFile(zipFilePath);
176
String directoryPath = "";
177
if (null == targetPath || "".equals(targetPath)) {
178
directoryPath = zipFilePath.substring(0, zipFilePath
179
.lastIndexOf("."));
180
} else {
181
directoryPath = targetPath;
182
}
183
Enumeration entryEnum = zipFile.getEntries();
184
if (null != entryEnum) {
185
ZipEntry zipEntry = null;
186
while (entryEnum.hasMoreElements()) {
187
zipEntry = (ZipEntry) entryEnum.nextElement();
188
if (zipEntry.isDirectory()) {
189
directoryPath = directoryPath + File.separator
190
+ zipEntry.getName();
191
System.out.println(directoryPath);
192
continue;
193
}
194
if (zipEntry.getSize() > 0) {
195
// 文件
196
File targetFile = FileUtil.buildFile(directoryPath
197
+ File.separator + zipEntry.getName(), false);
198
os = new BufferedOutputStream(new FileOutputStream(
199
targetFile));
200
is = zipFile.getInputStream(zipEntry);
201
byte[] buffer = new byte[4096];
202
int readLen = 0;
203
while ((readLen = is.read(buffer, 0, 4096)) >= 0) {
204
os.write(buffer, 0, readLen);
205
}
206
207
os.flush();
208
os.close();
209
} else {
210
// 空目录
211
FileUtil.buildFile(directoryPath + File.separator
212
+ zipEntry.getName(), true);
213
}
214
}
215
}
216
} catch (IOException ex) {
217
throw ex;
218
} finally {
219
if(null != zipFile){
220
zipFile = null;
221
}
222
if (null != is) {
223
is.close();
224
}
225
if (null != os) {
226
os.close();
227
}
228
}
229
}
230
}
* 生产文件 如果文件所在路径不存在则生成路径
*
* @param fileName
* 文件名 带路径
* @param isDirectory 是否为路径
* @return
* @author yayagepei
* @date 2008-8-27
*/
public static File buildFile(String fileName, boolean isDirectory) {
File target = new File(fileName);
if (isDirectory) {
target.mkdirs();
} else {
if (!target.getParentFile().exists()) {
target.getParentFile().mkdirs();
target = new File(target.getAbsolutePath());
}
}
return target;
}
废话少说,直接上代码。
1
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

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231
补充一下里面用到的一个自己写的FileUtil的一个方法
/*** 生产文件 如果文件所在路径不存在则生成路径
*
* @param fileName
* 文件名 带路径
* @param isDirectory 是否为路径
* @return
* @author yayagepei
* @date 2008-8-27
*/
public static File buildFile(String fileName, boolean isDirectory) {
File target = new File(fileName);
if (isDirectory) {
target.mkdirs();
} else {
if (!target.getParentFile().exists()) {
target.getParentFile().mkdirs();
target = new File(target.getAbsolutePath());
}
}
return target;
}