1、题目:
递归打印多级目录
要求:
只能打印出以.xml结尾的文件
2、递归分析:
- 递归:方法自己调用自己
递归分为直接递归和间接递归;
直接递归称为方法自身调用自己
间接递归可以A调用B,B调用A,
注意事项:- 1、递归一定要有条件限定,保证递归能停止下来,否则发生栈内存溢出
2、在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
3、构造方法,禁止递归使用前提:
调用方法时,方法主体不变,每次调用方法的参数不同,可以使用递归
3、File过滤器的简介:
我们可以使用过滤器来实现只出现.xml文件
在File类中有两个和listFiles重载的方法
方法的参数传递的就是过滤器 File[]ListFiles(FileFilter filter) java.io. FileFilter接口:用于抽象路径名(File对象)的过滤器
作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法
booLean accept(FiLepathname):
测试指定抽象路径名是否应该包合在某个路径名列表中
参数 File pathname:
使用 ListFiLes方法遍历目录,得到的每一个文件对象
FiLe[] ListFiles(FilenameFilter filter)
java.io. FilenameFilter接口:
实现此接口的类实例可用于过滤器文件名
作用:用于过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dirString name):
测试指定文件是否应该包含在某一文件列表中
参数:
File dir:构造方法中传递的被遍历的目录
String name:使用 ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
注意: 两个过滤器接口没有实现类,需要我们自己写实现类,重写过滤方法accept,在方法中自己定义过滤的规则
4、创建过滤器的实现类代码块:
package demoFilee;
import java.io.File;
import java.io.FileFilter;
/*
* 创建过滤器 FileFilter的实现类,重写过滤方法accept,定义过滤规则
*
* 过滤规则:
* 在accept方法中,判断file对象是否已.xml结尾
* 是返回true,不是返回false
*/
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
//return false;//0:全部被过滤掉
if(pathname.isDirectory()) {
return true;
}
return pathname.getName().toLowerCase().endsWith(".xml");
}
}
5、代码实现
package demoFilee;
import java.io.File;
public class GuoLvQi {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("c:\\javaworkspace");
getAllFile(file);
}
/*
* 递归打印多级目录:
*定义一个方法,参数传递file类型目录
*方法中对目录进行遍历
*/
public static void getAllFile(File dir) {
//传递过滤器对象
File[] files = dir.listFiles(new FileFilterImpl());
for(File f:files) {
//对遍历得到的File对象进行判断,是否为文件夹
if(f.isDirectory()) {
//如果是则继续遍历此文件夹,直接调用getAllFile
getAllFile(f);
}
else {
//只要.xml文件
/*
* 1、把file对象f转化为字符串对象(35-37三种方法都可以)
*/
// String name = f.getName();
// String path = f.getPath();
String string = f.toString();
//如果是大写,则字符串转化为小写
//s = s.toLowerCase();
//2、调用string类中的方法endWith判断字符串是否已.xml结尾
boolean b = string.endsWith(".xml");
//3、如果是以xml结尾文件,则输出
if(b) {
System.out.println(f);
//else {
//f是一个文件,直接打印即可
//System.out.println(f);}
//以上else内代码可以和成一句:
/*列式编程:
* if(f.getName().toLowerCase().endWith(".xml")){
* syso(f);
* }
*/
}
}
}
}
}
6、代码总分析: