java的解压各种格式文件_java实现单个或多个文件的压缩、解压缩 支持zip、rar等格式...

packagecom.cn.util;importjava.io.BufferedInputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.util.zip.CRC32;importjava.util.zip.CheckedOutputStream;importjava.util.zip.ZipEntry;importjava.util.zip.ZipOutputStream;importorg.apache.tools.ant.Project;importorg.apache.tools.ant.taskdefs.Expand;/*** 压缩文件工具类

*@authorsun.kai

* 2016年8月14日*/

public classZipUtil {static final int BUFFER = 8192;private staticFile zipFile;/*** 压缩单个或多文件方法

*@paramzipPath 压缩后的文件路径

*@paramsrcPathName 要压缩的文件路径

* 参数srcPathName也可以定义成数组形式,需调用方把参数封装到数组中传过来即可*/

public static voidcompress(String zipPath,String... srcPathName) {//压缩后的文件对象

zipFile = newFile(zipPath);try{//创建写出流操作

FileOutputStream fileOutputStream = newFileOutputStream(zipFile);

CheckedOutputStream cos= new CheckedOutputStream(fileOutputStream,newCRC32());

ZipOutputStream out= newZipOutputStream(cos);for(String srcPath:srcPathName){//创建需要压缩的文件对象

File file = newFile(srcPath);if (!file.exists()){throw new RuntimeException(srcPath + "不存在!");

}/** (1)如果在zip压缩文件中不需要一级文件目录,定义String basedir = "";

* 下面的compress方法中当判断文件file是目录后不需要加上basedir = basedir + file.getName() + File.separator;

* (2)如果只是想在压缩后的zip文件里包含一级文件目录,不包含二级以下目录,

* 直接在这定义String basedir = file.getName() + File.separator;

* 下面的compress方法中当判断文件file是目录后不需要加上basedir = basedir + file.getName() + File.separator;

* (3)如果想压缩后的zip文件里包含一级文件目录,也包含二级以下目录,即zip文件里的目录结构和原文件一样

* 在此定义String basedir = "";

* 下面的compress方法中当判断文件file是目录后需要加上basedir = basedir + file.getName() + File.separator;*/

//String basedir = file.getName() + File.separator;

String basedir = "";

compress(file, out, basedir);

}

out.close();

}catch(Exception e) {throw newRuntimeException(e);

}

}private static voidcompress(File file, ZipOutputStream out, String basedir) {/** 判断是目录还是文件*/

if(file.isDirectory()) {

basedir+= file.getName() +File.separator;

compressDirectory(file, out, basedir);

}else{

System.out.println("压缩:" + basedir +file.getName());

compressFile(file, out, basedir);

}

}/*** 压缩一个目录*/

private static voidcompressDirectory(File dir, ZipOutputStream out, String basedir) {if (!dir.exists()){return;

}

File[] files=dir.listFiles();for (int i = 0; i < files.length; i++) {/*递归*/compress(files[i], out, basedir);

}

}/*** 压缩一个文件*/

private static voidcompressFile(File file, ZipOutputStream out, String basedir) {if (!file.exists()) {return;

}try{

BufferedInputStream bis= newBufferedInputStream(newFileInputStream(file));//创建Zip实体,并添加进压缩包

ZipEntry entry = new ZipEntry(basedir +file.getName());

out.putNextEntry(entry);//读取待压缩的文件并写进压缩包里

intcount;byte data[] = new byte[BUFFER];while ((count = bis.read(data, 0, BUFFER)) != -1) {

out.write(data,0, count);

}

bis.close();

}catch(Exception e) {throw newRuntimeException(e);

}

}/*** 解压缩

*@paramsourceFile 要解压缩的文件的路径

*@paramdestDir 解压缩后的目录路径

*@throwsException*/

public static void deCompress(String sourceFile,String destDir) throwsException{//创建需要解压缩的文件对象

File file = newFile(sourceFile);if (!file.exists()){throw new RuntimeException(sourceFile + "不存在!");

}//创建解压缩的文件目录对象

File destDiretory = newFile(destDir);if(!destDiretory.exists()){

destDiretory.mkdirs();

}/** 保证文件夹路径最后是"/"或者"\"

* charAt()返回指定索引位置的char值*/

char lastChar = destDir.charAt(destDir.length()-1);if(lastChar!='/'&&lastChar!='\\'){//在最后加上分隔符

destDir +=File.separator;

}

unzip(sourceFile, destDir);

}/*** 解压方法

* 需要ant.jar*/

private static void unzip(String sourceZip,String destDir) throwsException{try{

Project p= newProject();

Expand e= newExpand();

e.setProject(p);

e.setSrc(newFile(sourceZip));

e.setOverwrite(false);

e.setDest(newFile(destDir));

e.execute();

}catch(Exception e){throwe;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值