过滤器优化文件搜索
使用过滤器编写实现类实现过滤
package com.itheima.Demo03.Filter;
import java.io.File;
/*
练习:
递归打印多级目录
需求:
只要.jpg结尾的文件
我们可以使用过滤器来实现
在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器
1、File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
用来过滤文件(File)
抽象方法:用来过滤文件的方法
boolean accept(File pathname) 测试指定的抽象路径名是否应包含在路径名列表中。
参数:
File pathname:使用listFiles方法遍历目录,得到的每一个文件对象
2、File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤文件名
作用:用于过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir, String name) 测试指定文件是否应包含在文件列表中。
参数:
File dir:构造方法中传递的被遍历的目录
String name:使用listFiles方法,遍历目录,获取的每一个文件/文件夹的名称
注意:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则
*/
public class Demo01Filter {
public static void main(String[] args) {
File f1 = new File("C:\\Users\\Ao\\Desktop\\lolhfds");
getAllFile(f1);
}
/*
定义一个方法,参数传递File类型的目录
方法中对目录进行遍历
*/
private static void getAllFile(File f1) {
File[] files = f1.listFiles(new FileFilterImpl());
for (File f : files) {
if (f.isFile()) {
System.out.println(f);
} else {
//f是一个文件夹,则继续遍历这个文件夹
//我们发现getAllFile()就是传递文件夹,遍历文件夹的方法
//所以直接调用getAllFile()即可,递归
getAllFile(f);
}
}
}
}
FileFilterImpl.java
package com.itheima.Demo03.Filter;
import java.io.File;
import java.io.FileFilter;
/*
创建过滤器FileFilter的实现类,重写过滤方法accept。定义过滤规则
*/
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
/*
过滤规则:
在accept方法中,判断File对象是否是以.jpg结尾
是就返回true
不是就返回false
*/
if (pathname.isDirectory()) {
return true;
}
return pathname.getName().toLowerCase().endsWith(".jpg");
}
}
FileFilter过滤器原理
使用匿名内部类实现过滤器(并使用lambda简化代码)
package com.itheima.Demo03.Filter;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
/*
练习:
递归打印多级目录
需求:
只要.jpg结尾的文件
我们可以使用过滤器来实现
在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器
1、File[] listFiles(FileFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
用来过滤文件(File)
抽象方法:用来过滤文件的方法
boolean accept(File pathname) 测试指定的抽象路径名是否应包含在路径名列表中。
参数:
File pathname:使用listFiles方法遍历目录,得到的每一个文件对象
2、File[] listFiles(FilenameFilter filter) 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤文件名
作用:用于过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir, String name) 测试指定文件是否应包含在文件列表中。
参数:
File dir:构造方法中传递的被遍历的目录
String name:使用listFiles方法,遍历目录,获取的每一个文件/文件夹的名称
注意:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则
*/
public class Demo02Filter {
public static void main(String[] args) {
File f1 = new File("C:\\Users\\Ao\\Desktop\\lolhfds");
getAllFile(f1);
}
/*
定义一个方法,参数传递File类型的目录
方法中对目录进行遍历
*/
private static void getAllFile(File f1) {
/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//传递过滤器对象,使用匿名内部类
File[] files = f1.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname) {
if(pathname.isDirectory()){
return true;
}
return pathname.getName().toLowerCase().endsWith(".jpg");
}
});
*/
/*
// lambda的改写
File[] files = dir.listFiles(f ‐>{
return f.getName().endsWith(".java") || f.isDirectory();
});
*/
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//使用FilenameFilter
/*
File files[] = f1.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isDirectory()||name.toLowerCase().endsWith(".jpg");
}
});
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
//使用lambda表达式,优化匿名内部类,接口中只有一个抽象方法
File files[] = f1.listFiles((File d, String name) -> {
return new File(d, name).isDirectory() || name.toLowerCase().endsWith(".jpg");
});
//优化
//File files[] = f1.listFiles((d,name)-> new File(d,name).isDirectory()||name.toLowerCase().endsWith(".jpg"));
for (File f : files) {
if (f.isFile()) {
System.out.println(f);
} else {
//f是一个文件夹,则继续遍历这个文件夹
//我们发现getAllFile()就是传递文件夹,遍历文件夹的方法
//所以直接调用getAllFile()即可,递归
getAllFile(f);
}
}
}
}
TestFileter.java
package com.itheima.Demo03.Filter;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class TestFilter {
public static void main(String[] args) {
File f = new File("E:\\1.学习资料");
printMl(f);
}
private static void printMl(File f) {
System.out.println(f);
/*File [] files = f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".flv")||new File(dir,name).isDirectory();
}
});*/
//File [] files = f.listFiles((d,n)->{return n.endsWith(".java")||new File(d,n).isDirectory();});
/*
private static void printMl(File f) {
System.out.println(f);
File [] files = f.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".flv")||pathname.isDirectory();
}
});
*/
File[] files = f.listFiles(path -> {
return path.getName().toLowerCase().endsWith(".flv") || path.isDirectory();
});
for (File file : files) {
if (file.isFile()) {
System.out.println(file);
} else {
printMl(file);
}
}
}
}