From 1e87f432560b771fa01158a8dd46dd5498a107ac Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 9 May 2024 12:16:40 +0800 Subject: [PATCH] add fileNameEditor --- .../extra/compress/archiver/Archiver.java | 17 +++++++++- .../compress/archiver/SevenZArchiver.java | 23 +++++++------ .../compress/archiver/StreamArchiver.java | 33 +++++++------------ 3 files changed, 38 insertions(+), 35 deletions(-) diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/Archiver.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/Archiver.java index baaecd2ea..915e3d538 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/Archiver.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/Archiver.java @@ -14,6 +14,7 @@ package org.dromara.hutool.extra.compress.archiver; import java.io.Closeable; import java.io.File; +import java.util.function.Function; import java.util.function.Predicate; /** @@ -52,7 +53,21 @@ public interface Archiver extends Closeable { * @param filter 文件过滤器,指定哪些文件或目录可以加入,{@link Predicate#test(Object)}为{@code true}保留,null表示全部加入 * @return this */ - Archiver add(File file, String path, Predicate filter); + default Archiver add(final File file, final String path, final Predicate filter){ + return add(file, path, Function.identity(), filter); + } + + /** + * 将文件或目录加入归档包,目录采取递归读取方式按照层级加入 + * + * @param file 文件或目录 + * @param path 文件或目录的初始路径,null表示位于根路径 + * @param fileNameEditor 文件名编辑器 + * @param filter 文件过滤器,指定哪些文件或目录可以加入,{@link Predicate#test(Object)}为{@code true}保留,null表示全部加入 + * @return this + * @since 6.0.0 + */ + Archiver add(File file, String path, Function fileNameEditor, Predicate filter); /** * 结束已经增加的文件归档,此方法不会关闭归档流,可以继续添加文件 diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/SevenZArchiver.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/SevenZArchiver.java index aa03478bb..d89d245ad 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/SevenZArchiver.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/SevenZArchiver.java @@ -24,6 +24,7 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.channels.SeekableByteChannel; +import java.util.function.Function; import java.util.function.Predicate; /** @@ -89,9 +90,9 @@ public class SevenZArchiver implements Archiver { } @Override - public SevenZArchiver add(final File file, final String path, final Predicate filter) { + public SevenZArchiver add(final File file, final String path, final Function fileNameEditor, final Predicate filter) { try { - addInternal(file, path, filter); + addInternal(file, path, fileNameEditor, filter); } catch (final IOException e) { throw new IORuntimeException(e); } @@ -128,23 +129,21 @@ public class SevenZArchiver implements Archiver { /** * 将文件或目录加入归档包,目录采取递归读取方式按照层级加入 * - * @param file 文件或目录 - * @param path 文件或目录的初始路径,null表示位于根路径 - * @param filter 文件过滤器,指定哪些文件或目录可以加入,当{@link Predicate#test(Object)}为{@code true}保留,null表示保留全部 + * @param file 文件或目录 + * @param path 文件或目录的初始路径,null表示位于根路径 + * @param fileNameEditor 文件名编辑器 + * @param filter 文件过滤器,指定哪些文件或目录可以加入,当{@link Predicate#test(Object)}为{@code true}保留,null表示保留全部 */ - private void addInternal(final File file, final String path, final Predicate filter) throws IOException { + private void addInternal(final File file, final String path, final Function fileNameEditor, final Predicate filter) throws IOException { if (null != filter && !filter.test(file)) { return; } final SevenZOutputFile out = this.sevenZOutputFile; - final String entryName; + String entryName = (null == fileNameEditor) ? file.getName() : fileNameEditor.apply(file.getName()); if (StrUtil.isNotEmpty(path)) { // 非空拼接路径,格式为:path/name - entryName = StrUtil.addSuffixIfNot(path, StrUtil.SLASH) + file.getName(); - } else { - // 路径空直接使用文件名或目录名 - entryName = file.getName(); + entryName = StrUtil.addSuffixIfNot(path, StrUtil.SLASH) + entryName; } out.putArchiveEntry(out.createArchiveEntry(file, entryName)); @@ -153,7 +152,7 @@ public class SevenZArchiver implements Archiver { final File[] files = file.listFiles(); if (ArrayUtil.isNotEmpty(files)) { for (final File childFile : files) { - addInternal(childFile, entryName, filter); + addInternal(childFile, entryName, fileNameEditor, filter); } } } else { diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/StreamArchiver.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/StreamArchiver.java index ca2b22c9e..680ebbe16 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/StreamArchiver.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/compress/archiver/StreamArchiver.java @@ -30,6 +30,7 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; +import java.util.function.Function; import java.util.function.Predicate; /** @@ -116,20 +117,10 @@ public class StreamArchiver implements Archiver { ((ArArchiveOutputStream) out).setLongFileMode(ArArchiveOutputStream.LONGFILE_BSD); } } - - /** - * 将文件或目录加入归档包,目录采取递归读取方式按照层级加入 - * - * @param file 文件或目录 - * @param path 文件或目录的初始路径,null表示位于根路径 - * @param predicate 文件过滤器,指定哪些文件或目录可以加入,当{@link Predicate#test(Object)}为{@code true}加入,null表示全部加入 - * @return this - * @throws IORuntimeException IO异常 - */ @Override - public StreamArchiver add(final File file, final String path, final Predicate predicate) throws IORuntimeException { + public StreamArchiver add(final File file, final String path, final Function fileNameEditor, final Predicate predicate) throws IORuntimeException { try { - addInternal(file, path, predicate); + addInternal(file, path, fileNameEditor, predicate); } catch (final IOException e) { throw new IORuntimeException(e); } @@ -165,24 +156,22 @@ public class StreamArchiver implements Archiver { /** * 将文件或目录加入归档包,目录采取递归读取方式按照层级加入 * - * @param file 文件或目录 - * @param path 文件或目录的初始路径,{@code null}表示位于根路径 - * @param predicate 文件过滤器,指定哪些文件或目录可以加入,当{@link Predicate#test(Object)}为{@code true}加入。 + * @param file 文件或目录 + * @param path 文件或目录的初始路径,{@code null}表示位于根路径 + * @param fileNameEditor 文件名编辑器 + * @param predicate 文件过滤器,指定哪些文件或目录可以加入,当{@link Predicate#test(Object)}为{@code true}加入。 */ @SuppressWarnings({"rawtypes", "unchecked"}) - private void addInternal(final File file, final String path, final Predicate predicate) throws IOException { + private void addInternal(final File file, final String path, final Function fileNameEditor, final Predicate predicate) throws IOException { if (null != predicate && !predicate.test(file)) { return; } final ArchiveOutputStream out = this.out; - final String entryName; + String entryName = (fileNameEditor == null) ? file.getName() : fileNameEditor.apply(file.getName()); if (StrUtil.isNotEmpty(path)) { // 非空拼接路径,格式为:path/name - entryName = StrUtil.addSuffixIfNot(path, StrUtil.SLASH) + file.getName(); - } else { - // 路径空直接使用文件名或目录名 - entryName = file.getName(); + entryName = StrUtil.addSuffixIfNot(path, StrUtil.SLASH) + entryName; } out.putArchiveEntry(out.createArchiveEntry(file, entryName)); @@ -191,7 +180,7 @@ public class StreamArchiver implements Archiver { final File[] files = file.listFiles(); if (ArrayUtil.isNotEmpty(files)) { for (final File childFile : files) { - addInternal(childFile, entryName, predicate); + addInternal(childFile, entryName, fileNameEditor, predicate); } } else { // 空文件夹也需要关闭