gpt4 book ai didi

带大小过滤器的 Java8 Glob PathMatcher

转载 作者:行者123 更新时间:2023-11-30 07:36:42 25 4
gpt4 key购买 nike

我的目标是创建一个具有 glob 功能的 FileScanner 并添加一些自定义过滤器功能(例如最小或最大文件大小)。

我的第一次尝试是:

    final PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:**/*.java");
Path path2 = Paths.get("c:/dummy");
try (final Stream<Path> stream = Files.list(path2)) {
stream.filter(pathMatcher::matches).forEach(FileProcessor::processFile);
}

这可以很好地在 c:\dummy 目录中查找 *.java 文件。但是我需要做什么才能只找到小于 1000 字节的 *.java 文件?

我的尝试是:

    PathMatcher myMatcher = path -> {
// Do size comparision ...
return true;
};

Path path = Paths.get("c:/dummy");
try (final Stream<Path> stream = Files.list(path)) {
stream.filter(myMatcher::matches).forEach(FileProcessor::processFile);
}

但是有了这个解决方案,我就不再有这些问题了。

最后一次尝试是:

路径path3 = Paths.get("c:/dummy"); 最终 PathMatcher pathMatcher2 = FileSystems.getDefault().getPathMatcher("glob:**/*.java");

    Files.walkFileTree(path3, new SimpleFileVisitor<Path>() {

@Override
public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
if (pathMatcher2.matches(path)) {
// Do size comparison
}
return FileVisitResult.CONTINUE;
}

@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
});

最后一个可以工作,但是看起来不太好,并且使用 SimpleFileVisitor 对象感觉有点复杂。

有人知道如何解决这个问题吗?

您好,豪克

最佳答案

根据要检查的文件名的属性,您可以使用 Files.find() 代替:

// Note that you can use a `PathMatcher` for the name instead if you want
final BiPredicate<Path, BasicFileAttributes> filter =
(path, attrs) -> path.getFileName().toString().endsWith(".java") && attrs.size() <= 1000L;

try (
final Stream<Path> = Files.find(baseDir, Integer.MAX_VALUE, filter);
) {
// process the stream
}

您还可以使用Files.walk();但是,Files.find() 的优点是它会自动为您检索属性:使用 Files.walk() 则必须手动完成。

关于带大小过滤器的 Java8 Glob PathMatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35293540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com