用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() ;
}
}
}