java复习第7天---7.4---IO流---递归、文件过滤器
目录
内容
1、递归
1.1、递归概述和分类
-
递归:在方法内调用自己
-
递归分类
- 递归分为直接递归和间接递归
- 直接递归:方法内直接调用自己
- 间接调用:方法A 调用B,方法B调用C,方法C调用A
-
注意事项:
- 递归需要有限定条件,保证递归能够停下来,否则会发生栈内存溢出
- 虽然递归有限定条件,但是递归次数不能太多,否则也会发生内存溢出
- 构造方法,禁止递归
-
示例1.1-1:求n的阶乘 n! = 1 * 2 * 3 * … * n
package func.digui; public class TestDigui1 { public static void main(String[] args) { // 计算n的阶乘 1*2*3*...*n int n = 10; System.out.println(n + "! = " + method(n)); } public static long method(int n) { if(n == 1) return 1; return n * method(n - 1); } } 测试结果: 10! = 3628800
+示例1.1-2:递归打印多级目录
package io.file;
import java.io.File;
public class TestFileDigui {
public static void main(String[] args) {
String parent = "f:\\test";
File file = new File(parent);
printDir(file, 1);
}
public static void printDir(File file, int level) {
for(int i = 0; i < level; i++) {
System.out.print("-");
}
System.out.println(file.getName());
if(file.isDirectory()) {
File[] files = file.listFiles();
for(File x: files) {
printDir(x, level + 1);
}
}
}
}
测试结果:
-test
--a.txt
--b
---c
----d
--b.txt
--c.java
--d.bmp
--hello
--src
-
示例1.1-3:搜索所有.java文件
package io.file; import java.io.File; public class TestFileDigui2 { public static void main(String[] args) { String parent = "f:\\test"; File file = new File(parent); searchJava(file); } public static void searchJava(File file) { if(file.isDirectory()) { File[] files = file.listFiles(); for(File x: files) { searchJava(x); } }else { if(file.getName().endsWith(".java")) { System.out.println(file.getAbsolutePath()); } } } } 测试结果: f:\test\c.java f:\test\hello\HelloWorld.java
2、过滤器
File类中有2个和listFiles重载的方法,方法参数为过滤器。
- public Files[] listFiles(FileFilter filter):遍历抽象路径名符合过滤器规则的File对象
- public Files[] listFiles(FilenameFilter filter):遍历抽象路径名符合过滤器规则的File对象
FileFilter和FilenameFilter接口都没有实现类,如果需要使用需要自定义实现。
-
FileFilter接口:
- 唯一抽象方法:public boolean accept(File pathname)
- File pathname: 使用listFiles遍历目录得到的每一个File对象
-
FilenameFilter接口:
- 唯一抽象方法:public boolean accept(File dir, String name)
- File dir:需要遍历的目录
- String name:listFiles遍历 dir目录得到的每一个文件/目录名称
-
示例2-1:搜索F:\test目录下所有的.java文件,FileFilter过滤器+ lambda表达式实现
package io.file; import java.io.File; import java.io.FileFilter; public class TestFileDigui3 { public static void main(String[] args) { String parent = "f:\\test"; File file = new File(parent); searchJava(file); } // 搜索java文件 public static void searchJava(File file) { File[] filelist = file.listFiles(filepath->filepath.isDirectory() || filepath.getName().toLowerCase().endsWith(".java")); for(File x: filelist) { if(x.isDirectory()) searchJava(x); else System.out.println(x.getAbsolutePath()); } } } 测试结果: f:\test\c.java f:\test\hello\HelloWorld.java
-
示例2-2:搜索F:\test目录下所有的java文件,FilenameFilter + lambda实现
package io.file; import java.io.File; public class TestFileDigui4 { public static void main(String[] args) { String parent = "f:\\test"; File file = new File(parent); searchJava(file); } // 搜索java文件 public static void searchJava(File file) { File[] filelist = file.listFiles((dir, name)->new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".java")); for(File x: filelist) { if(x.isDirectory()) searchJava(x); else System.out.println(x.getAbsolutePath()); } } } 测试结果: f:\test\c.java f:\test\hello\HelloWorld.java
后记 :
本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785
前端项目源代码地址:https://gitee.com/gaogzhen/vue-leyou
后端JAVA源代码地址:https://gitee.com/gaogzhen/JAVA