解决中文压缩与解压问题
使用的是org.apache.tools.zip包下面的相关类
下面是自己写的类,可以设置和获取Zip文件的注释信息
Java代码
-
import
java.io.File;
-
import
java.io.FileInputStream;
-
import
java.io.FileOutputStream;
-
import
java.io.InputStream;
-
import
java.util.ArrayList;
-
import
java.util.Enumeration;
-
import
java.util.List;
-
-
import
org.apache.tools.zip.ZipEntry;
-
import
org.apache.tools.zip.ZipFile;
-
import
org.apache.tools.zip.ZipOutputStream;
-
-
-
public
class
ZipUtil {
-
-
private
String comment =
“”
;
-
-
public
void
setComment(String comment) {
-
this
.comment = comment;
-
}
-
-
-
public
void
zip(String src, String dest, List filter)
throws
Exception {
-
ZipOutputStream out =
new
ZipOutputStream(
new
FileOutputStream(dest));
-
File srcFile =
new
File(src);
-
zip(out,srcFile,
“”
,filter);
-
out.close();
-
}
-
-
-
public
void
zip(ZipOutputStream out, File srcFile, String base, List filter)
throws
Exception {
-
if
(srcFile.exists()==
false
) {
-
throw
new
Exception(
“压缩目录不存在!”
);
-
}
-
-
if
(srcFile.isDirectory()) {
-
File[] files = srcFile.listFiles();
-
base = base.length() ==
0
?
“”
: base +
“/”
;
-
if
(isExist(base, filter)) {
-
out.putNextEntry(
new
ZipEntry(base));
-
}
-
for
(
int
i=
0
; i<files.length; i++) {
-
zip(out,files[i],base + files[i].getName(),filter);
-
}
-
}
else
{
-
if
(isExist(base, filter)) {
-
base = base.length() ==
0
? srcFile.getName() : base ;
-
ZipEntry zipEntry =
new
ZipEntry(base);
-
zipEntry.setComment(comment);
-
out.putNextEntry(zipEntry);
-
FileInputStream in =
new
FileInputStream(srcFile);
-
int
length =
0
;
-
byte
[] b =
new
byte
[
1024
];
-
while
((length=in.read(b,
0
,
1024
))!=-
1
) {
-
out.write(b,
0
,length);
-
}
-
in.close();
-
}
-
}
-
}
-
-
-
public
boolean
isExist(String base, List list) {
-
if
(list !=
null
&& !list.isEmpty()) {
-
for
(
int
i =
0
; i < list.size(); i++) {
-
if
(base.indexOf((String) list.get(i)) >=
0
) {
-
return
true
;
-
}
-
}
-
}
-
return
false
;
-
}
-
-
-
public
void
unZip(String srcFile,String dest,
boolean
deleteFile)
throws
Exception {
-
File file =
new
File(srcFile);
-
if
(!file.exists()) {
-
throw
new
Exception(
“解压文件不存在!”
);
-
}
-
ZipFile zipFile =
new
ZipFile(file,”GB2312″);
-
Enumeration e = zipFile.getEntries();
-
while
(e.hasMoreElements()) {
-
ZipEntry zipEntry = (ZipEntry)e.nextElement();
-
if
(zipEntry.isDirectory()) {
-
String name = zipEntry.getName();
-
name = name.substring(
0
,name.length()-
1
);
-
File f =
new
File(dest + name);
-
f.mkdirs();
-
}
else
{
-
File f =
new
File(dest + zipEntry.getName());
-
f.getParentFile().mkdirs();
-
f.createNewFile();
-
InputStream is = zipFile.getInputStream(zipEntry);
-
FileOutputStream fos =
new
FileOutputStream(f);
-
int
length =
0
;
-
byte
[] b =
new
byte
[
1024
];
-
while
((length=is.read(b,
0
,
1024
))!=-
1
) {
-
fos.write(b,
0
, length);
-
}
-
is.close();
-
fos.close();
-
}
-
}
-
-
if
(zipFile !=
null
) {
-
zipFile.close();
-
}
-
-
if
(deleteFile) {
-
file.deleteOnExit();
-
}
-
}
-
-
-
public
static
String getZipComment(String srcFile) {
-
String comment =
“”
;
-
try
{
-
ZipFile zipFile =
new
ZipFile(srcFile);
-
Enumeration e = zipFile.getEntries();
-
-
while
(e.hasMoreElements()) {
-
ZipEntry ze = (ZipEntry) e.nextElement();
-
-
comment = ze.getComment();
-
if
(comment !=
null
&& !comment.equals(
“”
)
-
&& !comment.equals(
“null”
)) {
-
break
;
-
}
-
}
-
-
zipFile.close();
-
}
catch
(Exception e) {
-
System.out.println(
“获取zip文件注释信息失败:”
+ e.getMessage());
-
}
-
-
return
comment;
-
}
-
-
public
static
void
main(String[] args)
throws
Exception {
-
long
begin = System.currentTimeMillis();
-
ZipUtil zu =
new
ZipUtil();
-
List<String> filter =
new
ArrayList<String>();
-
filter.add(
“3RDPARTY”
);
-
filter.add(
“BANNER.GIF”
);
-
zu.setComment(
“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”
);
-
zu.zip(
“C:/VALUEADD”
,
“c:/hh.zip”
,filter);
-
System.out.println(ZipUtil.getZipComment(
“c:/hh.zip”
));
-
//new ZipUtil().unZip(“c:/tt.zip”, “c:/mmmmmmmmmmmmmmmmmmm/”, true);
-
//File f = new File(“c:/hh.zip”);
-
//f.deleteOnExit();
-
long
end = System.currentTimeMillis();
-
System.out.println(end-begin);
-
}
-
}
-
-
-
-
-
-
如果不需要上面的filter,可以添加fileter为空list或者用下面的程序:
-
-
-
不带filter的zip压缩:
-
//
-
// * @author WeiMiao
-
// * @param out: ZipOutputStream
-
// * @param srcFile: 要压缩的目录
-
// * @param base: 根路径
-
// * @throws Exception
-
//
-
public
static
void
zip(ZipOutputStream out, File srcFile, String base)
throws
Exception {
-
if
(!srcFile.exists()) {
-
throw
new
Exception(
“压缩目录不存在!”
);
-
}
-
if
(srcFile.isDirectory()) {
-
File[] files = srcFile.listFiles();
-
base = base.length() ==
0
?
“”
: base +
“/”
;
-
if
(base.length() >
0
) {
-
out.putNextEntry(
new
ZipEntry(base));
-
}
-
for
(
int
i =
0
; i < files.length; i++) {
-
zip(out, files[i], base + files[i].getName());
-
}
-
}
else
{
-
base = base.length() ==
0
? srcFile.getName() : base;
-
out.putNextEntry(
new
ZipEntry(base));
-
FileInputStream fis =
new
FileInputStream(srcFile);
-
int
length =
0
;
-
byte
[] b =
new
byte
[BUFFER];
-
while
((length = fis.read(b,
0
, BUFFER)) != –
1
) {
-
out.write(b,
0
, length);
-
}
-
fis.close();
-
}
-
}