解决中文压缩与解压问题
使用的是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);
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();
}
}
分享到:
相关推荐
使用java压缩也解压zip文件方法,解决中文乱码问题。使用java自带的压缩解压算法,会出现中文乱码问题。使用apache io的zip包,有效解决该问题。Ant的压缩解压,也是使用该类。
java压缩文件成zip实现无乱码 内置类与jar包
网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...
解决android 自带zip解压缩中文乱码的问题,导入zip.jar即可使用(与系统提供的用法相同),大小仅24k
在使用Java对ZIP压缩文件进行解压的方式中有两种,一种是使用apache提供的ant.jar工具包,但是如果ZIP文件中含有中文名称的文件,在解压后,文件名将出现乱码,另一种是使用Java自身JDK中java.util.zip包下工具类,...
CompresszZipFile 中带是 zip解压 ZipFileUtil 是文件的压缩 和rar的解压
项目中碰到问题.jdk zipEntry 压缩中文文件名乱码 上网查了下,有两种方法,一种修改jdk ZipInputStream及ZipOutputStream 的源文件,比较麻烦,不建议此项. 第二种 就是拿来主义,因为 开源项目 Ant 里已经有...
* @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下 * void */ public static void unzip(String zipFilePath, String targetPath) throws ...
用java.util.zipoutputstream压缩会出现中文的文件名乱码的情况,且无法设置字符集,这个版本用org.apache.tools.zip.ZipOutputStream压缩,可以自定义字符集,解决中文的文件名乱码问题。
java中使用ZipEntry对文件目录下的所有文件进行压缩,已解决中文乱码问题,亲测可用,请放心下载。
zip解压缩乱码的解决方案,解决常见字符串乱码的问题,特点:易上手,可二次开发和封装.
ZipOutputStream 压缩 乱码
主要介绍了java压缩zip文件中文乱码问题的解决方法,需要的朋友可以参考下
时间紧迫,暂时存在中文文件夹名称乱码问题 不影响文件夹内各类型文件内容 实现方法见功能说明txt文档,只需传入文件夹路径,Zip文件路径,密码 本人JAVA实习生,因业务需求研究此方法,代码质量不高,只为了...
这几天做一个操作docx的文档的功能,Apache的POI功能有限,就参考了相关资料写的一个Java压缩和解压zip文件的工具类。全部使用的是Java自带的类库,中文的文件名会有乱码的问题。
JAVA中文件压缩引起的乱码问题,是由于Java编码以Unicode 为基础的,所以ZipOutputStream(还有ZipInputStream) 处理压缩工作时,就以Unicode来处理中文。 所以为了能在压缩(或解压)时,不让其产生乱码问题,就得...
只支持zip压缩包的解压,支持压缩包内中文路径、回调有进度条和正在解压的名字 ******************************** 重要说明:该压缩包内的是两个工具类,不是完整的demo。 实现方法:实现回调接口,调用解压方法即可
在Java中通过ZipFile解析Android apk 压缩文件,获取版本号等信息,获取的manifest文件格式无法识别为xml,导致无法解析,该jar文件用来处理乱码文件,apk压缩文件解压缩乱码问题
时间紧迫,暂时存在中文文件夹名称乱码问题 不影响文件夹内各类型文件内容 实现方法见功能说明txt文档,只需传入文件夹路径,Zip文件路径,密码 本人JAVA实习生,因业务需求研究此方法,代码质量不高,只为了实现...
java中使用ZipEntry对文件目录下的所有文件进行压缩,已解决中文乱码问题,亲测可用,请放心下载。