java压缩解压缩rar、zip 、tar文件 工具类源码

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" );
          
     }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值