使用过滤器递归打印多级目录

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、代码总分析:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值