java解压zip rar文件实例

jopen 10年前

 package com.tservice.mrn.common;    import java.io.*;  import java.util.Enumeration;    import org.apache.tools.ant.Project;  import org.apache.tools.ant.taskdefs.Expand;  import org.apache.tools.zip.*;    import com.github.junrar.Archive;  import com.github.junrar.rarfile.FileHeader;      public abstract class ZipUtils {     private static final int BUFFEREDSIZE = 1024;     /**    * @SuppressWarnings({ "rawtypes", "resource" }) public static String    *                     unzip(File zipFile, String unzipDir, String    *                     zipFileName) throws IOException { ZipFile zf = new    *                     ZipFile(zipFile); Enumeration enu = zf.entries();    *                     String result = ""; while (enu.hasMoreElements()) {    *                     ZipEntry entry = (ZipEntry) enu.nextElement(); String    *                     name = entry.getName(); //    *                     如果解压entry是目录,直接生成目录即可,不用写入,如果是文件,要将文件写入 String    *                     pathParent = unzipDir + "/" + zipFileName; if (!(new    *                     File(pathParent).exists())) new    *                     File(pathParent).mkdirs(); String path = pathParent +    *                     "/" + name; result = result + path + "<br/>    *                     "; File file = new File(path); if    *                     (entry.isDirectory()) { file.mkdir(); } else { //    *                     建议使用如下方式创建流和读取字节,不然会有乱码 InputStream is =    *                     zf.getInputStream(entry); byte[] buf1 = new    *                     byte[1024]; int len; if (!file.exists()) {    *                     file.getParentFile().mkdirs(); file.createNewFile();    *                     } OutputStream out = new FileOutputStream(file);    *                     while ((len = is.read(buf1)) > 0) { String buf = new    *                     String(buf1, 0, len); out.write(buf1, 0, len); } } }    *                     result = "文件解压成功,解压文件:/n" + result; return result; }    **/     /**    * 解压zip或者rar包的内容到指定的目录下,可以处理其文件夹下包含子文件夹的情况    *    * @param zipFilename    *            要解压的zip或者rar包文件    * @param outputDirectory    *            解压后存放的目录    *    */   public static void unzipZipRar(String zipFilename, String outputDirectory)     throws Exception {    File outFile = new File(outputDirectory);    if (!outFile.exists()) {     outFile.mkdirs();    }      ZipFile zipFile = new ZipFile(zipFilename);    @SuppressWarnings("rawtypes")    Enumeration en = zipFile.getEntries();    ZipEntry zipEntry = null;    while (en.hasMoreElements()) {     zipEntry = (ZipEntry) en.nextElement();     if (zipEntry.isDirectory()) {      // mkdir directory      String dirName = zipEntry.getName();      // System.out.println("=dirName is:=" + dirName + "=end=");      dirName = dirName.substring(0, dirName.length() - 1);      File f = new File(outFile.getPath() + File.separator + dirName);      f.mkdirs();     } else {      // unzip file      String strFilePath = outFile.getPath() + File.separator        + zipEntry.getName();      File f = new File(strFilePath);        // 判断文件不存在的话,就创建该文件所在文件夹的目录      if (!f.exists()) {       String[] arrFolderName = zipEntry.getName().split("/");       String strRealFolder = "";       for (int i = 0; i < (arrFolderName.length - 1); i++) {        strRealFolder += arrFolderName[i] + File.separator;       }       strRealFolder = outFile.getPath() + File.separator         + strRealFolder;       File tempDir = new File(strRealFolder);       // 此处使用.mkdirs()方法,而不能用.mkdir()       tempDir.mkdirs();      }      // the codes remedified by can_do on 2010-07-02 =end=      f.createNewFile();      InputStream in = zipFile.getInputStream(zipEntry);      FileOutputStream out = new FileOutputStream(f);      try {       int c;       byte[] by = new byte[BUFFEREDSIZE];       while ((c = in.read(by)) != -1) {        out.write(by, 0, c);       }       // out.flush();      } catch (IOException e) {       throw e;      } finally {       out.close();       in.close();      }     }    }   }     /**   /**    * 解压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")) {     ZipUtils.unzip(sourceFile, destDir);    } else if (type.equals("rar")) {     ZipUtils.unrar(sourceFile, destDir);    } else {     throw new Exception("只支持zip和rar格式的压缩包!");    }   }    }