在Android中我们很多时候需要进行压缩与解压缩,就如本人的[ 足球即时比分 ]应用中也用到过.需要将一些信息进行收集再进行压缩,最后将压缩文件上传到服务器中(如何上传将文件上传到服务器中可以看我另一篇博文 :[ Android上传文件到服务器 ]).
以下我的使用到的工具类的代码.需要注意的是,进行压缩与解压缩都不支持中文名,如果需要支持中文名的话,一般是使用 Ant中的ZipInputStream与ZipOutStream,由于手机上使用ant的jar包的话,会令应用或游戏的大小变大很多,所以尽量小引入其它第三方的jar包的.
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
| package rbase.app.nowscore.util;
import java.io.InputStream;
/**
* Android Zip压缩解压缩
* @author ronald (www.r-base.net)
*/
public final class ZipUtil {
private ZipUtil(){
}
/**
* 取得压缩包中的 文件列表(文件夹,文件自选)
* @param zipFileString 压缩包名字
* @param bContainFolder 是否包括 文件夹
* @param bContainFile 是否包括 文件
* @return
* @throws Exception
*/
public static java.util.List<java.io.File> getFileList(String zipFileString, boolean bContainFolder,
boolean bContainFile)throws Exception {
java.util.List<java.io.File> fileList = new java.util.ArrayList<java.io.File>();
java.util.zip.ZipInputStream inZip =
new java.util.zip.ZipInputStream(new java.io.FileInputStream(zipFileString));
java.util.zip.ZipEntry zipEntry;
String szName = "";
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
// get the folder name of the widget
szName = szName.substring(0, szName.length() - 1);
java.io.File folder = new java.io.File(szName);
if (bContainFolder) {
fileList.add(folder);
}
} else {
java.io.File file = new java.io.File(szName);
if (bContainFile) {
fileList.add(file);
}
}
}//end of while
inZip.close();
return fileList;
}
/**
* 返回压缩包中的文件InputStream
*
* @param zipFilePath 压缩文件的名字
* @param fileString 解压文件的名字
* @return InputStream
* @throws Exception
*/
public static java.io.InputStream upZip(String zipFilePath, String fileString)throws Exception {
java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(zipFilePath);
java.util.zip.ZipEntry zipEntry = zipFile.getEntry(fileString);
return zipFile.getInputStream(zipEntry);
}
/**
* 解压一个压缩文档 到指定位置
* @param zipFileString 压缩包的名字
* @param outPathString 指定的路径
* @throws Exception
*/
public static void unZipFolder(InputStream input, String outPathString)throws Exception {
java.util.zip.ZipInputStream inZip = new java.util.zip.ZipInputStream(input);
java.util.zip.ZipEntry zipEntry = null;
String szName = "";
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
// get the folder name of the widget
szName = szName.substring(0, szName.length() - 1);
java.io.File folder = new java.io.File(outPathString + java.io.File.separator + szName);
folder.mkdirs();
} else {
java.io.File file = new java.io.File(outPathString + java.io.File.separator + szName);
file.createNewFile();
// get the output stream of the file
java.io.FileOutputStream out = new java.io.FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
// read (len) bytes into buffer
while ((len = inZip.read(buffer)) != -1) {
// write (len) byte from buffer at the position 0
out.write(buffer, 0, len);
out.flush();
}
out.close();
}
}//end of while
inZip.close();
}
/**
* 解压一个压缩文档 到指定位置
* @param zipFileString 压缩包的名字
* @param outPathString 指定的路径
* @throws Exception
*/
public static void unZipFolder(String zipFileString, String outPathString)throws Exception {
unZipFolder(new java.io.FileInputStream(zipFileString),outPathString);
}//end of func
/**
* 压缩文件,文件夹
*
* @param srcFilePath 要压缩的文件/文件夹名字
* @param zipFilePath 指定压缩的目的和名字
* @throws Exception
*/
public static void zipFolder(String srcFilePath, String zipFilePath)throws Exception {
//创建Zip包
java.util.zip.ZipOutputStream outZip =
new java.util.zip.ZipOutputStream(new java.io.FileOutputStream(zipFilePath));
//打开要输出的文件
java.io.File file = new java.io.File(srcFilePath);
//压缩
zipFiles(file.getParent()+java.io.File.separator, file.getName(), outZip);
//完成,关闭
outZip.finish();
outZip.close();
}//end of func
/**
* 压缩文件
* @param folderPath
* @param filePath
* @param zipOut
* @throws Exception
*/
private static void zipFiles(String folderPath, String filePath,
java.util.zip.ZipOutputStream zipOut)throws Exception{
if(zipOut == null){
return;
}
java.io.File file = new java.io.File(folderPath+filePath);
//判断是不是文件
if (file.isFile()) {
java.util.zip.ZipEntry zipEntry = new java.util.zip.ZipEntry(filePath);
java.io.FileInputStream inputStream = new java.io.FileInputStream(file);
zipOut.putNextEntry(zipEntry);
int len;
byte[] buffer = new byte[4096];
while((len=inputStream.read(buffer)) != -1) {
zipOut.write(buffer, 0, len);
}
zipOut.closeEntry();
} else {
//文件夹的方式,获取文件夹下的子文件
String fileList[] = file.list();
//如果没有子文件, 则添加进去即可
if (fileList.length <= 0) {
java.util.zip.ZipEntry zipEntry =
new java.util.zip.ZipEntry(filePath+java.io.File.separator);
zipOut.putNextEntry(zipEntry);
zipOut.closeEntry();
}
//如果有子文件, 遍历子文件
for (int i = 0; i < fileList.length; i++) {
zipFiles(folderPath, filePath+java.io.File.separator+fileList[i], zipOut);
}//end of for
}//end of if
}//end of func
} |
文件下载 : ZipUtil.java.zip
转载请注明转自 : http://www.r-base.net/archives/404