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

如何避免PathMatchingResourcePatternResolver返回目录资源及判断资源是否为目录

解决PathMatchingResourcePatternResolver返回目录资源的问题

这个场景我日常开发中经常碰到,Spring的PathMatchingResourcePatternResolver默认会把目录也作为资源返回,但其实咱们可以通过Resource接口自带的方法轻松判断并过滤掉目录。

一、判断单个资源是否为目录

Resource接口提供了isDirectory()方法,专门用来判断当前资源是否是目录。不过这个方法会抛出IOException(比如资源无法访问时),所以需要捕获异常:

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("/package1/**");

for (Resource resource : resources) {
    try {
        if (resource.isDirectory()) {
            System.out.println("检测到目录:" + resource.getFilename());
        } else {
            // 这里处理你的文件资源逻辑
            System.out.println("处理文件:" + resource.getURI());
        }
    } catch (IOException e) {
        // 处理资源访问异常,比如记录日志或跳过该资源
        e.printStackTrace();
    }
}

二、过滤目录,只保留文件资源

如果想直接获取仅包含文件的资源列表,可以结合Java Stream API做过滤,一步到位:

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ResourceFilterDemo {
    public static void main(String[] args) throws IOException {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource[] allResources = resolver.getResources("/package1/**");

        // 过滤掉所有目录资源,只保留文件
        List<Resource> onlyFiles = Arrays.stream(allResources)
                .filter(resource -> {
                    try {
                        return !resource.isDirectory();
                    } catch (IOException e) {
                        // 遇到异常时默认排除该资源,也可以根据业务调整逻辑
                        e.printStackTrace();
                        return false;
                    }
                })
                .collect(Collectors.toList());

        // 遍历处理文件资源
        onlyFiles.forEach(file -> {
            try {
                System.out.println("有效文件路径:" + file.getURI());
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}

额外说明

  • 不管是FileSystemResource(文件系统资源)还是ClassPathResource(类路径资源,比如Jar包内的资源),isDirectory()方法的行为都是统一的,Spring已经封装了底层细节,不用关心具体资源类型。
  • 如果匹配模式更精准,比如只想匹配package1下的所有Java文件,可以用/package1/**/*.java,这样能直接减少不必要的目录和非目标文件返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:39:14