From 612c2d8a98285e1fddf330f91cea99864b993553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B3=E5=8A=AD=E6=98=8E?= <626546063@qq.com> Date: Fri, 15 Oct 2021 01:37:16 +0000 Subject: [PATCH] add method --- .../java/cn/hutool/core/util/ZipUtil.java | 68 ++++++++++++++++--- 1 file changed, 60 insertions(+), 8 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java index c40ded1cd..064642772 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ZipUtil.java @@ -9,17 +9,14 @@ import cn.hutool.core.io.FastByteArrayOutputStream; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.file.FileSystemUtil; import cn.hutool.core.io.resource.Resource; -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.nio.charset.Charset; +import java.nio.file.FileSystem; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -75,6 +72,61 @@ public class ZipUtil { } } + /** + * 在zip文件中添加新文件, 如果已经存在则不会有效果 + * + * @param zipFilePathStr zip文件存储路径 + * @param appendFilePathStr 待添加文件路径(可以是文件夹) + */ + public static void addFile(String zipFilePathStr, String appendFilePathStr) throws IOException { + Path zipPath = Paths.get(zipFilePathStr); + Path appendFilePath = Paths.get(appendFilePathStr); + + try (FileSystem zipFileSystem = FileSystemUtil.createZip(zipPath.toString())) { + Path root = zipFileSystem.getPath("/"); + Path dest = zipFileSystem.getPath(root.toString(), appendFilePath.getFileName().toString()); + if (!Files.isDirectory(appendFilePath)) { + Files.copy(appendFilePath, dest, StandardCopyOption.COPY_ATTRIBUTES); + } else { + Files.walkFileTree(appendFilePath, new SimpleFileVisitor() { + /** + * 用于保证文件夹拷贝后的效果跟常见压缩软件的效果相同 + */ + private String dirRoot = null; + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + final Path dest; + if (dirRoot != null) { + dest = zipFileSystem.getPath(root.toString(), dirRoot, File.separator, StrUtil.subAfter(file.toString(), dirRoot, false)); + } else { + dest = zipFileSystem.getPath(root.toString(), file.toString()); + } + Files.copy(file, dest, StandardCopyOption.COPY_ATTRIBUTES); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + final Path dirToCreate; + if (dirRoot == null) { + dirToCreate = zipFileSystem.getPath(root.toString(), dir.getFileName().toString()); + dirRoot = dir.getFileName().toString(); + } else { + dirToCreate = zipFileSystem.getPath(root.toString(), dirRoot, File.separator, StrUtil.subAfter(dir.toString(), dirRoot, false)); + } + if (Files.notExists(dirToCreate)) { + Files.createDirectories(dirToCreate); + } + return FileVisitResult.CONTINUE; + } + }); + } + } catch (FileAlreadyExistsException ignored) { + // 文件已存在, 跳过 + } + } + /** * 打包到当前目录,使用默认编码UTF-8 *