因为项目要用到压缩、解压缩zip格式压缩包,只好自己封装一个,对于网上流行的中文乱码的问题,本文的解决方法是用apache的包代替jdk里的。基本上还是比较好用的。
1
package
com.resoft.util;
2
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
13
import
org.apache.tools.zip.ZipEntry;
14
import
org.apache.tools.zip.ZipFile;
15
import
org.apache.tools.zip.ZipOutputStream;
16
![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
17
/**
18
* 压缩/解压缩zip包处理类
19
*
20
* @author yayagepei
21
* @date 2008-8-25
22
*/
23
public
class
ZipUtil
{
24![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
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![](https://i-blog.csdnimg.cn/blog_migrate/587e34b10dcf5efbc0859b53470a2db3.gif)
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
}
231![](https://i-blog.csdnimg.cn/blog_migrate/f0cd6c7f9e7ae96feae062cb48f670f0.gif)
补充一下里面用到的一个自己写的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;
}