- 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格式的压缩包!");
- }
- }
- }