diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/io/file/PathUtil.java b/hutool-core/src/main/java/cn/hutool/v7/core/io/file/PathUtil.java index 9d328d964..c1bf573e3 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/io/file/PathUtil.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/io/file/PathUtil.java @@ -17,6 +17,7 @@ package cn.hutool.v7.core.io.file; import cn.hutool.v7.core.array.ArrayUtil; +import cn.hutool.v7.core.func.PredicateUtil; import cn.hutool.v7.core.io.IORuntimeException; import cn.hutool.v7.core.io.IoUtil; import cn.hutool.v7.core.io.resource.FileResource; @@ -33,6 +34,8 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Stream; /** * NIO中Path对象操作封装 @@ -95,6 +98,26 @@ public class PathUtil { // region ----- loop and walk + /** + * 获取目录下所有文件和子目录,此方法不判断是否为目录 + * + * @param dirPath 目录路径 + * @param filter 文件过滤规则,{@code null}表示接收全部文件 + * @return 文件列表 + * @since 7.0.0 + */ + public static Path[] listFiles(final Path dirPath, Predicate filter) { + if (null == filter) { + filter = PredicateUtil.alwaysTrue(); + } + + try (final Stream list = Files.list(dirPath)) { + return list.filter(filter).toArray(Path[]::new); + } catch (final IOException e) { + throw new IORuntimeException(e); + } + } + /** * 递归遍历目录以及子目录中的所有文件
* 如果提供path为文件,直接返回过滤结果 diff --git a/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/CompressUtil.java b/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/CompressUtil.java index 8987b7165..c8398f924 100644 --- a/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/CompressUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/CompressUtil.java @@ -16,12 +16,6 @@ package cn.hutool.v7.extra.compress; -import org.apache.commons.compress.archivers.ArchiveStreamFactory; -import org.apache.commons.compress.archivers.StreamingNotSupportedException; -import org.apache.commons.compress.compressors.CompressorException; -import org.apache.commons.compress.compressors.CompressorInputStream; -import org.apache.commons.compress.compressors.CompressorOutputStream; -import org.apache.commons.compress.compressors.CompressorStreamFactory; import cn.hutool.v7.core.io.IoUtil; import cn.hutool.v7.core.text.StrUtil; import cn.hutool.v7.extra.compress.archiver.Archiver; @@ -30,11 +24,18 @@ import cn.hutool.v7.extra.compress.archiver.StreamArchiver; import cn.hutool.v7.extra.compress.extractor.Extractor; import cn.hutool.v7.extra.compress.extractor.SevenZExtractor; import cn.hutool.v7.extra.compress.extractor.StreamExtractor; +import org.apache.commons.compress.archivers.ArchiveStreamFactory; +import org.apache.commons.compress.archivers.StreamingNotSupportedException; +import org.apache.commons.compress.compressors.CompressorException; +import org.apache.commons.compress.compressors.CompressorInputStream; +import org.apache.commons.compress.compressors.CompressorOutputStream; +import org.apache.commons.compress.compressors.CompressorStreamFactory; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.Charset; +import java.util.function.Function; /** * 压缩工具类
@@ -63,7 +64,7 @@ public class CompressUtil { * @param out 输出流,可以输出到内存、网络或文件 * @return {@link CompressorOutputStream} */ - public static CompressorOutputStream getOut(final String compressorName, final OutputStream out) { + public static CompressorOutputStream getOut(final String compressorName, final OutputStream out) { try { return new CompressorStreamFactory().createCompressorOutputStream(compressorName, out); } catch (final CompressorException e) { @@ -86,13 +87,13 @@ public class CompressUtil { * * * @param compressorName 压缩名称,见:{@link CompressorStreamFactory},null表示自动检测 - * @param in 输出流,可以输出到内存、网络或文件 + * @param in 输出流,可以输出到内存、网络或文件 * @return {@link CompressorOutputStream} */ public static CompressorInputStream getIn(String compressorName, InputStream in) { in = IoUtil.toMarkSupport(in); try { - if(StrUtil.isBlank(compressorName)){ + if (StrUtil.isBlank(compressorName)) { compressorName = CompressorStreamFactory.detect(in); } return new CompressorStreamFactory().createCompressorInputStream(compressorName, in); @@ -187,11 +188,11 @@ public class CompressUtil { return new SevenZExtractor(file); } - if(StrUtil.isBlank(archiverName)){ + if (StrUtil.isBlank(archiverName)) { final String name = file.getName().toLowerCase(); - if(name.endsWith(".tgz")){ + if (name.endsWith(".tgz")) { archiverName = "tgz"; - } else if(name.endsWith(".tar.gz")){ + } else if (name.endsWith(".tar.gz")) { archiverName = "tar.gz"; } } @@ -256,4 +257,23 @@ public class CompressUtil { throw e; } } + + /** + * 获取归档条目名 + * + * @param fileName 文件名,包括主名称和扩展名,不包括路径 + * @param path 路径 + * @param fileNameEditor 文件名编辑器 + * @return 归档条目名 + * @since 7.0.0 + */ + public static String getEntryName(final String fileName, final String path, final Function fileNameEditor) { + String entryName = (fileNameEditor == null) ? fileName : fileNameEditor.apply(fileName); + if (StrUtil.isNotEmpty(path)) { + // 非空拼接路径,格式为:path/name + entryName = StrUtil.addSuffixIfNot(path, StrUtil.SLASH) + entryName; + } + + return entryName; + } } diff --git a/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/Archiver.java b/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/Archiver.java index 5f23d6ff3..65266caf7 100644 --- a/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/Archiver.java +++ b/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/Archiver.java @@ -42,11 +42,11 @@ public interface Archiver extends Closeable { * 将文件或目录加入归档,目录采取递归读取方式按照层级加入 * * @param file 文件或目录 - * @param predicate 文件过滤器,指定哪些文件或目录可以加入,{@link Predicate#test(Object)}为{@code true}时加入,null表示全部加入 + * @param filter 文件过滤器,指定哪些文件或目录可以加入,{@link Predicate#test(Object)}为{@code true}时加入,null表示全部加入 * @return this */ - default Archiver add(final File file, final Predicate predicate) { - return add(file, null, predicate); + default Archiver add(final File file, final Predicate filter) { + return add(file, null, filter); } /** diff --git a/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/SevenZArchiver.java b/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/SevenZArchiver.java index c2fbcee74..6426a887e 100644 --- a/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/SevenZArchiver.java +++ b/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/SevenZArchiver.java @@ -16,11 +16,12 @@ package cn.hutool.v7.extra.compress.archiver; -import cn.hutool.v7.core.io.file.FileUtil; +import cn.hutool.v7.core.array.ArrayUtil; import cn.hutool.v7.core.io.IORuntimeException; import cn.hutool.v7.core.io.IoUtil; -import cn.hutool.v7.core.text.StrUtil; -import cn.hutool.v7.core.array.ArrayUtil; +import cn.hutool.v7.core.io.file.FileUtil; +import cn.hutool.v7.core.io.file.PathUtil; +import cn.hutool.v7.extra.compress.CompressUtil; import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile; import org.apache.commons.compress.utils.SeekableInMemoryByteChannel; @@ -28,6 +29,8 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.channels.SeekableByteChannel; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.function.Function; import java.util.function.Predicate; @@ -144,11 +147,7 @@ public class SevenZArchiver implements Archiver { } final SevenZOutputFile out = this.sevenZOutputFile; - String entryName = (null == fileNameEditor) ? file.getName() : fileNameEditor.apply(file.getName()); - if (StrUtil.isNotEmpty(path)) { - // 非空拼接路径,格式为:path/name - entryName = StrUtil.addSuffixIfNot(path, StrUtil.SLASH) + entryName; - } + final String entryName = CompressUtil.getEntryName(file.getName(), path, fileNameEditor); out.putArchiveEntry(out.createArchiveEntry(file, entryName)); if (file.isDirectory()) { diff --git a/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/StreamArchiver.java b/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/StreamArchiver.java index 856100c4e..f9b7f9800 100644 --- a/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/StreamArchiver.java +++ b/hutool-extra/src/main/java/cn/hutool/v7/extra/compress/archiver/StreamArchiver.java @@ -16,6 +16,7 @@ package cn.hutool.v7.extra.compress.archiver; +import cn.hutool.v7.extra.compress.CompressUtil; import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveException; import org.apache.commons.compress.archivers.ArchiveOutputStream; @@ -172,11 +173,7 @@ public class StreamArchiver implements Archiver { } final ArchiveOutputStream out = this.out; - String entryName = (fileNameEditor == null) ? file.getName() : fileNameEditor.apply(file.getName()); - if (StrUtil.isNotEmpty(path)) { - // 非空拼接路径,格式为:path/name - entryName = StrUtil.addSuffixIfNot(path, StrUtil.SLASH) + entryName; - } + final String entryName = CompressUtil.getEntryName(file.getName(), path, fileNameEditor); out.putArchiveEntry(out.createArchiveEntry(file, entryName)); if (file.isDirectory()) {