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

