packagecom.geotmt.billingcenter.common.utils;importorg.datanucleus.util.StringUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;import java.io.*;importjava.util.zip.CRC32;importjava.util.zip.CheckedOutputStream;importjava.util.zip.ZipEntry;importjava.util.zip.ZipOutputStream;/*** @Description 压缩与解压工具
* @Author yanghanwei
* @Date 18:42 2019-11-20
* @Version v1
**/
public classZipUtils {private static final Logger logger = LoggerFactory.getLogger(ZipUtils.class);/*** 压缩 zip
*@paramfilePath 文件夹 全路径
*@paramfileName 文件夹名称
*@paramoutPath 压缩文件保存路径*/
public static voidzipFile(String filePath, String fileName, String outPath) {
logger.info("filePath:{}, fileName:{}, outPath:{}", filePath, fileName, outPath);try{//创建Test.zip文件
OutputStream is = newFileOutputStream(outPath);//检查输出流,采用CRC32算法,保证文件的一致性
CheckedOutputStream cos = new CheckedOutputStream(is, newCRC32());//创建zip文件的输出流
ZipOutputStream zos = newZipOutputStream(cos);//需要压缩的文件或文件夹对象
File file = newFile(filePath);//压缩文件的具体实现函数
zipFilePost(zos,file,filePath,fileName,outPath);
zos.close();
cos.close();
is.close();
System.out.println("压缩完成");
}catch(Exception e) {
logger.error("压缩失败zipFile,Exception:" +e);
}
}/*** 压缩文件
*@paramzos zip文件的输出流
*@paramfile 需要压缩的文件或文件夹对象
*@paramfilePath 压缩的文件路径
*@paramfileName 需要压缩的文件夹名
*@paramoutPath 缩完成后保存为Test.zip文件*/
private static voidzipFilePost(ZipOutputStream zos, File file, String filePath, String fileName, String outPath){try{
String path=file.getPath();
String zosName= "";if(!StringUtils.isEmpty(path)){
zosName=path.substring(path.indexOf(fileName));
}
File[] files=file.listFiles();if(file.isDirectory() && files != null && files.length > 0) {//创建压缩文件的目录结构
zos.putNextEntry(new ZipEntry(zosName +File.separator));for(File f : files) {
zipFilePost(zos, f, filePath, fileName, outPath);
}
}else{
logger.info("正在压缩文件:{}",file.getName());//创建压缩文件
zos.putNextEntry(newZipEntry(zosName));//用字节方式读取源文件
InputStream is = newFileInputStream(file.getPath());//创建一个缓存区
BufferedInputStream bis = newBufferedInputStream(is);//字节数组,每次读取1024个字节
byte [] b = new byte[1024];//循环读取,边读边写
while(bis.read(b)!=-1) {//写入压缩文件
zos.write(b);
}//关闭流
bis.close();
is.close();
}
}catch(Exception e) {
logger.error("压缩文件失败zipFilePost,Exception:" +e);
}
}public static void main(String[] args) throwsException{
String filePath= "/var/folders/88/jh37h0fj59l1f302jdryz4780000gn/T/201908月小微平台消耗-1574300435525/";//需要压缩的文件夹名
String fileName = "201908月小微平台消耗-1574300435525";//压缩完成后保存为Test.zip文件,名字随意
String outPath = "/var/folders/88/jh37h0fj59l1f302jdryz4780000gn/T/Test3.zip";
zipFile(filePath, fileName, outPath);
}
}