关于java解压缩文件(rar或者zip)的实现示例

import java . io . File ;
import java . io . FileInputStream ;
import java . io . FileOutputStream ;
import java . io . IOException ;
import java . io . InputStream ;
import java . util . Enumeration ;
import org . apache . tools . zip . ZipEntry ;
import org . apache . tools . zip . ZipFile ;
import org . apache . tools . zip . ZipOutputStream ;

/**
* <p>
* Title: 解压缩文件
* </p>
* <p>
* Description: 通过apache的zip工具实现解压缩
* </p>
* <p>
* Copyright: Copyright (c) 2010
* </p>
* <p>
* Company: yourcompany
* </p>
*
* @author yourcompany
* @version 1.0
*/
public class CompressFile {
private static CompressFile instance = new CompressFile ();

private CompressFile () {
}

public static CompressFile getInstance () {
return instance ;
}

/**
* 压缩文件或者文件目录到指定的zip或者rar包
*
* @param inputFilename
* 要压缩的文件或者文件夹,如果是文件夹的话,会将文件夹下的所有文件包含子文件夹的内容进行压缩
* @param zipFilename
* 生成的zip或者rar文件的名称
*/
public synchronized void zip ( String inputFilename , String zipFilename )
throws IOException {
zip ( new File ( inputFilename ), zipFilename );
}

/**
* 压缩文件或者文件目录到指定的zip或者rar包,内部调用
*
* @param inputFile
* 参数为文件类型的要压缩的文件或者文件夹
* @param zipFilename
* 生成的zip或者rar文件的名称
* @return void
*/
private 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或者rar包
*
* @param inputFile
* 参数为文件类型的要压缩的文件或者文件夹
* @param out
* 输出流
* @param base
* 基文件夹
* @return void
*/
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 ();
}
}
}

/**
* 解压zip或者rar包的内容到指定的目录下,可以处理其文件夹下包含子文件夹的情况
*
* @param zipFilename
* 要解压的zip或者rar包文件
* @param outputDirectory
* 解压后存放的目录
*/
public synchronized void unzip ( String zipFilename , String outputDirectory )
throws IOException {
File outFile = new File ( outputDirectory );
if (! outFile . exists ()) {
outFile . mkdirs ();
}

ZipFile zipFile = new ZipFile ( zipFilename );
Enumeration en = zipFile . getEntries ();
ZipEntry zipEntry = null ;
while ( en . hasMoreElements ()) {
zipEntry = ( ZipEntry ) en . nextElement ();
if ( zipEntry . isDirectory ()) {
// mkdir directory
String dirName = zipEntry . getName ();
// System.out.println("=dirName is:=" + dirName + "=end=");
dirName = dirName . substring ( 0 , dirName . length () - 1 );
File f = new File ( outFile . getPath () + File . separator + dirName );
f . mkdirs ();
} else {
// unzip file
String strFilePath = outFile . getPath () + File . separator
+ zipEntry . getName ();
File f = new File ( strFilePath );

// the codes remedified by can_do on 2010-07-02 =begin=
// /begin/
// 判断文件不存在的话,就创建该文件所在文件夹的目录
if (! f . exists ()) {
String [] arrFolderName = zipEntry . getName (). split ( "/" );
String strRealFolder = "" ;
for ( int i = 0 ; i < ( arrFolderName . length - 1 ); i ++) {
strRealFolder += arrFolderName [ i ] + File . separator ;
}
strRealFolder = outFile . getPath () + File . separator
+ strRealFolder ;
File tempDir = new File ( strRealFolder );
// 此处使用.mkdirs()方法,而不能用.mkdir()
tempDir . mkdirs ();
}
// /end///
// the codes remedified by can_do on 2010-07-02 =end=
f . createNewFile ();
InputStream in = zipFile . getInputStream ( zipEntry );
FileOutputStream out = new FileOutputStream ( f );
try {
int c ;
byte [] by = new byte [ BUFFEREDSIZE ];
while (( c = in . read ( by )) != - 1 ) {
out . write ( by , 0 , c );
}
// out.flush();
} catch ( IOException e ) {
throw e ;
} finally {
out . close ();
in . close ();
}
}
}
}

private static final int BUFFEREDSIZE = 1024 ;

public static void main ( String [] args ) {
CompressFile bean = new CompressFile ();
try {
boolean isZip = false ;
if ( isZip ) {
bean . zip ( "E:\\20100707" , "d:/test_rar.zip" );
} else {
bean . unzip ( "d:/test_rar.zip" , "D:/temp" );
}
} catch ( IOException e ) {
e . printStackTrace ();
}
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值