用java压缩及解压文件 AntZip

用java压缩文件 AntZip
package com.bis;

import java.io.*;
import java.util.*;
import org.apache.tools.zip.*;

public class AntZip
{
 private int count_file = 0;
 private int count_dir = 0;
 private boolean debug = false;

 public void setDebug( boolean isDebug )
 {
  debug = isDebug;
 }

 /**
  * 压缩。
  * @param src 源文件或者目录
  * @param dest 压缩文件路径
  * @throws IOException
  */
 public void zip( String src, String dest )
  throws IOException
 {
  long startTime = System.currentTimeMillis();

  ZipOutputStream out = null;
  try
  {
   File outFile = new File( dest );
   out = new ZipOutputStream( outFile );
   File fileOrDirctory = new File( src );

   zipFileOrDirectory( out , fileOrDirctory , "" );
  }
  catch( IOException ex )
  {
   ex.printStackTrace();
  }
  finally
  {
   if( out != null )
   {
    try{ out.close(); } catch( IOException ex ){}
   }
  }

  if( debug )
  {
   long endTime = System.currentTimeMillis();
   System.out.println();
   System.out.println("压缩" + count_file + "个文件." );
   System.out.println("压缩" + count_dir + "个文件夹." );
   System.out.println("用时:" + (double)( endTime - startTime )/1000 + "秒." );
  }
 }

 /**
  * 递归压缩文件或目录
  * @param out 压缩输出流对象
  * @param fileOrDirectory 要压缩的文件或目录对象
  * @param curPath 当前压缩条目的路径,用于指定条目名称的前缀
  * @throws IOException
  */
 private void zipFileOrDirectory( ZipOutputStream out, File fileOrDirectory, String curPath )
  throws IOException
 {
  FileInputStream in = null;
  try
  {
   if( debug )
    System.out.println("zip:"+fileOrDirectory);


   if(!fileOrDirectory.isDirectory())
   {
    count_file++ ;

    //压缩文件
    byte[] buffer = new byte[4096];
    int bytes_read;
    in = new FileInputStream( fileOrDirectory );

    ZipEntry entry = new ZipEntry( curPath + fileOrDirectory.getName() );
    out.putNextEntry( entry );

    while( (bytes_read = in.read(buffer)) != -1 )
    {
     out.write( buffer, 0, bytes_read );
    }
    out.closeEntry();
   }
   else
   {
    count_dir++;

    //压缩目录
    File[] entries = fileOrDirectory.listFiles();
    for(int i = 0; i < entries.length; i++)
    {
     //递归压缩,更新curPaths
     zipFileOrDirectory( out, entries[i], curPath + fileOrDirectory.getName() + "/");
    }
   }
  }
  catch( IOException ex )
  {
   ex.printStackTrace();
   throw ex;
  }
  finally
  {
   if( in != null )
   {
    try{ in.close(); } catch( IOException ex ){}
   }
  }
 }


 /**
  * 解压缩。
  * @param zipFileName 源文件
  * @param outputDirectory 解压缩后文件存放的目录
  * @throws IOException
  */
 public void unzip( String zipFileName , String outputDirectory )
  throws IOException
 {

  long startTime = System.currentTimeMillis();

  ZipFile zipFile = null;

 
  try
  {
   zipFile = new ZipFile( zipFileName );
   Enumeration e = zipFile.getEntries();

   ZipEntry zipEntry = null;

   File dest = new File( outputDirectory );
   dest.mkdirs();

   while( e.hasMoreElements() )
   {
    zipEntry = (ZipEntry)e.nextElement();

    String entryName = zipEntry.getName();

    if( debug )
     System.out.println("unzip:"+entryName );

    InputStream in = null;
    FileOutputStream out = null;

    try
    {
     if( zipEntry.isDirectory() )
     {
      count_dir++;

      String name = zipEntry.getName();
      name = name.substring(0,name.length()-1);

      File f = new File( outputDirectory+File.separator+name );
      f.mkdirs();
     }
     else
     {
      count_file++;

      int index = entryName.lastIndexOf( "/" );
      if( index != -1 )
      {
       File df = new File( outputDirectory + File.separator + entryName.substring( 0 , index ) );
       df.mkdirs();
      }

      File f = new File( outputDirectory + File.separator + zipEntry.getName() );
 //     f.createNewFile();
      in = zipFile.getInputStream( zipEntry );
      out = new FileOutputStream( f );

      int c;
      byte[] by = new byte[1024];

      while( (c = in.read(by)) != -1 )
      {
       out.write(by,0,c);
      }
      out.flush();
     }
    }
    catch(IOException ex)
    {
     ex.printStackTrace();
     throw new IOException( "解压失败:" + ex.toString() );
    }
    finally
    {
     if( in != null )
     {
      try{ in.close(); }catch( IOException ex ){}
     }
     if( out != null )
     {
      try{ out.close(); } catch( IOException ex ){}
     }
    }
   }

   if( debug )
   {
    long endTime = System.currentTimeMillis();
    System.out.println();
    System.out.println("解压" + count_file + "个文件." );
    System.out.println("解压" + count_dir + "个文件夹." );
    System.out.println("用时:" + (double)(endTime - startTime)/1000 + "秒." );
   }
   System.out.println("解压完毕!!");
  }
  catch( IOException ex )
  {
   ex.printStackTrace();
   throw new IOException( "解压失败:" + ex.toString() );
  }
  finally
  {
   if( zipFile != null )
   {
    try{ zipFile.close(); } catch( IOException ex ){}
   }
  }

 }

 public static void main( String[] args )
 {
  try
  {
   AntZip az = new AntZip();

   az.setDebug(true);

//   az.unzip("d://com.zip", "d://temp");
   az.unzip("d://test22.zip", "d://temp");

//   az.zip( "d://temp" , "d://test22.zip" );
  }
  catch(Exception e)
  {
   e.printStackTrace() ;
  }
 }
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值