package
decompress;
import
java.io.File;
import
java.io.FileOutputStream;
import
org.apache.tools.ant.Project;
import
org.apache.tools.ant.taskdefs.Expand;
import
de.innosystec.unrar.Archive;
import
de.innosystec.unrar.rarfile.FileHeader;
public class DeCompressUtil
{
/**
*
解压zip格式压缩包
*
对应的是ant.jar
*/
private static void
unzip(String sourceZip,String destDir) throws Exception{
try{
Project
p = new Project();
Expand
e = new Expand();
e.setProject(p);
e.setSrc(new File(sourceZip));
e.setOverwrite(false);
e.setDest(new File(destDir));
/*
ant下的zip工具默认压缩编码为UTF-8编码,
而winRAR软件压缩是用的windows默认的GBK或者GB2312编码
所以解压缩时要制定编码格式
*/
e.setEncoding("gbk");
e.execute();
}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) throws Exception{
Archive
a = null;
FileOutputStream
fos = null;
try{
a
= new Archive(new File(sourceRar));
FileHeader
fh = a.nextFileHeader();
while(fh!=null){
if(!fh.isDirectory()){
//1
根据不同的操作系统拿到相应的 destDirName 和 destFileName
String
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;
}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();}
}
}
}
/**
*
解压缩
*/
public static void
deCompress(String sourceFile,String destDir) throws Exception{
//保证文件夹路径最后是"/"或者"\"
char
lastChar = destDir.charAt(destDir.length()-1);
if(lastChar!=‘/‘&&lastChar!=‘\\‘){
destDir
+= File.separator;
}
//根据类型,进行相应的解压缩
String
type = sourceFile.substring(sourceFile.lastIndexOf(".")+1);
if(type.equals("zip")){
DeCompressUtil.unzip(sourceFile,
destDir);
}else if(type.equals("rar")){
DeCompressUtil.unrar(sourceFile,
destDir);
}else{
throw new Exception("只支持zip和rar格式的压缩包!");
}
}
}