package com.itheima.demo01.Recursion; import java.io.File; public class Demo03Recursion { public static void main(String[] args) { File file = new File("C:\\Users\\大 大\\Desktop\\aaa"); getAllFile(file); } //定义一个方法,参数传递File类型的目录,方法中对目录进行遍历 public static void getAllFile(File dir) { //打印便利的目录名称 System.out.println(dir); File[] files = dir.listFiles(); for (File f : files) { //对遍历得到的File对象f进行判断,判断是否是文件夹 if(f.isDirectory()){ getAllFile(f); }else { //f是一个文件,直接打印即可 System.out.println(f); } } } }
搜索D:\aaa
目录中的.java
文件。
分析:
package com.itheima.demo01.Recursion; import java.io.File; /* * 打印多级目录下的后缀名以.java结尾得文件*/ public class Demo04Recursion { public static void main(String[] args) { File file = new File("C:\\Users\\大 大\\Desktop\\aaa"); getAllFile(file); } //定义一个方法,参数传递File类型的目录,方法中对目录进行遍历 public static void getAllFile(File dir) { //打印便利的目录名称 //System.out.println(dir); File[] files = dir.listFiles(); for (File f : files) { //对遍历得到的File对象f进行判断,判断是否是文件夹 if(f.isDirectory()){ getAllFile(f); }else { //f是一个文件,直接打印即可 //需要将File对象f转为字符串对象 //1. //String name = f.getName(); //2. //String path = f.getPath(); //3. String s = f.toString(); //toString()方法里面调用的其实就是getPath //将字符串变成小写的 s = s.toLowerCase(); //判断字符串是不是以.java结尾,注意返回的是布尔型 boolean b = s.endsWith(".java"); if (b){ System.out.println(f); } //链式编程 if (f.getName().toString().toLowerCase().endsWith(".java")){ System.out.println(f); } } } } }
java.io.FileFilter
是一个接口,是File对象的过滤器。
该接口的对象可以传递给File类的listFiles(FileFilter)
作为参数, 接口中只有一个方法。
File[ ] ListFiles(FileFilter filter) `boolean accept(File pathname) ` :测试pathname是否应该包含在当前File目录中,符合则返回true。 参数:File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
File[ ] ListFiles(FilenameFilter filter)
作用:用于过滤文件名称
boolean accept(File dir,String pathname)
:测试指定文件是否应该包含在某一个文件中参数:
File dir:构造方法中传递的被遍历的目录
String name :使用ListFiles方法遍历目录,获取的每一个文件/文件 夹的名称
注意:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept ,在方法中自己定义过滤的规则
实现类:
package com.itheima.demo01.Recursion; import java.io.File; import java.io.FileFilter; /* * 重写accept方法,定义过滤规则*/ public class FileFilterImpl implements FileFilter { @Override public boolean accept(File pathname) { //如果传过来的是目录,不能过滤掉,需要返回true,继续调用方法 if(pathname.isDirectory()){ return true; } return pathname.getName().toLowerCase().endsWith(".java"); } }
主函数
package com.itheima.demo01.Recursion; import java.io.File; public class Demo05FileFilter { public static void main(String[] args) { File file = new File("C:\\Users\\大 大\\Desktop\\aaa"); getAllFile(file); } //定义一个方法,参数传递File类型的目录,方法中对目录进行遍历 public static void getAllFile(File dir) { //传递过滤器对象 File[] files = dir.listFiles(new FileFilterImpl()); for (File f : files) { //对遍历得到的File对象f进行判断,判断是否是文件夹 if(f.isDirectory()){ getAllFile(f); }else { //f是一个文件,直接打印即可 System.out.println(f); } } } }
使用匿名内部类和lambda表达式优化程序
package com.itheima.demo01.Recursion; import java.io.File; import java.io.FileFilter; public class Demo06FileFilter { public static void main(String[] args) { File file = new File("C:\\Users\\大 大\\Desktop\\aaa"); getAllFile(file); } //定义一个方法,参数传递File类型的目录,方法中对目录进行遍历 public static void getAllFile(File dir) { //传递过滤器对象,使用匿名内部类 /*File[] files = dir.listFiles(new FileFilter(){ @Override public boolean accept(File pathname) { //如果传过来的是目录,不能过滤掉,需要返回true,继续调用方法 if(pathname.isDirectory()){ return true; } return pathname.getName().toLowerCase().endsWith(".java"); } });*/ //使用lambda表达式(接口中只有一个抽象方法) //当方法体只有一句时,可以把大括号,return,return语句后的分号省略! File[] files = dir.listFiles((pathname)-> //如果传过来的是目录,不能过滤掉,需要返回true,继续调用方法 pathname.isDirectory() || pathname.getName().toLowerCase().endsWith(".java") ); for (File f : files) { //对遍历得到的File对象f进行判断,判断是否是文件夹 if(f.isDirectory()){ getAllFile(f); }else { //f是一个文件,直接打印即可 System.out.println(f); } } } }