diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileSystemUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileSystemUtil.java
index 65dc37a5f..502bf09be 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileSystemUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileSystemUtil.java
@@ -2,13 +2,17 @@ package cn.hutool.core.io.file;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import java.io.IOException;
+import java.net.URI;
+import java.nio.charset.Charset;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.HashMap;
/**
* {@link FileSystem}相关工具类封装
@@ -35,6 +39,39 @@ public class FileSystemUtil {
}
}
+ /**
+ * 创建 Zip的{@link FileSystem},默认UTF-8编码
+ *
+ * @param path 文件路径,可以是目录或Zip文件等
+ * @return {@link FileSystem}
+ */
+ public static FileSystem createZip(String path) {
+ return createZip(path, null);
+ }
+
+ /**
+ * 创建 Zip的{@link FileSystem}
+ *
+ * @param path 文件路径,可以是目录或Zip文件等
+ * @param charset 编码
+ * @return {@link FileSystem}
+ */
+ public static FileSystem createZip(String path, Charset charset) {
+ if(null == charset){
+ charset = CharsetUtil.CHARSET_UTF_8;
+ }
+ final HashMap env = new HashMap<>();
+ env.put("create", "true");
+ env.put("encoding", charset.name());
+
+ try {
+ return FileSystems.newFileSystem(
+ URI.create("jar:" + Paths.get(path).toUri()), env);
+ } catch (IOException e) {
+ throw new IORuntimeException(e);
+ }
+ }
+
/**
* 获取目录的根路径,或Zip文件中的根路径
*
diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/PathUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/file/PathUtil.java
index d9423d126..95abe2c52 100644
--- a/hutool-core/src/main/java/cn/hutool/core/io/file/PathUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/io/file/PathUtil.java
@@ -55,6 +55,19 @@ public class PathUtil {
}
}
+ /**
+ * 递归遍历目录以及子目录中的所有文件
+ * 如果提供path为文件,直接返回过滤结果
+ *
+ * @param path 当前遍历文件或目录
+ * @param fileFilter 文件过滤规则对象,选择要保留的文件,只对文件有效,不过滤目录,null表示接收全部文件
+ * @return 文件列表
+ * @since 5.4.1
+ */
+ public static List loopFiles(Path path, FileFilter fileFilter) {
+ return loopFiles(path, -1, fileFilter);
+ }
+
/**
* 递归遍历目录以及子目录中的所有文件
* 如果提供path为文件,直接返回过滤结果
diff --git a/hutool-core/src/test/java/cn/hutool/core/io/file/FileSystemUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/file/FileSystemUtilTest.java
new file mode 100644
index 000000000..130b400f8
--- /dev/null
+++ b/hutool-core/src/test/java/cn/hutool/core/io/file/FileSystemUtilTest.java
@@ -0,0 +1,31 @@
+package cn.hutool.core.io.file;
+
+import cn.hutool.core.lang.Console;
+import cn.hutool.core.util.CharsetUtil;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.nio.file.FileSystem;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+
+public class FileSystemUtilTest {
+
+ @Test
+ @Ignore
+ public void listTest(){
+ final FileSystem fileSystem = FileSystemUtil.createZip("d:/test/test.zip",
+ CharsetUtil.CHARSET_GBK);
+ final Path root = FileSystemUtil.getRoot(fileSystem);
+ PathUtil.walkFiles(root, new SimpleFileVisitor() {
+
+ @Override
+ public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) {
+ Console.log(path);
+ return FileVisitResult.CONTINUE;
+ }
+ });
+ }
+}