对于一个嵌套的目录,获取目录下所有的文件,可以使用一下两种方式:
1、递归方法:
static List<String> ergodic(File file, List<String> resultFileName) { File[] files = file.listFiles(); if (files == null) return resultFileName;// 判断目录下是不是空的 for (File f : files) { if (f.isDirectory()) {// 判断是否文件夹 //resultFileName.add(f.getPath()); ergodic(f, resultFileName);// 调用自身,查找子目录 } else resultFileName.add(f.getPath()); } return resultFileName; }
File类提供了如下两个方法:
- file.list():返回目录下文件和子目录名;(不会递归)
- file.listFiles():返回目录下文件和子目录File对象;(不会递归)
2、Files.walk():
在jdk8中,可以使用walk方法递归的去查找目录下所有文件,例如:
static void walk(String path) throws Exception { try (Stream<Path> paths = Files.walk(Paths.get(path))) { paths .filter(Files::isRegularFile) .forEach(System.out::println); } }
说明:
- 上例使用了Try with Resources模式,它可以确保无论在什么情况下,流都将关闭。
- walk方法会自动递归子目录;
Files.walk通过递归遍历以给定起始文件为根的文件树来返回由Path延迟填充的流。文件树是深度优先遍历的,有两种重载的Files.walk方法:
- maxDepth参数,设置要递归的深度;Files.walk(Paths.get(path),2)
- 默认不会自动跟随符号链接, 设置options参数FOLLOW_LINKS选项,则遵循符号链接。 Files.walk(Paths.get(path),FileVisitOption.FOLLOW_LINKS)
接下来看一些示例:
var dirName = "C:/Users/Jano/Downloads"; //过滤出目录 try (Stream<Path> paths = Files.walk(Paths.get(dirName))) { paths.filter(Files::isDirectory) .forEach(System.out::println); } //按后缀名过滤 try (Stream<Path> paths = Files.walk(Paths.get(dirName), 2)) { paths.map(path -> path.toString()).filter(f -> f.endsWith(".pdf")) .forEach(System.out::println); }
更多示例可以查看:https://vimsky.com/examples/detail/java-method-java.nio.file.Files.walk.html
原文地址:java 递归获取目录下所有文件
文章评论