You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PathMatcher获取指定目录下的非递归*.pdf文件?

解决Java PathMatcher匹配指定目录下非递归PDF文件的问题

我明白你遇到的问题了——用glob:**.pdf会递归扫所有子目录的PDF,而glob:*.pdf又找不到当前目录下的文件,明明文件就在那对吧?这其实是因为glob模式的匹配逻辑和你拿到的路径格式不匹配导致的,我来给你拆解一下并解决:

为什么glob:*.pdf找不到文件?

当你用Files.list(targetDir)遍历目标目录时,拿到的每个Path都是完整路径(比如/Users/you/docs/file.pdf),而glob:*.pdf这个模式只能匹配纯文件名等于xxx.pdf的路径——也就是说,它不会忽略路径前面的目录部分,所以带目录前缀的完整路径自然匹配不上。

而glob:**.pdf里的**表示任意层级的目录,所以会匹配所有子目录里的PDF,这就导致了递归查找的问题。

两种可行的解决方案

方案1:把目标目录拼接到glob模式中

直接构造一个针对目标目录的glob模式,明确只匹配该目录下的PDF文件:

import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;

public class PdfFinder {
    public static void main(String[] args) {
        // 替换成你的目标目录路径
        Path targetDir = Paths.get("/your/target/directory");
        // 构造匹配目标目录下直接PDF的glob模式
        PathMatcher matcher = FileSystems.getDefault().getPathMatcher(
            "glob:" + targetDir + "/*.pdf"
        );

        try {
            // Files.list只会遍历当前目录,不会递归子目录
            Files.list(targetDir)
                 .filter(matcher::matches)
                 .forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方案2:只匹配文件名部分

既然问题出在完整路径带目录前缀,那我们可以只提取每个文件的文件名来匹配*.pdf模式:

import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;

public class PdfFinder {
    public static void main(String[] args) {
        Path targetDir = Paths.get("/your/target/directory");
        // 用*.pdf匹配纯文件名
        PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.pdf");

        try {
            Files.list(targetDir)
                 // 提取文件名进行匹配
                 .filter(path -> matcher.matches(path.getFileName()))
                 .forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

额外提醒

Files.list(targetDir)本身就是非递归的,它只会遍历目标目录下的直接子项(文件和子目录),所以结合上面的匹配逻辑,刚好能满足你“只找当前目录下PDF,不包含子目录”的需求。如果不小心用了Files.walk,那才会递归子目录,注意区分就行。

内容的提问来源于stack exchange,提问作者menteith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:31:02