平时开发过程中会经常用到将文件压缩成Zip或者将Zip中的文件加压缩出来
下面给大家分享一个我在工作中用到的自己写的Zip工具类
package com.bytz.modules.sw.common.util;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.*;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.Map;
import java.util.function.Consumer;
import java.util.zip.*;
@Slf4j
public class ZipUtils {
//将文件压缩成Zip
private static void zipFile(ZipOutputStream zipOut, String filePath, File file) throws Exception {
log.debug("==> Zipping file = {}", file.getPath());
if (!file.exists() || file.isDirectory()) {
return;
}
String entryName = StringUtils.isEmpty(filePath) ? file.getName() : filePath;
zipOut.putNextEntry(new ZipEntry(entryName));
FileInputStream fileIn = new FileInputStream(file);
IOUtils.copy(fileIn, zipOut);
fileIn.close();
log.debug("<== Zipped entry = {}", entryName);
}
//将文件压缩成Zip
public static void zipFiles(OutputStream out, Map<String, File> files, Consumer<ZipOutputStream> appender) throws Exception {
zipFiles(out, Deflater.DEFAULT_COMPRESSION, files, appender);
}
public static void zipFiles(OutputStream out, int level, Map<String, File> files, Consumer<ZipOutputStream> appender) throws Exception {
ZipOutputStream zipOut = out instanceof ZipOutputStream
? ZipOutputStream.class.cast(out) : new ZipOutputStream(out);
files.forEach((zipPath, file) -> {
try {
zipFile(zipOut, zipPath, file);
} catch (Exception e) {
log.error("Zipping error = {}", e);
}
});
if (appender != null) {
appender.accept(zipOut);
}
zipOut.flush();
zipOut.close();
}
//解压缩
public static void unZip(String sourcePath, String targetFileDirectory, String fileName, boolean deleteSourceFile) throws Exception {
try (ZipFile zipFile = new ZipFile(sourcePath, Charset.forName("GBK"))) {
File targetFile = new File(targetFileDirectory);
if (!targetFile.exists()) {
targetFile.mkdir();
}
for (Enumeration<? extends ZipEntry> entries = zipFile.entries(); entries.hasMoreElements(); ) {
ZipEntry zipEntry = entries.nextElement();
File outputFilePath = new File(targetFileDirectory + File.separator + fileName);
try (InputStream inputStream = zipFile.getInputStream(zipEntry)) {
try (OutputStream os = new FileOutputStream(outputFilePath)) {
IoUtil.copy(inputStream, os);
}
}
}
}
if (deleteSourceFile) {
FileUtil.del(FileUtil.normalize(sourcePath));
}
}
public static void main(String[] args) throws Exception{
unZip("D:\\FTP\\202102\\K\\aaaa.zip", "D:\\opt\\upFiles\\tender\\purchase\\2022\\4\\21","aa.pdf", true);
}
}
** 公众号:大步追逐的梦想**