欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-23 08:35:29
...

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

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