如何在指定的目录中获取jar文件,为什么PathMatcher不起作用



我正在尝试获取指定目录中的*.jar文件(没有递归子目录(,我认为我的代码没有问题,但结果令人费解,我做错了什么吗?

import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.*;
public class Test {
private static final PathMatcher JAR_FILE_MATCHER = FileSystems.getDefault().getPathMatcher("glob:*.jar");
public static void main(String[] args) throws IOException {
List<Path> list = new ArrayList<>();
Files.walkFileTree(Path.of("E:/lib"), new SimpleFileVisitor<>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
if (JAR_FILE_MATCHER.matches(file)) list.add(file);
else System.out.println("[mismatched] " + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException e) {
return FileVisitResult.CONTINUE;
}
});
System.out.printf("Total: %d jar files found!%n", list.size());
}
}
The output:
[mismatched] E:libcommons-lang3-3.12.0.jar
[mismatched] E:liblog4j-api-2.18.0.jar
[mismatched] E:liblog4j-core-2.18.0.jar
[mismatched] E:libojdbc6-12.1.0.1-atlassian-hosted.jar
[mismatched] E:libspring-web-5.3.22.jar
Total: 0 jar files found!

在指定目录中扫描jar的更好方法是什么?

提前感谢:(

问题在于您定义的PathMatcher。

private static final PathMatcher JAR_FILE_MATCHER = FileSystems.getDefault().getPathMatcher("glob:**/*.jar");

将工作,因为"**"匹配任何字符串,包括子路径(如示例中的E:/lib(:(

您应该为您的案例使用查找版本:

try (Stream<Path> s = Files.find(Path.of("E:/lib"),
1 /* see below */, 
(path, attrs) -> JAR_FILE_MATCHER.matches(file)
)) {
var list = s.toList();
}

1是最大深度:如果你不想递归扫描,值为1可以避免这种情况。

该列表是另一种选择,尽管它也返回目录和过滤文件确实有成本:

try (Stream<Path> s = Files.list(Path.of("E:/lib"))) {
var list = s.filter(JAR_FILE_MATCHER::matches)
.filter(Files::isRegularFile)
.toList();
}

最新更新