导语:在学习完File类基础上,引入案例,以“搜索特定文件”为目标,进行延伸出文件过滤器FilenameFilter类和FileFilter类知识,并结合文件滤波器和案例的实例,完成对两个接口的理解。希望对你学习有所帮助。
一、引入案例:搜索指定文件
案例需求:搜索D:\\Demo目录中,后缀为.java的文件。
案例程序:
import java.io.File;
public class DemoFile13_getJavaFiles {
public static void main(String[] args) {
File file = new File("D:\\Demo"); //创建指定目录文件对象
getJavaFiles(file); //调用方法
}
public static void getJavaFiles(File file){
File[] files=file.listFiles();
for(File s:files){
if (s.isDirectory()){
getJavaFiles(s); //对目录进行递归遍历
}else {
/**
*可以使用String类中的.endsWith()方法
*/
// String s1 = s.toString(); //1.方法1
// String s1 = s.getName(); //2.方法2
String s1 = s.getPath(); //3.方法3
boolean b = s1.endsWith(".java"); //判断文件结尾是否以“.java"结尾,返回值为boolean值
if(b){
System.out.println(s); //直至文件对象,输出.java文件
}
}
}
}
}
案例结果:
二、FilenameFilter类和FileFilter类的理解
在java.io包中的File接口的方法中,listFiles(FileFilter filter) 和listFiles(FilenameFilter filter)参数是FileFilter和 FilenameFilter。
功能:返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
(一)FilenameFilter
FilenameFilter是位于java.io包的接口,要求被执行一个accept方法。FilenameFilter实例一旦被创建,可能被传递到工具中,工具通过accept方法决定是否列出文件名。
(二)FileFilter
FileFilter是位于java.io包的接口。FileFilter类接收所有是文件的元素。如果执行FileFilter接口必须提供一个accept方法的实现方法。
(三)FilenameFilter类和FileFilter类的异同
相同:两者都是用来过滤文件的;
两者的accept方法都没有实现类,需要自己在方法定义过滤条件的实现类。
不同:两者的accept方法的参数不同。
FilenameFilter接口:
boolean accept(File dir,String name) dir:当前目录,name:文件名。
FileFilter接口:
boolean accept(File pathname) pathname:文件
三、结合案例
案例程序一:(以FileFilter类为例)
主程序:
import java.io.File;
public class DemoFile14_getJavaFilesUseFilter {
public static void main(String[] args) {
File file = new File("D:\\Demo"); //创建指定目录文件对象
getJavaFiles(file); //调用方法
}
public static void getJavaFiles(File file){
File[] files=file.listFiles(new thisFileFilter());
for(File s:files){
if (s.isDirectory()){
getJavaFiles(s); //对目录进行递归遍历
}else {
System.out.println(s); //直至文件对象,输出.java文件
}
}
}
}
过滤器:
import java.io.File;
import java.io.FileFilter;
public class thisFileFilter implements FileFilter {
//重写实现类accept方法
@Override
public boolean accept(File pathname) {
// 如果是文件夹也要返回true
if(pathname.isDirectory()){
return true;
}
// 将File路径转换成string类型,
// 调用toLowerCase()将路径转换成小写,
// 再调用endsWith判断是否是以.java结尾的。
// 返回一个boolean值类型
boolean equals = pathname.toString().toLowerCase().endsWith(".java");
return equals;
}
}
测试结果:
案例程序二:(以FilenameFilter为例)
主程序:
import java.io.File;
public class DemoFile15_getJavaFilesUseFilter {
public static void main(String[] args) {
File file = new File("D:\\Demo"); //创建指定目录文件对象
getJavaFiles(file); //调用方法
}
public static void getJavaFiles(File file){
String name="*.java";
File[] files=file.listFiles(new thisFilenameFilter());
for(File s:files){
if (s.isDirectory()){
getJavaFiles(s); //对目录进行递归遍历
}else {
System.out.println(s); //直至文件对象,输出.java文件
}
}
}
}
过滤器:
import java.io.File;
import java.io.FilenameFilter;
public class thisFilenameFilter implements FilenameFilter {
@Override
public boolean accept(File dir, String name) {
// dir是:目录的名称"D:\\Demo"; name是:目录中文件的名称。
return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");
}
}
测试结果: