public void zip(ZipOutputStream zos, File sourceFile, String base, Predicate<File> predicate) {
try {
if (sourceFile.isDirectory()) {
File[] files = sourceFile.listFiles();
if (Objects.isNull(files) || files.length == 0) {
//如果为空文件夹,则只在目标zip文件中写入一个目录entry
zos.putNextEntry(new ZipEntry(base + "/"));
zos.closeEntry();
} else {
//如果为非空文件夹,则递归调用zip方法
for (File file : files) {
zip(zos, file, base + "/" + file.getName(), predicate);
}
}
} else {
//如果是文件,则先写入目录进入点,之后将文件写入zip文件中,predicate可以按条件选择某种类型文件
if (predicate.test(sourceFile)) {
byte[] buf = new byte[1024 * 1024];
int len;
try (InputStream inputStream = Files.newInputStream(sourceFile.toPath())) {
zos.putNextEntry(new ZipEntry(base));
while ((len = inputStream.read(buf)) != -1) {
zos.write(buf, 0, len);
}
zos.closeEntry();
}
}
}
} catch (Exception e) {
logger.error("Zip exception at {}", sourceFile.getName(), e);
}
}
压缩文件并保留原目录结构
于 2024-04-08 16:59:27 首次发布