上篇文章实现了文件夹的打包,但是有一个问题,如果文件夹中包含中文文件,会出现乱码的情况,所以今天我们使用apache中的ant包,此包中的方法目前已经支持中文了,可避免出现乱码的情况发生,代码如下
public class DeCompressUtil {
/**
* 将文件夹压缩成 zip格式压缩包
*/
public static void compressZip(String pathName , String srcPathName)
throws Exception {
File zipFile = new File(pathName);
File srcdir = new File(srcPathName);
if (!srcdir.exists())
throw new RuntimeException(srcPathName + "不存在!");
Project prj = new Project();
Zip zip = new Zip();
zip.setProject(prj);
zip.setDestFile(zipFile);
FileSet fileSet = new FileSet();
fileSet.setProject(prj);
fileSet.setDir(srcdir);
zip.addFileset(fileSet);
zip.execute();
}
/**
* 解压zip格式压缩包 对应的是ant.jar
*/
private static void unzip(String sourceZip, String destDir, boolean loop)
throws Exception {
try {
Project p = new Project();
Expand e = new Expand();
e.setProject(p);
File sorfile = new File(sourceZip);
e.setSrc(sorfile);
e.setOverwrite(false);
e.setDest(new File(destDir));
/*
*
* ant下的zip工具默认压缩编码为UTF-8编码,
*
* 而winRAR软件压缩是用的windows默认的GBK或者GB2312编码
*
* 所以解压缩时要制定编码格式
*/
e.setEncoding("GB2312"); // 根据linux系统的实际编码设置
e.execute();
sorfile.delete();
} catch (Exception e) {
throw e;
}
}
/**
* 解压rar格式压缩包。
* 对应的是java-unrar-0.3.jar,但是java-unrar-0.3.jar又会用到commons-logging-1.1.1.jar
*/
private static void unrar(String sourceRar, String destDir, boolean loop)
throws Exception {
Archive a = null;
FileOutputStream fos = null;
try {
File sorfile = new File(sourceRar);
a = new Archive(sorfile);
FileHeader fh = a.nextFileHeader();
while (fh != null) {
if (!fh.isDirectory()) {
// 1 根据不同的操作系统拿到相应的 destDirName 和 destFileName
// String compressFileName = fh.getFileNameString().trim();
String compressFileName = fh.getFileNameW().trim();
if (!existZH(compressFileName)) {
compressFileName = fh.getFileNameString().trim();
}
String destFileName = "";
String destDirName = "";
// 非windows系统
if (File.separator.equals("/")) {
destFileName = destDir
+ compressFileName.replaceAll("\\\\", "/");
destDirName = destFileName.substring(0,
destFileName.lastIndexOf("/"));
// windows系统
} else {
destFileName = destDir
+ compressFileName.replaceAll("/", "\\\\");
destDirName = destFileName.substring(0,
destFileName.lastIndexOf("\\"));
}
// 2创建文件夹
File dir = new File(destDirName);
if (!dir.exists() || !dir.isDirectory()) {
dir.mkdirs();
}
// 3解压缩文件
fos = new FileOutputStream(new File(destFileName));
a.extractFile(fh, fos);
fos.close();
fos = null;
}
fh = a.nextFileHeader();
}
a.close();
a = null;
sorfile.delete();
//
} catch (Exception e) {
throw e;
} finally {
if (fos != null) {
try {
fos.close();
fos = null;
} catch (Exception e) {
e.printStackTrace();
}
}
if (a != null) {
try {
a.close();
a = null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private static boolean existZH(String str) {
String regEx = "[\\u4e00-\\u9fa5]";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
while (m.find()) {
return true;
}
return false;
}
/**
* 解压缩
*/
public static void deCompress(String sourceFile, String destDir,
boolean loop) throws Exception {
// 保证文件夹路径最后是"/"或者"\"
char lastChar = destDir.charAt(destDir.length() - 1);
if (lastChar != '/' && lastChar != '\\') {
destDir += File.separator;
}
// 根据类型,进行相应的解压缩
String type = sourceFile.substring(sourceFile.lastIndexOf(".") + 1);
if (type.equalsIgnoreCase("zip")) {
unzip(sourceFile, destDir, loop);
} else if (type.equalsIgnoreCase("rar")) {
unrar(sourceFile, destDir, loop);
} else {
throw new Exception("只支持zip和rar格式的压缩包!");
}
}
public static void main(String[] args) throws Exception {
// long time = System.currentTimeMillis();
// System.err.println("start:" + time);
// try {
// deCompress("D:\\logs\\CA_SZX.rar", "D:\\logs\\test", false);
// } catch (Exception e) {
// e.printStackTrace();
// }
// System.err.println("end:" + (System.currentTimeMillis() - time));
compressZip("D:\\test.zip", "D:\\temp_upload");
}
}