Java如何获取名称大于指定整数的数字文件夹下的全部文件?
最简实现方案:用Java 8+ NIO + Stream API
这个需求用Java 8及以上版本的NIO.2结合Stream API来实现最简洁,不用手动写递归逻辑,链式调用就能搞定。直接上代码,再拆解说明:
完整代码示例
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.stream.Collectors; public class FilteredFileCollector { public static void main(String[] args) { // 定义目标根目录和阈值x Path rootDirectory = Paths.get("/home/user"); int x = 19620918; try { List<String> result = Files.list(rootDirectory) // 第一步:仅保留根目录下的文件夹 .filter(Files::isDirectory) // 获取文件夹的名称字符串 .map(dir -> dir.getFileName().toString()) // 过滤出名称为纯数字的文件夹(排除非数字命名的目录) .filter(name -> { try { Integer.parseInt(name); return true; } catch (NumberFormatException e) { return false; } }) // 将文件夹名称转为整数 .map(Integer::parseInt) // 筛选出编号大于x的文件夹 .filter(num -> num > x) // 将整数编号转回对应的文件夹Path对象 .map(num -> rootDirectory.resolve(String.valueOf(num))) // 遍历符合条件的文件夹下的所有普通文件(默认递归遍历子目录) .flatMap(dir -> { try { // 若不需要递归子目录,替换为Files.list(dir)即可 return Files.walk(dir) .filter(Files::isRegularFile); } catch (Exception e) { // 处理文件夹无法访问的异常,直接跳过该目录 return java.util.stream.Stream.empty(); } }) // 转换为完整路径字符串 .map(Path::toString) // 收集为最终列表 .collect(Collectors.toList()); // 输出结果,与你的预期完全匹配 result.forEach(System.out::println); } catch (Exception e) { e.printStackTrace(); } } }
代码逻辑拆解
Files.list(rootDirectory):列出根目录下的直接子项,不会递归,比全量遍历更高效filter(Files::isDirectory):直接过滤掉普通文件(比如例子里的xyz.txt、suv.txt)- 纯数字文件夹校验:通过try-catch判断文件夹名称是否为有效整数,避免非数字命名的目录干扰
filter(num -> num > x):精准筛选出编号大于给定阈值的目标文件夹Files.walk(dir):递归遍历目标文件夹下的所有文件;如果只需要直接子文件,换成Files.list(dir)即可map(Path::toString):将Path对象转为字符串格式的完整路径,完全符合需求中的输出格式
针对你的示例测试
当x=19620918时,代码会筛选出19620919和19620920两个文件夹,然后遍历它们下面的所有普通文件,最终输出:
/home/user/19620919/abc.txt /home/user/19620919/def.txt /home/user/19620920/abc.txt
完全匹配你预期的结果。
额外优化建议
如果文件夹名称可能超出Integer的范围,可以把Integer.parseInt换成Long.parseLong来支持更大的数字;如果不需要递归遍历子目录,替换Files.walk为Files.list能进一步提升执行效率。
内容的提问来源于stack exchange,提问作者Prachi
相关产品推荐
相关产品推荐

