09

mac2024-03-16  26

过滤器优化文件搜索

使用过滤器编写实现类实现过滤

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); } } } }

 

最新回复(0)