java 解压缩 ant_java ant 压缩与解压缩

以下本文来自:

http://blog.csdn.net/lr5200/article/details/6606518

其他参考:

http://lj6684.iteye.com/blog/901378

http://hi.baidu.com/xghrbc1001/blog/item/884b5afafe0371909f514657.html

利用Apache ant.jar中的zip包进行Zip压缩和解压

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.Enumeration;

import java.util.zip.CRC32;

import java.util.zip.CheckedOutputStream;

import org.apache.tools.zip.ZipEntry;

import org.apache.tools.zip.ZipFile;

import org.apache.tools.zip.ZipOutputStream;

/**

* 利用Apache ant.jar中的zip包进行Zip压缩和解压

*/

public class XZouZip {

/**

* 测试压缩

*/

public void testZip(){

File srcFile = new File("c:/upload");//要压缩的文件对象

File targetZipFile = new File("c:/upload.zip");//压缩后的文件名

ZipOutputStream out = null;

boolean boo = false;//是否压缩成功

try{

CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(

targetZipFile), new CRC32());

out = new ZipOutputStream(cos);

//out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream("c:/uploadd.zip")));

zip(srcFile, out, "", true);

boo = true;

}catch(IOException ex){

throw new RuntimeException(ex);

}finally{

try{

if(out!=null)

out.close();

}catch(IOException ex){

throw new RuntimeException("关闭Zip输出流出现异常",ex);

}finally{

//清理操作

if(!boo && targetZipFile.exists())//压缩不成功,

targetZipFile.delete();

}

}

}

/**

* 测试解压缩

*/

public void testUnZip(){

File srcZipFile = new File("c:/upload.zip");//要解压缩的zip文件对象

String destDir = "c:/a";//将解压文件对象放置a目录中

boolean boo = false;//是否压缩成功

try {

unZip(srcZipFile,destDir);

boo = true;

} catch (IOException e) {

throw new RuntimeException(e);

}finally{

//清理操作

if(!boo)

deleteDirectory(new File(destDir));//目标文件夹 。清理

}

}

public static void main(String[] args) throws IOException {

XZouZip tool = new XZouZip();

tool.testZip();

//tool.testUnZip();

}

/**

* 压缩zip文件

* @param file 压缩的文件对象

* @param out 输出ZIP流

* @param dir 相对父目录名称

* @param boo 是否把空目录压缩进去

*/

public void zip(File file,ZipOutputStream out,String dir,boolean boo) throws IOException{

if(file.isDirectory()){//是目录

File []listFile = file.listFiles();//得出目录下所有的文件对象

if(listFile.length == 0 && boo){//空目录压缩

out.putNextEntry(new ZipEntry(dir + file.getName() + "/"));//将实体放入输出ZIP流中

System.out.println("压缩." + dir + file.getName() + "/");

return;

}else{

for(File cfile: listFile){

zip(cfile,out,dir + file.getName() + "/",boo);//递归压缩

}

}

}else if(file.isFile()){//是文件

System.out.println("压缩." + dir + file.getName() + "/");

byte[] bt = new byte[2048*2];

ZipEntry ze = new ZipEntry(dir+file.getName());//构建压缩实体

//设置压缩前的文件大小

ze.setSize(file.length());

out.putNextEntry(ze);将实体放入输出ZIP流中

FileInputStream fis = null;

try{

fis = new FileInputStream(file);

int i=0;

while((i = fis.read(bt)) != -1) {//循环读出并写入输出Zip流中

out.write(bt, 0, i);

}

}catch(IOException ex){

throw new IOException("写入压缩文件出现异常",ex);

}finally{

try{

if (fis != null)

fis.close();//关闭输入流

}catch(IOException ex){

throw new IOException("关闭输入流出现异常");

}

}

}

}

/**

* 解压缩zipFile

* @param file 要解压的zip文件对象

* @param outputDir 要解压到某个指定的目录下

* @throws IOException

*/

public void unZip(File file,String outputDir) throws IOException {

ZipFile zipFile = null;

try {

zipFile = new ZipFile(file);

createDirectory(outputDir,null);//创建输出目录

Enumeration> enums = zipFile.getEntries();

while(enums.hasMoreElements()){

ZipEntry entry = (ZipEntry) enums.nextElement();

System.out.println("解压." + entry.getName());

if(entry.isDirectory()){//是目录

createDirectory(outputDir,entry.getName());//创建空目录

}else{//是文件

File tmpFile = new File(outputDir + "/" + entry.getName());

createDirectory(tmpFile.getParent() + "/",null);//创建输出目录

InputStream in = null;

OutputStream out = null;

try{

in = zipFile.getInputStream(entry);;

out = new FileOutputStream(tmpFile);

int length = 0;

byte[] b = new byte[2048];

while((length = in.read(b)) != -1){

out.write(b, 0, length);

}

}catch(IOException ex){

throw ex;

}finally{

if(in!=null)

in.close();

if(out!=null)

out.close();

}

}

}

} catch (IOException e) {

throw new IOException("解压缩文件出现异常",e);

} finally{

try{

if(zipFile != null){

zipFile.close();

}

}catch(IOException ex){

throw new IOException("关闭zipFile出现异常",ex);

}

}

}

/**

* 构建目录

* @param outputDir

* @param subDir

*/

public void createDirectory(String outputDir,String subDir){

File file = new File(outputDir);

if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空

file = new File(outputDir + "/" + subDir);

}

if(!file.exists()){

file.mkdirs();

}

}

/**

* 清理文件(目录或文件)

* @param file

*/

public void deleteDirectory(File file){

if(file.isFile()){

file.delete();//清理文件

}else{

File list[] = file.listFiles();

if(list!=null){

for(File f: list){

deleteDirectory(f);

}

file.delete();//清理目录

}

}

}

}

Ant 压缩与解压缩 (本人在使用的)

import java.io.File;

import org.apache.tools.ant.Project;

import org.apache.tools.ant.taskdefs.Expand;

import org.apache.tools.ant.taskdefs.Zip;

import org.apache.tools.ant.types.FileSet;

/**

* 利用Apache ant.jar中的ant包进行Zip压缩和解压

* 这个更为简单

*/

public class XZouZipByAnt {

public static void main(String[] args) {

XZouZipByAnt jzb = new XZouZipByAnt();

jzb.zip("c:/upload", "c:/upload.zip");

//jzb.unZip("c:/a", "c:/upload.zip");

}

/**

* 解压缩

* @param destDir 生成的目标目录下 c:/a

* @param sourceZip 源zip文件 c:/upload.zip

* 结果则是 将upload.zip文件解压缩到c:/a目录下

*/

public void unZip(String destDir,String sourceZip){

try {

Project prj1 = new Project();

Expand expand = new Expand();

expand.setProject(prj1);

expand.setSrc(new File(sourceZip));

expand.setOverwrite(false);//是否覆盖

File f = new File(destDir);

expand.setDest(f);

expand.execute();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 压缩

*

* @param sourceFile

* 压缩的源文件 如: c:/upload

* @param targetZip

* 生成的目标文件 如:c:/upload.zip

*/

public void zip(String sourceFile,String targetZip){

Project prj = new Project();

Zip zip = new Zip();

zip.setProject(prj);

zip.setDestFile(new File(targetZip));//设置生成的目标zip文件File对象

FileSet fileSet = new FileSet();

fileSet.setProject(prj);

fileSet.setDir(new File(sourceFile));//设置将要进行压缩的源文件File对象

//fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夹,只压缩目录中的所有java文件

//fileSet.setExcludes("**/*.java"); //排除哪些文件或文件夹,压缩所有的文件,排除java文件

zip.addFileset(fileSet);

zip.execute();

}

}

通过 Apache Tool 进行JAVA tar || tar.gz

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 java.io.OutputStream;

import java.util.zip.GZIPInputStream;

import java.util.zip.GZIPOutputStream;

import org.apache.tools.tar.TarEntry;

import org.apache.tools.tar.TarInputStream;

import org.apache.tools.tar.TarOutputStream;

/**

* 通过 Apache Tool 进行JAVA tar || tar.gz

*/

public class XZouTarAndGz {

/**

* 测试归档tar文件

*/

public File testTar(){

File srcFile = new File("c:/upload");//要归档的文件对象

File targetTarFile = new File("c:/upload.tar");//归档后的文件名

TarOutputStream out = null;

boolean boo = false;//是否压缩成功

try{

out = new TarOutputStream(new BufferedOutputStream(new FileOutputStream(targetTarFile)));

tar(srcFile, out, "", true);

boo = true;

//归档成功

return targetTarFile;

}catch(IOException ex){

throw new RuntimeException(ex);

}finally{

try{

if(out!=null)

out.close();

}catch(IOException ex){

throw new RuntimeException("关闭Tar输出流出现异常",ex);

}finally{

//清理操作

if(!boo && targetTarFile.exists())//归档不成功,

targetTarFile.delete();

}

}

}

/**

* 测试压缩归档tar.gz文件

*/

public void testTarGz(){

File tarFile = testTar();//生成的tar文件

File gzFile = new File(tarFile + ".gz");//将要生成的压缩文件

GZIPOutputStream out = null;

InputStream in = null;

boolean boo = false;//是否成功

try{

in = new FileInputStream(tarFile);

out = new GZIPOutputStream(new FileOutputStream(gzFile),1024 * 2);

byte b[] = new byte[1024 * 2];

int length = 0;

while( (length = in.read(b)) != -1 ){

out.write(b,0,length);

}

boo = true;

}catch(Exception ex){

throw new RuntimeException("压缩归档文件失败",ex);

}finally{

try{

if(out!=null)

out.close();

if(in!=null)

in.close();

}catch(IOException ex){

throw new RuntimeException("关闭流出现异常",ex);

}finally{

if(!boo){//清理操作

tarFile.delete();

if(gzFile.exists())

gzFile.delete();

}

}

}

}

/**

* 测试解压归档tar文件

*/

public void testUnTar(){

File srcTarFile = new File("c:/upload.tar");//要解压缩的tar文件对象

String destDir = "c:/XZou";//把解压的文件放置到c盘下的XZou目录下面

boolean boo = false;//是否压缩成功

try {

unTar(srcTarFile,destDir);

boo = true;

} catch (IOException e) {

throw new RuntimeException(e);

}finally{

//清理操作

if(!boo)

deleteDirectory(new File(destDir));//目标文件夹 。清理

}

}

/**

* 测试解压归档tar文件

*/

public void testUnTarGz(){

File srcTarGzFile = new File("c:/up.tar.gz");//要解压缩的tar.gz文件对象

String destDir = "c:/XZou";//把解压的文件放置到c盘下的XZou目录下面

boolean boo = false;//是否压缩成功

try {

unTarGz(srcTarGzFile,destDir);

boo = true;

} catch (IOException e) {

throw new RuntimeException(e);

}finally{

//清理操作

if(!boo)

deleteDirectory(new File(destDir));//目标文件夹 。清理

}

}

public static void main(String[] args) throws Exception {

XZouTarAndGz jtar = new XZouTarAndGz();

//jtar.testTar();

//jtar.testTarGz();

//jtar.testUnTar();

jtar.testUnTarGz();

}

/**

* 归档tar文件

* @param file 归档的文件对象

* @param out 输出tar流

* @param dir 相对父目录名称

* @param boo 是否把空目录归档进去

*/

public static void tar(File file,TarOutputStream out,String dir,boolean boo) throws IOException{

if(file.isDirectory()){//是目录

File []listFile = file.listFiles();//得出目录下所有的文件对象

if(listFile.length == 0 && boo){//空目录归档

out.putNextEntry(new TarEntry(dir + file.getName() + "/"));//将实体放入输出Tar流中

System.out.println("归档." + dir + file.getName() + "/");

return;

}else{

for(File cfile: listFile){

tar(cfile,out,dir + file.getName() + "/",boo);//递归归档

}

}

}else if(file.isFile()){//是文件

System.out.println("归档." + dir + file.getName() + "/");

byte[] bt = new byte[2048*2];

TarEntry ze = new TarEntry(dir+file.getName());//构建tar实体

//设置压缩前的文件大小

ze.setSize(file.length());

//ze.setName(file.getName());//设置实体名称.使用默认名称

out.putNextEntry(ze);将实体放入输出Tar流中

FileInputStream fis = null;

try{

fis = new FileInputStream(file);

int i=0;

while((i = fis.read(bt)) != -1) {//循环读出并写入输出Tar流中

out.write(bt, 0, i);

}

}catch(IOException ex){

throw new IOException("写入归档文件出现异常",ex);

}finally{

try{

if (fis != null)

fis.close();//关闭输入流

out.closeEntry();

}catch(IOException ex){

throw new IOException("关闭输入流出现异常");

}

}

}

}

/**

* 解压tar File

* @param file 要解压的tar文件对象

* @param outputDir 要解压到某个指定的目录下

* @throws IOException

*/

public void unTar(File file,String outputDir) throws IOException {

TarInputStream tarIn = null;

try{

tarIn = new TarInputStream(new FileInputStream(file),1024 * 2);

createDirectory(outputDir,null);//创建输出目录

TarEntry entry = null;

while( (entry = tarIn.getNextEntry()) != null ){

if(entry.isDirectory()){//是目录

createDirectory(outputDir,entry.getName());//创建空目录

}else{//是文件

File tmpFile = new File(outputDir + "/" + entry.getName());

createDirectory(tmpFile.getParent() + "/",null);//创建输出目录

OutputStream out = null;

try{

out = new FileOutputStream(tmpFile);

int length = 0;

byte[] b = new byte[2048];

while((length = tarIn.read(b)) != -1){

out.write(b, 0, length);

}

}catch(IOException ex){

throw ex;

}finally{

if(out!=null)

out.close();

}

}

}

}catch(IOException ex){

throw new IOException("解压归档文件出现异常",ex);

} finally{

try{

if(tarIn != null){

tarIn.close();

}

}catch(IOException ex){

throw new IOException("关闭tarFile出现异常",ex);

}

}

}

/**

* 解压tar.gz 文件

* @param file 要解压的tar.gz文件对象

* @param outputDir 要解压到某个指定的目录下

* @throws IOException

*/

public void unTarGz(File file,String outputDir) throws IOException{

TarInputStream tarIn = null;

try{

tarIn = new TarInputStream(new GZIPInputStream(

new BufferedInputStream(new FileInputStream(file))),

1024 * 2);

createDirectory(outputDir,null);//创建输出目录

TarEntry entry = null;

while( (entry = tarIn.getNextEntry()) != null ){

if(entry.isDirectory()){//是目录

createDirectory(outputDir,entry.getName());//创建空目录

}else{//是文件

File tmpFile = new File(outputDir + "/" + entry.getName());

createDirectory(tmpFile.getParent() + "/",null);//创建输出目录

OutputStream out = null;

try{

out = new FileOutputStream(tmpFile);

int length = 0;

byte[] b = new byte[2048];

while((length = tarIn.read(b)) != -1){

out.write(b, 0, length);

}

}catch(IOException ex){

throw ex;

}finally{

if(out!=null)

out.close();

}

}

}

}catch(IOException ex){

throw new IOException("解压归档文件出现异常",ex);

} finally{

try{

if(tarIn != null){

tarIn.close();

}

}catch(IOException ex){

throw new IOException("关闭tarFile出现异常",ex);

}

}

}

/**

* 构建目录

* @param outputDir

* @param subDir

*/

public void createDirectory(String outputDir,String subDir){

File file = new File(outputDir);

if(!(subDir == null || subDir.trim().equals(""))){//子目录不为空

file = new File(outputDir + "/" + subDir);

}

if(!file.exists()){

file.mkdirs();

}

}

/**

* 清理文件(目录或文件)

* @param file

*/

public void deleteDirectory(File file){

if(file.isFile()){

file.delete();//清理文件

}else{

File list[] = file.listFiles();

if(list!=null){

for(File f: list){

deleteDirectory(f);

}

file.delete();//清理目录

}

}

}

}

Java操作压缩文件技术整理

1. RAR解压

RAR属于目前Windows平台应用最广泛的压缩文件格式,但由于RAR格式为商业压缩算法,非免费,所以Java方面没有特别合适的开源制作/

解析RAR文件的库。网上解决办法很多,最多的还是介绍由Java调用命令行工具执行winRAR命令进行压缩文件解析操作(虽然可行,但总感觉有那么点

别扭)

之前在网上有一款开源的项目叫

JUnrar,但目前项目Project地址已经无效了(不知道是不是触犯了商业条款被迫封了),在被人的空间中搜到了一个当时的发布版本,调用时需要配

合其内部提供的dll使用,不是100%

Java实现,但也比调用命令行方式用起来正规。经初步测试查看RAR压缩文件内文件列表及压缩文件解压功能正常(压缩包内有示例程序,一看就懂)

附件中Junrar.rar 下载

下载次数: 15

ant.jar (1.8 MB)

下载次数: 16

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-09-15 16:05

浏览 2153

评论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值