java壓縮解壓縮rar、zip文件

jopen 11年前發布 | 81K 次閱讀 Java Java開發

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");

}

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!