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

