/*** Zip文件工具类
*@authorLuxh*/
public classZipFileUtil {/*** 把文件压缩成zip格式
*@paramfiles 需要压缩的文件
*@paramzipFilePath 压缩后的zip文件路径 ,如"D:/test/aa.zip";*/
public static voidcompressFiles2Zip(File[] files,String zipFilePath) {if(files != null && files.length >0) {if(isEndsWithZip(zipFilePath)) {
ZipArchiveOutputStream zaos= null;try{
File zipFile= newFile(zipFilePath);
zaos= newZipArchiveOutputStream(zipFile);//Use Zip64 extensions for all entries where they are required
zaos.setUseZip64(Zip64Mode.AsNeeded);//将每个文件用ZipArchiveEntry封装//再用ZipArchiveOutputStream写到压缩文件中
for(File file : files) {if(file != null) {
ZipArchiveEntry zipArchiveEntry= newZipArchiveEntry(file,file.getName());
zaos.putArchiveEntry(zipArchiveEntry);
InputStream is= null;try{
is= new BufferedInputStream(newFileInputStream(file));byte[] buffer = new byte[1024 * 5];int len = -1;while((len = is.read(buffer)) != -1) {//把缓冲区的字节写入到ZipArchiveEntry
zaos.write(buffer, 0, len);
}//Writes all necessary data for this entry.
zaos.closeArchiveEntry();
}catch(Exception e) {throw newRuntimeException(e);
}finally{if(is != null)
is.close();
}
}
}
zaos.finish();
}catch(Exception e){throw newRuntimeException(e);
}finally{try{if(zaos != null) {
zaos.close();
}
}catch(IOException e) {throw newRuntimeException(e);
}
}
}
}
}/*** 把zip文件解压到指定的文件夹
*@paramzipFilePath zip文件路径, 如 "D:/test/aa.zip"
*@paramsaveFileDir 解压后的文件存放路径, 如"D:/test/"*/
public static voiddecompressZip(String zipFilePath,String saveFileDir) {if(isEndsWithZip(zipFilePath)) {
File file= newFile(zipFilePath);if(file.exists()) {
InputStream is= null;//can read Zip archives
ZipArchiveInputStream zais = null;try{
is= newFileInputStream(file);
zais= newZipArchiveInputStream(is);
ArchiveEntry archiveEntry= null;//把zip包中的每个文件读取出来//然后把文件写到指定的文件夹
while((archiveEntry = zais.getNextEntry()) != null) {//获取文件名
String entryFileName =archiveEntry.getName();//构造解压出来的文件存放路径
String entryFilePath = saveFileDir +entryFileName;byte[] content = new byte[(int) archiveEntry.getSize()];
zais.read(content);
OutputStream os= null;try{//把解压出来的文件写到指定路径
File entryFile = newFile(entryFilePath);
os= new BufferedOutputStream(newFileOutputStream(entryFile));
os.write(content);
}catch(IOException e) {throw newIOException(e);
}finally{if(os != null) {
os.flush();
os.close();
}
}
}
}catch(Exception e) {throw newRuntimeException(e);
}finally{try{if(zais != null) {
zais.close();
}if(is != null) {
is.close();
}
}catch(IOException e) {throw newRuntimeException(e);
}
}
}
}
}/*** 判断文件名是否以.zip为后缀
*@paramfileName 需要判断的文件名
*@return是zip文件返回true,否则返回false*/
public static booleanisEndsWithZip(String fileName) {boolean flag = false;if(fileName != null && !"".equals(fileName.trim())) {if(fileName.endsWith(".ZIP")||fileName.endsWith(".zip")){
flag= true;
}
}returnflag;
}
}
测试代码:
[java] view plain copy print?
packagecn.luxh.test;importjava.io.File;importorg.junit.Test;importcn.luxh.utils.ZipFileUtil;/*** 测试ZipFileUtil的压缩和解压缩方法
*@authorLuxh*/
public classZipFileUtilTest {
@Testpublic voidtestCompressFiles2Zip() {//存放待压缩文件的目录
File srcFile = new File("D:/test");//压缩后的zip文件路径
String zipFilePath = "d:/test2/test.zip";if(srcFile.exists()) {
File[] files=srcFile.listFiles();
ZipFileUtil.compressFiles2Zip(files, zipFilePath);
}
}
@Testpublic voidtestDecompressZip() {//压缩包所在路径
String zipFilePath = "d:/test2/test.zip";//解压后的文件存放目录
String saveFileDir = "d:/test2/";//调用解压方法
ZipFileUtil.decompressZip(zipFilePath, saveFileDir);
}
}