add methods

This commit is contained in:
Looly
2025-09-09 11:52:42 +08:00
parent 0be2f37e74
commit 07224772de
5 changed files with 67 additions and 28 deletions

View File

@@ -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<? super Path> filter) {
if (null == filter) {
filter = PredicateUtil.alwaysTrue();
}
try (final Stream<Path> list = Files.list(dirPath)) {
return list.filter(filter).toArray(Path[]::new);
} catch (final IOException e) {
throw new IORuntimeException(e);
}
}
/**
* 递归遍历目录以及子目录中的所有文件<br>
* 如果提供path为文件直接返回过滤结果

View File

@@ -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;
/**
* 压缩工具类<br>
@@ -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 {
* </ul>
*
* @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<String, String> fileNameEditor) {
String entryName = (fileNameEditor == null) ? fileName : fileNameEditor.apply(fileName);
if (StrUtil.isNotEmpty(path)) {
// 非空拼接路径格式为path/name
entryName = StrUtil.addSuffixIfNot(path, StrUtil.SLASH) + entryName;
}
return entryName;
}
}

View File

@@ -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<File> predicate) {
return add(file, null, predicate);
default Archiver add(final File file, final Predicate<File> filter) {
return add(file, null, filter);
}
/**

View File

@@ -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()) {

View File

@@ -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()) {