Java实现Zip压缩与解压(解决中文乱码问题)

解决中文压缩与解压问题
使用的是org.apache.tools.zip包下面的相关类
下面是自己写的类,可以设置和获取Zip文件的注释信息

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;
}

/**
* @param src:要压缩的目录
* @param dest:压缩文件存档
* @throws Exception
*/
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();
}

/**
* @param out
* @param srcFile
* @param base:根路径
* @param filter:过滤
* @throws Exception
*/
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();
}
}
}

/**
* 过滤出要压缩的文件夹
* @param base
* @param list
* @return
*/
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;
}

/**
* @param srcFile:压缩文件路径
* @param dest:解压到的目录
* @param deleteFile:解压完成后是否删除文件
* @throws Exception
*/
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);
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();
}
}

/**
* 获取Zip文件的注释信息
* @param srcFile
* @return
*/
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);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值