java压缩解压缩rar、zip文件

jopen 11年前

package com.test;  import java.io.BufferedInputStream;  import java.io.BufferedOutputStream;  import java.io.File;  import java.io.FileInputStream;  import java.io.FileOutputStream;  import java.io.IOException;  import java.io.InputStream;    import org.apache.tools.tar.TarEntry;  import org.apache.tools.tar.TarOutputStream;  import org.apache.tools.zip.ZipEntry;  import org.apache.tools.zip.ZipFile;  import org.apache.tools.zip.ZipOutputStream;    import de.innosystec.unrar.Archive;    /**    * @author Every E-mail/MSN:mwgjkf@hotmail.com   *   QQ:30130942   * @version 创建时间:Feb 26, 2009 6:01:11 PM    * 类说明:压缩、解压文件公用类   *   */  public class Test {   private static final int BUFFEREDSIZE = 1024;   public Test() {    // TODO Auto-generated constructor stub   }     /**       * 解压zip格式的压缩文件到当前文件夹       * @param zipFileName       * @throws Exception       */      @SuppressWarnings("unchecked")      public synchronized void unzipFile(String zipFileName) throws Exception {       try {        File f = new File(zipFileName);        ZipFile zipFile = new ZipFile(zipFileName);        if((!f.exists()) && (f.length() <= 0)) {         throw new Exception("要解压的文件不存在!");        }        String strPath, gbkPath, strtemp;        File tempFile = new File(f.getParent());        strPath = tempFile.getAbsolutePath();        java.util.Enumeration e = zipFile.getEntries();        while(e.hasMoreElements()){         org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e.nextElement();         gbkPath=zipEnt.getName();         if(zipEnt.isDirectory()){          strtemp = strPath + "/" + gbkPath;          File dir = new File(strtemp);          dir.mkdirs();          continue;         } else {          //读写文件          InputStream is = zipFile.getInputStream(zipEnt);          BufferedInputStream bis = new BufferedInputStream(is);          gbkPath=zipEnt.getName();          strtemp = strPath + "/" + gbkPath;                //建目录          String strsubdir = gbkPath;          for(int i = 0; i < strsubdir.length(); i++) {           if(strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {            String temp = strPath + "/" + strsubdir.substring(0, i);            File subdir = new File(temp);            if(!subdir.exists())            subdir.mkdir();           }          }          FileOutputStream fos = new FileOutputStream(strtemp);          BufferedOutputStream bos = new BufferedOutputStream(fos);          int c;          while((c = bis.read()) != -1) {           bos.write((byte) c);          }          bos.close();          fos.close();         }        }       } catch(Exception e) {        e.printStackTrace();        throw e;       }      }         /**    * 解压zip格式的压缩文件到指定位置    * @param zipFileName 压缩文件    * @param extPlace 解压目录    * @throws Exception    */   @SuppressWarnings("unchecked")   public synchronized void unzip(String zipFileName, String extPlace) throws Exception {    try {        (new File(extPlace)).mkdirs();        File f = new File(zipFileName);        ZipFile zipFile = new ZipFile(zipFileName);        if((!f.exists()) && (f.length() <= 0)) {         throw new Exception("要解压的文件不存在!");        }        String strPath, gbkPath, strtemp;        File tempFile = new File(extPlace);        strPath = tempFile.getAbsolutePath();        java.util.Enumeration e = zipFile.getEntries();        while(e.hasMoreElements()){         org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e.nextElement();         gbkPath=zipEnt.getName();         if(zipEnt.isDirectory()){          strtemp = strPath + File.separator + gbkPath;          File dir = new File(strtemp);          dir.mkdirs();          continue;         } else {          //读写文件          InputStream is = zipFile.getInputStream(zipEnt);          BufferedInputStream bis = new BufferedInputStream(is);          gbkPath=zipEnt.getName();          strtemp = strPath + File.separator + gbkPath;                //建目录          String strsubdir = gbkPath;          for(int i = 0; i < strsubdir.length(); i++) {           if(strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {            String temp = strPath + File.separator + strsubdir.substring(0, i);            File subdir = new File(temp);            if(!subdir.exists())            subdir.mkdir();           }          }          FileOutputStream fos = new FileOutputStream(strtemp);          BufferedOutputStream bos = new BufferedOutputStream(fos);          int c;          while((c = bis.read()) != -1) {           bos.write((byte) c);          }          bos.close();          fos.close();         }        }       } catch(Exception e) {        e.printStackTrace();        throw e;       }   }      /**    * 解压zip格式的压缩文件到指定位置    * @param zipFileName 压缩文件    * @param extPlace 解压目录    * @throws Exception    */   @SuppressWarnings("unchecked")   public synchronized void unzip(String zipFileName, String extPlace,boolean whether) throws Exception {    try {        (new File(extPlace)).mkdirs();        File f = new File(zipFileName);        ZipFile zipFile = new ZipFile(zipFileName);        if((!f.exists()) && (f.length() <= 0)) {         throw new Exception("要解压的文件不存在!");        }        String strPath, gbkPath, strtemp;        File tempFile = new File(extPlace);        strPath = tempFile.getAbsolutePath();        java.util.Enumeration e = zipFile.getEntries();        while(e.hasMoreElements()){         org.apache.tools.zip.ZipEntry zipEnt = (ZipEntry) e.nextElement();         gbkPath=zipEnt.getName();         if(zipEnt.isDirectory()){          strtemp = strPath + File.separator + gbkPath;          File dir = new File(strtemp);          dir.mkdirs();          continue;         } else {          //读写文件          InputStream is = zipFile.getInputStream(zipEnt);          BufferedInputStream bis = new BufferedInputStream(is);          gbkPath=zipEnt.getName();          strtemp = strPath + File.separator + gbkPath;                //建目录          String strsubdir = gbkPath;          for(int i = 0; i < strsubdir.length(); i++) {           if(strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) {            String temp = strPath + File.separator + strsubdir.substring(0, i);            File subdir = new File(temp);            if(!subdir.exists())            subdir.mkdir();           }          }          FileOutputStream fos = new FileOutputStream(strtemp);          BufferedOutputStream bos = new BufferedOutputStream(fos);          int c;          while((c = bis.read()) != -1) {           bos.write((byte) c);          }          bos.close();          fos.close();         }        }       } catch(Exception e) {        e.printStackTrace();        throw e;       }   }   /**    * 压缩zip格式的压缩文件    * @param inputFilename 压缩的文件或文件夹及详细路径    * @param zipFilename 输出文件名称及详细路径    * @throws IOException    */   public synchronized void zip(String inputFilename, String zipFilename) throws IOException {    zip(new File(inputFilename), zipFilename);   }      /**    * 压缩zip格式的压缩文件    * @param inputFile 需压缩文件    * @param zipFilename 输出文件及详细路径    * @throws IOException    */   public synchronized void zip(File inputFile, String zipFilename) throws IOException {    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFilename));    try {     zip(inputFile, out, "");    } catch (IOException e) {     throw e;    } finally {     out.close();    }   }      /**    * 压缩zip格式的压缩文件    * @param inputFile 需压缩文件    * @param out 输出压缩文件    * @param base 结束标识    * @throws IOException    */   @SuppressWarnings("unused")   private synchronized void zip(File inputFile, ZipOutputStream out, String base) throws IOException {    if (inputFile.isDirectory()) {     File[] inputFiles = inputFile.listFiles();     out.putNextEntry(new ZipEntry(base + "/"));     base = base.length() == 0 ? "" : base + "/";     for (int i = 0; i < inputFiles.length; i++) {      zip(inputFiles[i], out, base + inputFiles[i].getName());     }    } else {     if (base.length() > 0) {      out.putNextEntry(new ZipEntry(base));     } else {      out.putNextEntry(new ZipEntry(inputFile.getName()));     }     FileInputStream in = new FileInputStream(inputFile);     try {      int c;      byte[] by = new byte[BUFFEREDSIZE];      while ((c = in.read(by)) != -1) {       out.write(by, 0, c);      }     } catch (IOException e) {      throw e;     } finally {      in.close();     }    }   }           /**       * 解压tar格式的压缩文件到指定目录下       * @param tarFileName 压缩文件       * @param extPlace 解压目录       * @throws Exception       */   public synchronized void untar(String tarFileName, String extPlace) throws Exception{       }      /**    * 压缩tar格式的压缩文件    * @param inputFilename 压缩文件    * @param tarFilename 输出路径    * @throws IOException    */   public synchronized void tar(String inputFilename, String tarFilename) throws IOException{    tar(new File(inputFilename), tarFilename);   }      /**    * 压缩tar格式的压缩文件    * @param inputFile 压缩文件    * @param tarFilename 输出路径    * @throws IOException    */   public synchronized void tar(File inputFile, String tarFilename) throws IOException{    TarOutputStream out = new TarOutputStream(new FileOutputStream(tarFilename));    try {     tar(inputFile, out, "");    } catch (IOException e) {     throw e;    } finally {     out.close();    }   }      /**    * 压缩tar格式的压缩文件    * @param inputFile 压缩文件    * @param out 输出文件     * @param base 结束标识    * @throws IOException    */   @SuppressWarnings("unused")   private synchronized void tar(File inputFile, TarOutputStream out, String base) throws IOException {    if (inputFile.isDirectory()) {     File[] inputFiles = inputFile.listFiles();     out.putNextEntry(new TarEntry(base + "/"));     base = base.length() == 0 ? "" : base + "/";     for (int i = 0; i < inputFiles.length; i++) {      tar(inputFiles[i], out, base + inputFiles[i].getName());     }    } else {     if (base.length() > 0) {      out.putNextEntry(new TarEntry(base));     } else {      out.putNextEntry(new TarEntry(inputFile.getName()));     }     FileInputStream in = new FileInputStream(inputFile);     try {      int c;      byte[] by = new byte[BUFFEREDSIZE];      while ((c = in.read(by)) != -1) {       out.write(by, 0, c);      }     } catch (IOException e) {      throw e;     } finally {      in.close();     }    }   }       /**       * 解压rar格式的压缩文件到指定目录下       * @param rarFileName 压缩文件       * @param extPlace 解压目录       * @throws Exception       */   public synchronized void unrar(String rarFileName, String extPlace) throws Exception{    try {     (new File(extPlace)).mkdirs();     // 构建测解压缩类     Archive archive = new Archive();     archive.setEnabledLog(false); //不输出日志     // 设置rar文件     archive.setFile(rarFileName);     archive.setExtractPath(extPlace);     archive.extractAllFile();    } catch (Exception e) {     // TODO: handle exception    }   }      /**    * 执行实例    * @param args    */   public static void main(String[] args) throws Exception {    Test decompression=new Test();    //decompression.unzipFile("d:/Inetpub.zip");    //decompression.unzip("d:/Inetpub.zip","d://Inetpub");    //decompression.zip("c:/Inetpub", "c:/Inetpub.zip");    decompression.unrar("d:/FSCapture62.rar", "d:/FSCapture62");       }  }