可以使用hutool工具包
自己写的方法:
压缩:
package com.example.sa_token_01.util;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipUtil {
private static final String DEFAULT_CHARSET = "UTF-8";
private static final int BUFFER_SIZE = 2 * 1024;
/**
* 压缩文件夹
*
* @param zipFileName 打包后文件的名称,含路径
* @param sourceFolder 需要打包的文件夹或者文件的路径
* @param zipPathName 打包目的文件夹名,为空则表示直接打包到根
*/
public static void zip(String zipFileName, String sourceFolder, String zipPathName) throws Exception {
ZipOutputStream out = null;
try {
File zipFile = new File(zipFileName);
File parent = zipFile.getParentFile();
// 如果pdf保存路径不存在,则创建路径
if (!parent.exists()) {
parent.mkdirs();
}
FileOutputStream outputStream = new FileOutputStream(zipFile);
out = new ZipOutputStream(outputStream);
if (StrUtil.isNotBlank(zipPathName)) {
zipPathName = FilenameUtils.normalizeNoEndSeparator(zipPathName, true) + "/";
} else {
zipPathName = "";
}
zip(out, sourceFolder, zipPathName);
} catch (IOException e) {
e.printStackTrace();
throw new Exception(e);
} finally {
IOUtils.closeQuietly(out);
}
}
/**
* 压缩文件夹
*
* @param zipFile 打包后文件的名称,含路径
* @param source 需要打包的文件夹或者文件的路径
*/
public static void zip(String zipFile, String source) throws Exception {
File file = new File(source);
zip(zipFile, source, file.isFile() ? StrUtil.EMPTY : file.getName());
}
/**
* 压缩文件夹
*
* @param zipFile a {@link java.io.File} object.
* @param source a {@link java.io.File} object.
*/
public static void zip(File zipFile, File source) throws Exception {
zip(zipFile.getAbsolutePath(), source.getAbsolutePath());
}
private static void zip(ZipOutputStream zos, String file, String pathName) throws IOException {
File file2zip = new File(file);
if (file2zip.isFile()) {
zos.putNextEntry(new ZipEntry(pathName + file2zip.getName()));
IOUtils.copy(new FileInputStream(file2zip.getAbsolutePath()), zos);
zos.flush();
zos.closeEntry();
} else {
File[] files = file2zip.listFiles();
if (ArrayUtil.isNotEmpty(files)) {
for (File f : files) {
if (f.isDirectory()) {
zip(zos, FilenameUtils.normalizeNoEndSeparator(f.getAbsolutePath(), true),
FilenameUtils.normalizeNoEndSeparator(pathName + f.getName(), true) + "/");
} else {
FileInputStream inputStream = new FileInputStream(f.getAbsolutePath());
zos.putNextEntry(new ZipEntry(pathName + f.getName()));
IOUtils.copy(inputStream, zos);
inputStream.close();
zos.flush();
zos.closeEntry();
}
}
}else{
// 空文件夹的处理
zos.putNextEntry(new ZipEntry(pathName + "/"));
// 没有文件,不需要文件的copy
zos.closeEntry();
}
}
}
private static ZipArchiveInputStream getZipFile(File zipFile) throws Exception {
return new ZipArchiveInputStream(new BufferedInputStream(new FileInputStream(zipFile)), "GBK");
}
/*-----------------------------------------------------------*/
public static void main(String[] args) throws Exception {
zip("E:\\123/测试a.zip", "E:\\123\\fppdf");
}
}
解压缩:
package com.example.sa_token_01.util;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class UnZipUtils {
public static final String EXT = ".zip";
private static final String BASE_DIR = "";
private static final String PATH = File.separator;
private static final int BUFFER = 1024;
/**
* 文件 解压缩
*
* @param srcPath 源文件路径
* @throws Exception
*/
public static void decompress(String srcPath) throws Exception {
File srcFile = new File(srcPath);
decompress(srcFile);
}
/**
* 解压缩
*
* @param srcFile
* @throws Exception
*/
public static void decompress(File srcFile) throws Exception {
String basePath = srcFile.getParent();
decompress(srcFile, basePath);
}
/**
* 解压缩
*
* @param srcFile
* @param destFile
* @throws Exception
*/
public static void decompress(File srcFile, File destFile) throws Exception {
CheckedInputStream cis = new CheckedInputStream(new FileInputStream(srcFile), new CRC32());
ZipInputStream zis = new ZipInputStream(cis, Charset.forName("GBK"));
decompress(destFile, zis);
zis.close();
}
/**
* 解压缩
* @param srcFile
* @param destPath
* @throws Exception
*/
public static void decompress(File srcFile, String destPath) throws Exception {
decompress(srcFile, new File(destPath));
}
/**
* 文件 解压缩
* @param srcPath 源文件路径
* @param destPath 目标文件路径
* @throws Exception
*/
public static void decompress(String srcPath, String destPath) throws Exception {
File srcFile = new File(srcPath);
decompress(srcFile, destPath);
}
/**
* 文件 解压缩
* @param destFile 目标文件
* @param zis ZipInputStream
* @throws Exception
*/
private static void decompress(File destFile, ZipInputStream zis) throws Exception {
ZipEntry entry = null;
while ((entry = zis.getNextEntry()) != null) {
// 文件
String dir = destFile.getPath() + File.separator + entry.getName();
File dirFile = new File(dir);
// 文件检查
fileProber(dirFile);
if (entry.isDirectory()) {
dirFile.mkdirs();
} else {
decompressFile(dirFile, zis);
}
zis.closeEntry();
}
}
/**
* 文件探针
* 当父目录不存在时,创建目录!
* @param dirFile
*/
private static void fileProber(File dirFile) {
File parentFile = dirFile.getParentFile();
if (!parentFile.exists()) {
// 递归寻找上级目录
fileProber(parentFile);
parentFile.mkdir();
}
}
/**
* 文件解压缩
*
* @param destFile 目标文件
* @param zis ZipInputStream
* @throws Exception
*/
private static void decompressFile(File destFile, ZipInputStream zis) throws Exception {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
int count;
byte data[] = new byte[BUFFER];
while ((count = zis.read(data, 0, BUFFER)) != -1) {
bos.write(data, 0, count);
}
bos.close();
}
}
参考:https://blog.csdn.net/weixin_45860338/article/details/124998861