java基础4:io流对象之File对象(下)

1,文件过滤器

/*  需求:得到所有java文件

 *  File类的获取,文件获取过滤器
 *  遍历目录的时候,可以根据需要,只获取满足条件的文件
 *  遍历目录方法 listFiles()重载形式
 *  listFiles(FileFilter filter)接口类型
 *  传递FileFilter接口的实现类
 *  自定义FileFilter接口实现类,重写抽象方法,
 *  接口实现类对象传递到遍历方法listFiles
 */

public class MyFilter implements FileFilter{

     public boolean accept(File pathname) {

          return pathname.getName().toLowerCase().endsWith(.java);

    }

}


public class FileDemo1 {
public static void main(String[] args) {
File file = new File("c:\\demo");
File[] fileArr = file.listFiles(new MyFilter());
for(File f : fileArr){
System.out.println(f);
}
}
}


执行流程如图

java基础4:io流对象之File对象(下)

2,递归遍历所有文件及文件夹

递归原理

/*
*  计算 1+2+3+100和 = 5050
*  计算规律:
*    n+(n-1)+(n-2)
*    100+(100-1)+(99-1)+...1
*/
public static int getSum(int n){
if( n == 1)
return 1;
return n + getSum(n-1);
}


java基础4:io流对象之File对象(下)

代码实现

/*
 *  对一个目录的下的所有内容,进行完全的遍历
 *  编程技巧,方法的递归调用,自己调用自己
 */
public class FileDemo {
public static void main(String[] args) {
File dir = new File("d:\\eclipse");
getAllDir(dir);
}
/*
*  定义方法,实现目录的全遍历
*/
public static void getAllDir(File dir){
System.out.println(dir);
//调用方法listFiles()对目录,dir进行遍历
File[] fileArr = dir.listFiles();
for(File f : fileArr){
//判断变量f表示的路径是不是文件夹
if(f.isDirectory()){
//是一个目录,就要去遍历这个目录
//本方法,getAllDir,就是给个目录去遍历
//继续调用getAllDir,传递他目录
getAllDir(f);
}else{
System.out.println(f);
}
}
}
}

java基础4:io流对象之File对象(下)


3,综合:1中无法遍历子文件夹下的文件,可以使用递归和过滤实现


/*
 *  遍历目录,获取目录下的所有.java文件
 *  遍历多级目录,方法递归实现
 *  遍历的过程中,使用过滤器
 */
public class FileDemo1 {
public static void main(String[] args) {
getAllJava(new File("c:\\demo"));
// new File("c:\\demo").delete();
}
/*
* 定义方法,实现遍历指定目录
* 获取目录中所有的.java文件
*/
public static void getAllJava(File dir){
//调用File对象方法listFiles()获取,加入过滤器
File[] fileArr = dir.listFiles(new MyJavaFilter());
for(File f : fileArr){
//对f路径,判断是不是文件夹
if(f.isDirectory()){
//递归进入文件夹遍历
getAllJava(f);
}else{
System.out.println(f);
}
}
}
}


public class MyJavaFilter implements FileFilter {
public boolean accept(File pathname) {
//判断获取的是目录,直接返回true
if(pathname.isDirectory())
return true;
return pathname.getName().toLowerCase().endsWith(".java");
}


分析:在过滤器中,如果传进来的时文件夹,直接返回true,图一讲到了,File[] fileArr = dir.listFiles(new MyJavaFilter()) 中会把返回true的file对象保存到数组中,此时数组还有java文件,过滤器的任务完成,再遍历,如果数组中有文件夹,则重复调用自己,再次过滤,打印,后调用方法的先执行完,出栈,再进行上一个调用的方法,重复进栈出栈



参考文档