java过滤文件类型_Java 之 文件过滤器

本文介绍了如何在Java中实现文件搜索,特别是搜索特定类型的文件,如.java文件。通过递归遍历目录和使用FileFilter或FilenameFilter接口,我们可以定制过滤规则,筛选出符合要求的文件。此外,还展示了使用匿名内部类和Lambda表达式简化过滤器的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习过滤器之前,先来做一个案例。

题目:文件搜索,搜索 D:\java 目录中 .java 文件。

分析:

1.  目录搜索,无法判断多少级目录,使用递归,遍历所有目录

2.  遍历目录时,获取的子文件,通过文件名称,判断是否符合条件

实现:

1 public classFileDemo {2 public static voidmain(String[] args) {3 //创建File对象

4 File dir = new File("D:\\java");5 //调用打印目录方法

6 printDir(dir);7 }8 public static voidprintDir(File dir) {9 //获取子文件和目录

10 File[] files =dir.listFiles();11 //循环打印

12 for(File file : files) {13 if(file.isFile()) {14 //是文件,判断文件名并输出文件绝对路径

15 if (file.getName().toLowerCase().endsWith(".java")) {16 System.out.println("文件名:" +file.getAbsolutePath());17 }18 } else{19 //是目录,继续遍历,形成递归

20 printDir(file);21 }22 }23 }24 }

文件过滤器

java.io.FileFilter 是一个接口,是 File 的过滤器。

在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器。

接口一:

File[] listFiles(FileFilter filter) java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。

作用:返回所有满足指定过滤器的文件和目录,如果给定的 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(java.io.File) 方法返回 true时,该路径名才满足过滤器。如果当前 File 对象不表示一个目录,或者发生 I/O 错误,则返回 null。

抽象方法:用来过滤文件的方法

boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。

参数: File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象

接口二:

File[] listFiles(FilenameFilter filter) java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名。

作用:返回所有满足指定过滤器的文件和目录。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FilenameFilter.accept(java.io.File, java.lang.String) 方法返回 true 时,该路径名才满足过滤器。如果当前File对象不表示一个目录,或者发生 I/O 错误,则返回 null。

抽象方法:用来过滤文件的方法

boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。

参数:

File dir:构造方法中传递的被遍历的目录

String name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称

注意:两个过滤器接口是没有实现类的,需要自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则

FileFilter 过滤器的原理:

56d1ff3eeef8b0f4c413f62bfcd24adc.bmp

Demo:

1 //创建过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则

2 public class FileFilterImpl implementsFileFilter{3 @Override4 public booleanaccept(File pathname) {5 /*

6 过滤的规则:7 在accept方法中,判断File对象是否是以.java结尾8 是就返回true9 不是就返回false10 */

11 //如果pathname是一个文件夹,返回true,继续遍历这个文件夹

12 if(pathname.isDirectory()){13 return true;14 }15

16 return pathname.getName().toLowerCase().endsWith(".java");17 }18 }

测试类:

1 //测试类

2 public static voidmain(String[] args) {3 File file = new File("c:\\abc");4 getAllFile(file);5 }6

7 /*

8 定义一个方法,参数传递File类型的目录9 方法中对目录进行遍历10 */

11 public static voidgetAllFile(File dir){12 File[] files = dir.listFiles(new FileFilterImpl());//传递过滤器对象

13 for(File f : files) {14 //对遍历得到的File对象f进行判断,判断是否是文件夹

15 if(f.isDirectory()){16 //f是一个文件夹,则继续遍历这个文件夹17 //我们发现getAllFile方法就是传递文件夹,遍历文件夹的方法18 //所以直接调用getAllFile方法即可:递归(自己调用自己)

19 getAllFile(f);20 }else{21 //f是一个文件,直接打印即可

22 System.out.println(f);23 }24 }25 }

Lambad 优化

1、使用匿名内部类

Demo:

1 public static voidmain(String[] args) {2 File file = new File("c:\\abc");3 getAllFile(file);4 }5

6   public static voidgetAllFile(File dir){7 //传递过滤器对象 使用匿名内部类

8 File[] files = dir.listFiles(newFileFilter() {9 @Override10 public booleanaccept(File pathname) {11 //过滤规则,pathname是文件夹或者是.java结尾的文件返回true

12 return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");13 }14 });15 File[] files = dir.listFiles(newFilenameFilter() {16 @Override17 public booleanaccept(File dir, String name) {18 //过滤规则,pathname是文件夹或者是.java结尾的文件返回true

19 return new File(dir,name).isDirectory() || name.toLowerCase().endsWith(".java");20 }21 });22 for(File f : files) {23 //对遍历得到的File对象f进行判断,判断是否是文件夹

24 if(f.isDirectory()){25 //f是一个文件夹,则继续遍历这个文件夹26 //我们发现getAllFile方法就是传递文件夹,遍历文件夹的方法27 //所以直接调用getAllFile方法即可:递归(自己调用自己)

28 getAllFile(f);29 }else{30 //f是一个文件,直接打印即可

31 System.out.println(f);32 }33 }34 }

2、使用Lambda 表达式

FileFilter 是只有一个方法的接口,因此可以用lambda表达式简写

Demo:

1 public static voidmain(String[] args) {2 File file = new File("c:\\abc");3 getAllFile(file);4 }5 /*

6 定义一个方法,参数传递File类型的目录7 方法中对目录进行遍历8 */

9 public static voidgetAllFile(File dir){10

11   //方式一

12   File[] files = dir.listFiles((File pathname)->{13 return pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java");14 });15

16   //方式一 Lambda 优化后

17   File[] files = dir.listFiles(pathname->pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java"));18

19   //方式二

20     File[] files = dir.listFiles((File d, String name)->{21 //过滤规则,pathname是文件夹或者是.java结尾的文件返回true

22 return new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java");23 });24

25   //方式二 Lambada 优化后

26   File[] files = dir.listFiles((d,name)->new File(d,name).isDirectory() || name.toLowerCase().endsWith(".java"));27

28   //遍历输入

29     for(File f : files) {30 //对遍历得到的File对象f进行判断,判断是否是文件夹

31 if(f.isDirectory()){32 //f是一个文件夹,则继续遍历这个文件夹33 //我们发现getAllFile方法就是传递文件夹,遍历文件夹的方法34 //所以直接调用getAllFile方法即可:递归(自己调用自己)

35 getAllFile(f);36 }else{37 //f是一个文件,直接打印即可

38 System.out.println(f);39 }40 }41 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值