如何用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
相关产品推荐
相关产品推荐

