)
一、案例需求给定一个文件夹递归遍历该目录下所有子文件夹找到全部后缀为.java的文件输出每一个 java 文件的绝对路径。思路分析调用listFiles()获取当前文件夹下所有 File 对象文件 子目录循环遍历每一个 File如果是文件判断文件名是否以.java结尾符合条件打印绝对路径如果是文件夹继续调用自身方法递归继续往下搜索二、完整代码package Test_06; import java.io.File; public class TestFile2 { public static void main(String[] args) { // 定义要遍历的根文件夹 File file new File(file); // 调用递归方法查找java文件 selectFileEndJava(file); } /** * 递归遍历文件夹筛选后缀为.java的文件 * param file 传入文件夹对象 */ public static void selectFileEndJava(File file) { //1.获取文件夹中所有的内容文件文件夹 File[] fs file.listFiles(); //遍历获取的每一个文件或文件夹 for(File f:fs) { //判断获取的结果是文件还是文件夹 if(f.isFile()) { //是文件判断是否以.java结尾 if(f.getName().endsWith(.java)) { //打印输出该文件的绝对路径 System.out.println(f.getAbsolutePath()); } }else { //是文件夹递归继续查找 selectFileEndJava(f); } } } }三、代码关键点说明File[] fs file.listFiles()获取当前目录下所有一级子项返回 File 数组只能作用于文件夹如果传入的是文件会返回 null。f.isFile()判断当前对象是否为文件f.isDirectory()判断是否为文件夹f.getName().endsWith(.java)获取文件名判断字符串后缀是否为.java用来筛选 Java 源代码文件。f.getAbsolutePath()输出文件的绝对路径可以直观看到文件在电脑磁盘上的完整位置。递归遇到子文件夹时再次调用selectFileEndJava(f)进入子文件夹继续检索实现深度遍历。⚠️注意代码中原始版本存在一处逻辑 bugelse写在了内层 if 里面会导致逻辑错误上面代码已经修复该问题。 原错误代码逻辑if(f.isFile()){ if(xxx){ }else{ //错误这里else对应的是文件的if判断会把文件当成文件夹递归 } }四、运行结果示例D:\code\Test_06\file\TestFile2.java D:\code\Test_06\file\demo\Hello.java五、拓展思考如果目录权限不足listFiles()返回 null程序会空指针可以增加if(fs ! null)判断保护代码。可以修改后缀用来查找.txt、.md等其他类型文件。递归适合层级不深的目录目录层级极深时会发生栈溢出。六、核心考点总结File 递归遍历是 IO 递归经典面试题listFiles()获取目录下所有子项endsWith()字符串后缀匹配区分文件和目录文件夹才可以继续递归