遍历多级文件目录内所有文件
代码实现:
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源码大概分析一下。