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