遍历多级目录、FileFilter文件过滤器、文件搜索案例

2 篇文章 0 订阅

遍历多级文件目录内所有文件


代码实现:

package FileFilter;

import java.io.File;

public class demo {

	public static void main(String[] args) {
		File file = new File("D:\\WPS Office");
		//获取D:\\WPS Office目录内的所有文件
		getAllFile(file);
	}
	
	//文件搜索获取当前目录及其子目录内的所有文件
	public static void getAllFile(File filename) {
		File[] fileArray = filename.listFiles();
		for(File file:fileArray) {
			
			//判断当前文件实例file是否是文件夹
			if(file.isDirectory()) {
				//如果是文件夹则继续遍历
				getAllFile(file);
			}else {
				//如果不是则输出文件名
				System.out.println(file.toString());
				
				//每次输出让线程进入睡眠100ms,看得明显一些
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		}
	}
}

 测试:可以看到打印出了所有文件。但当我们只需要指定文件时该怎么做呢?

 方法一:对获取到的文件进行后缀判断,以此获取指定的文件类型。

 通过String 类的API   boolean endsWith(String suffix);

注意会用简便的链式写法 file.getPath().toLowerCase().endWith();

	//对上面的方法进行改写
	public static void getAllFile(File filename) {
		File[] fileArray = filename.listFiles();
		for(File file:fileArray) {
			
			//判断当前文件实例file是否是文件夹
			if(file.isDirectory()) {
				//如果是文件夹则继续遍历
				getAllFile(file);
			}else {
				
				
				//获取文件路径
				String path = file.getPath();
				//把路径换成小写(做不区分大小写处理)
				String filePath = path.toLowerCase();
				//筛选.png结尾的文件
				if(filePath.endsWith(".png")){
					System.out.println(file.toString());
				}
				
				/*
				//链式写法
				if(file.getPath().toLowerCase().endsWith(".png")) {
					System.out.println(file.toString());
				}
				*/
				//如果不是则输出文件名
				//System.out.println(file.toString());
				//每次输出让线程进入睡眠100ms,看得明显一些
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		}
	}

方法二:FileFilter文件拦截器的使用

使用方式 File[ ] listFiles( FileFilter filter);在获取文件数值是传入文件过滤器FileFilter。

//使用方式 File[] fileArray = filename.listFiles(new MyFileFilter());
//定义文件拦截器  实现FileFilter接口,重写accept()方法;
class MyFileFilter implements FileFilter{

	@Override
	public boolean accept(File pathname) {
		
		//如果pathname是文件夹,也可以加入文件集合中继续遍历(JDK listFiles 使用FileFilter.accept 可以分析出)
		if(pathname.isDirectory()) {
			return true;
		}
		return pathname.toString().toLowerCase().endsWith(".png");
	}
}

我们可以通过查看JDK源码了解下FileFilter是如何使用的,下面是JDK中listFiles(FileFilter filter)源码

分析:通过遍历ss字符串String数组,生成File实例对象,通过文件拦截器类使用accept(File pathname)接口判断。accept返回true则把当前File对象加入集合中,ss遍历完毕,方法通过存储File的集合返回一个File[ ]数组。

总结:文件拦截器代码编写虽然简单,我们应该理解它的使用原理,可以通过JDK源码大概分析一下。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值