练习:递归打印多级目录:
package com.itheima.demo01.Recursion;
import java.io.File;
public class Demo03Recursion {
public static void main(String[] args) {
File file = new File("C:\\Users\\大 大\\Desktop\\aaa");
getAllFile(file);
}
//定义一个方法,参数传递File类型的目录,方法中对目录进行遍历
public static void getAllFile(File dir) {
//打印便利的目录名称
System.out.println(dir);
File[] files = dir.listFiles();
for (File f : files) {
//对遍历得到的File对象f进行判断,判断是否是文件夹
if(f.isDirectory()){
getAllFile(f);
}else {
//f是一个文件,直接打印即可
System.out.println(f);
}
}
}
}
综合案例:文件搜索
搜索D:\aaa
目录中的.java
文件。
分析:
- 目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
- 遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。
package com.itheima.demo01.Recursion;
import java.io.File;
/*
* 打印多级目录下的后缀名以.java结尾得文件*/
public class Demo04Recursion {
public static void main(String[] args) {
File file = new File("C:\\Users\\大 大\\Desktop\\aaa");
getAllFile(file);
}
//定义一个方法,参数传递File类型的目录,方法中对目录进行遍历
public static void getAllFile(File dir) {
//打印便利的目录名称
//System.out.println(dir);
File[] files = dir.listFiles();
for (File f : files) {
//对遍历得到的File对象f进行判断,判断是否是文件夹
if(f.isDirectory()){
getAllFile(f);
}else {
//f是一个文件,直接打印即可
//需要将File对象f转为字符串对象
//1.
//String name = f.getName();
//2.
//String path = f.getPath();
//3.
String s = f.toString(); //toString()方法里面调用的其实就是getPath
//将字符串变成小写的
s = s.toLowerCase();
//判断字符串是不是以.java结尾,注意返回的是布尔型
boolean b = s.endsWith(".java");
if (b){
System.out.println(f);
}
//链式编程
if (f.getName().toString().toLowerCase().endsWith(".java")){
System.out.println(f);
}
}
}
}
}
文件过滤器
java.io.FileFilter
是一个接口,是File对象的过滤器。
该接口的对象可以传递给File类的listFiles(FileFilter)
作为参数, 接口中只有一个方法。
File[ ] ListFiles(FileFilter filter)
`boolean accept(File pathname) ` :测试pathname是否应该包含在当前File目录中,符合则返回true。
参数:File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
File[ ] ListFiles(FilenameFilter filter)
作用:用于过滤文件名称
boolean accept(File dir,String pathname)
:测试指定文件是否应该包含在某一个文件中参数:
File dir:构造方法中传递的被遍历的目录
String name :使用ListFiles方法遍历目录,获取的每一个文件/文件 夹的名称
注意:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept ,在方法中自己定义过滤的规则
FileFilter过滤器原理:
过滤器实现文件过滤
实现类:
package com.itheima.demo01.Recursion;
import java.io.File;
import java.io.FileFilter;
/*
* 重写accept方法,定义过滤规则*/
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
//如果传过来的是目录,不能过滤掉,需要返回true,继续调用方法
if(pathname.isDirectory()){
return true;
}
return pathname.getName().toLowerCase().endsWith(".java");
}
}
主函数
package com.itheima.demo01.Recursion;
import java.io.File;
public class Demo05FileFilter {
public static void main(String[] args) {
File file = new File("C:\\Users\\大 大\\Desktop\\aaa");
getAllFile(file);
}
//定义一个方法,参数传递File类型的目录,方法中对目录进行遍历
public static void getAllFile(File dir) {
//传递过滤器对象
File[] files = dir.listFiles(new FileFilterImpl());
for (File f : files) {
//对遍历得到的File对象f进行判断,判断是否是文件夹
if(f.isDirectory()){
getAllFile(f);
}else {
//f是一个文件,直接打印即可
System.out.println(f);
}
}
}
}
使用匿名内部类和lambda表达式优化程序
package com.itheima.demo01.Recursion;
import java.io.File;
import java.io.FileFilter;
public class Demo06FileFilter {
public static void main(String[] args) {
File file = new File("C:\\Users\\大 大\\Desktop\\aaa");
getAllFile(file);
}
//定义一个方法,参数传递File类型的目录,方法中对目录进行遍历
public static void getAllFile(File dir) {
//传递过滤器对象,使用匿名内部类
/*File[] files = dir.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
//如果传过来的是目录,不能过滤掉,需要返回true,继续调用方法
if(pathname.isDirectory()){
return true;
}
return pathname.getName().toLowerCase().endsWith(".java");
}
});*/
//使用lambda表达式(接口中只有一个抽象方法)
//当方法体只有一句时,可以把大括号,return,return语句后的分号省略!
File[] files = dir.listFiles((pathname)->
//如果传过来的是目录,不能过滤掉,需要返回true,继续调用方法
pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java")
);
for (File f : files) {
//对遍历得到的File对象f进行判断,判断是否是文件夹
if(f.isDirectory()){
getAllFile(f);
}else {
//f是一个文件,直接打印即可
System.out.println(f);
}
}
}
}