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

SpringBoot资源目录获取所有TXT文件失败,仅拿到根目录文件求助

问题分析与解决方案

你的代码只拿到a.txt的核心原因很明确:Files.list()方法只会遍历目标目录的直接子项,不会递归扫描子文件夹。它会把b/、c/这些子目录当成普通项处理,但你的过滤条件只匹配.txt后缀,所以这些目录被过滤掉了,自然拿不到子目录里的b1.txt、b2.txt等文件。

下面给你两种可行的修复方案,都是基于递归遍历目录的思路:

方案1:使用Files.walk()递归遍历

Files.walk()会自动遍历目标目录下的所有层级子目录,非常适合你的场景。记得用try-with-resources包裹流,避免资源泄漏:

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;

// ... 你的类和方法 ...
ClassLoader classLoader = this.getClass().getClassLoader();
Path configFilePath = Paths.get(classLoader.getResource("files").toURI());

try (Stream<Path> fileStream = Files.walk(configFilePath)) {
    List<Path> trackFileNames = fileStream
            .filter(Files::isRegularFile) // 先排除目录,只保留文件
            .filter(path -> path.toString().endsWith(".txt"))
            .map(Path::getFileName) // 提取文件名部分
            .sorted()
            .collect(Collectors.toList());
    
    // 在这里使用你的trackFileNames列表
} catch (IOException | URISyntaxException e) {
    // 处理异常,比如打印日志或抛出业务异常
    e.printStackTrace();
}

方案2:使用Files.find()更精准控制

如果你想更灵活地控制遍历深度(比如知道最多只有一层子目录),可以用Files.find(),它允许你指定最大遍历深度,同时直接在匹配条件里组合文件判断和后缀过滤:

// ... 导入同上 ...
ClassLoader classLoader = this.getClass().getClassLoader();
Path configFilePath = Paths.get(classLoader.getResource("files").toURI());

try (Stream<Path> fileStream = Files.find(
        configFilePath,
        Integer.MAX_VALUE, // 遍历所有层级,也可以设为2只扫一层子目录
        (path, attrs) -> attrs.isRegularFile() && path.toString().endsWith(".txt")
)) {
    List<Path> trackFileNames = fileStream
            .map(Path::getFileName)
            .sorted()
            .collect(Collectors.toList());
    
    // 使用结果
} catch (IOException | URISyntaxException e) {
    e.printStackTrace();
}

额外提示

  • 关于后缀匹配:如果需要兼容大小写(比如.TXT文件),可以把判断改成path.toString().toLowerCase().endsWith(".txt")。
  • 资源关闭:Files.walk()和Files.list()返回的Stream必须关闭,try-with-resources是最安全的方式,它会在代码块结束后自动关闭流。

内容的提问来源于stack exchange,提问作者Nunyet Calçada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:10:31