Java8 Zip 压缩与解压缩的实现
网上找过几个例子都有点小问题,还是谷歌找出来的靠谱。主要是增加了指定文件的功能,通过Java8的Lambda判断是否加入ZIP压缩,比较方便。函数表达式的签名是Function
完整代码在:https://gitee.com/sp42_admin/ajaxjs/blob/master/ajaxjs-base/src/main/java/com/ajaxjs/util/io/FileHelper.java
/**
*Copyrightsp42frank@ajaxjs.com
*
*LicensedundertheApacheLicense,Version2.0(the"License");
*youmaynotusethisfileexceptincompliancewiththeLicense.
*YoumayobtainacopyoftheLicenseat
*
*http://www.apache.org/licenses/LICENSE-2.0
*
*Unlessrequiredbyapplicablelaworagreedtoinwriting,software
*distributedundertheLicenseisdistributedonan"ASIS"BASIS,
*WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
*SeetheLicenseforthespecificlanguagegoverningpermissionsand
*limitationsundertheLicense.
*/
packagecom.ajaxjs.util.io;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.util.function.Function;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipInputStream;
importjava.util.zip.ZipOutputStream;
importcom.ajaxjs.util.logger.LogHelper;
/**
*ZIP压缩/解压缩
*
*@authorsp42
*
*/
publicclassZipHelper{
privatestaticfinalLogHelperLOGGER=LogHelper.getLog(ZipHelper.class);
/**
*解压文件
*
*@paramsave解压文件的路径,必须为目录
*@paramzipFile输入的解压文件路径,例如C:/temp/foo.zip或c:\\temp\\bar.zip
*/
publicstaticvoidunzip(Stringsave,StringzipFile){
if(!newFile(save).isDirectory())
thrownewIllegalArgumentException("保存的路径必须为目录路径");
longstart=System.currentTimeMillis();
Filefolder=newFile(save);
if(!folder.exists())
folder.mkdirs();
try(ZipInputStreamzis=newZipInputStream(newFileInputStream(zipFile));){
ZipEntryze;
while((ze=zis.getNextEntry())!=null){
FilenewFile=newFile(save+File.separator+ze.getName());
System.out.println("fileunzip:"+newFile.getAbsoluteFile());
//大部分网络上的源码,这里没有判断子目录
if(ze.isDirectory()){
newFile.mkdirs();
}else{
//newFile(newFile.getParent()).mkdirs();
FileHelper.initFolder(newFile);
FileOutputStreamfos=newFileOutputStream(newFile);
IoHelper.write(zis,fos,false);
fos.close();
}
//ze=zis.getNextEntry();
}
zis.closeEntry();
}catch(IOExceptione){
LOGGER.warning(e);
}
LOGGER.info("解压缩完成,耗时:{0}ms,保存在{1}",System.currentTimeMillis()-start,save);
}
/**
*压缩文件
*
*@paramtoZip要压缩的目录或文件
*@paramsaveZip压缩后保存的zip文件名
*/
publicstaticvoidzip(StringtoZip,StringsaveZip){
zip(toZip,saveZip,null);
}
/**
*压缩文件
*
*@paramtoZip要压缩的目录或文件
*@paramsaveZip压缩后保存的zip文件名
*@parameveryFile输入File,可在这Lambda里面判断是否加入ZIP压缩,返回true表示允许,反之不行
*/
publicstaticvoidzip(StringtoZip,StringsaveZip,FunctioneveryFile){
longstart=System.currentTimeMillis();
FilefileToZip=newFile(toZip);
FileHelper.initFolder(saveZip);
try(FileOutputStreamfos=newFileOutputStream(saveZip);ZipOutputStreamzipOut=newZipOutputStream(fos);){
zip(fileToZip,fileToZip.getName(),zipOut,everyFile);
}catch(IOExceptione){
LOGGER.warning(e);
}
LOGGER.info("压缩完成,耗时:{0}ms,保存在{1}",System.currentTimeMillis()-start,saveZip);
}
/**
*内部的压缩方法
*
*@paramtoZip要压缩的目录或文件
*@paramfileNameZIP内的文件名
*@paramzipOutZIP流
*@parameveryFile输入File,可在这Lambda里面判断是否加入ZIP压缩,返回true表示允许,反之不行
*/
privatestaticvoidzip(FiletoZip,StringfileName,ZipOutputStreamzipOut,FunctioneveryFile){
if(toZip.isHidden())
return;
if(everyFile!=null&&!everyFile.apply(toZip)){
return;//跳过不要的
}
try{
if(toZip.isDirectory()){
zipOut.putNextEntry(newZipEntry(fileName.endsWith("/")?fileName:fileName+"/"));
zipOut.closeEntry();
File[]children=toZip.listFiles();
for(FilechildFile:children){
zip(childFile,fileName+"/"+childFile.getName(),zipOut,everyFile);
}
return;
}
zipOut.putNextEntry(newZipEntry(fileName));
try(FileInputStreamin=newFileInputStream(toZip);){
IoHelper.write(in,zipOut,false);
}
}catch(IOExceptione){
LOGGER.warning(e);
}
}
}
到此这篇关于Java8Zip压缩与解压缩的实现的文章就介绍到这了,更多相关Java8Zip压缩与解压缩内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。