listFiles(FileFilter)
作为参数,接口中只有一个方法
boolean accept(File pathname)
测试pathname是否应该包含在当前的File目录中,符合则返回true
accept
方法,参数为File,表示当前File下所有的子文件和子目录,保留住则返回true,过滤掉则返回false,保留规则如:
-
要么是.java文件
-
要么是目录,用于继续遍历
FileFilter接口概述
java.io.FileFilter
是一个接口,该接口的对象可以传递给File类
案例演示
1.文件过滤器案例一
//自定义文件过滤器
public static void main(String[] args){
File file=new File("G:\\21-java\\file练习");
printFile(file);
}
public static void printFile(File file){
File[] files=file.listFiles(new FileFilter(){
public boolean accept(File pathname){
return pathname.getName().endWith(".java")||pathname.isDirectory();
}
});
//循环打印
for(File file:files){
System.out.println("文件名:"+file.getAbsplutePath());
}else{
printFile(file);
}
}
2.文件过滤器案例二
需求分析
键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key,用个数作为value,放入到map集合中,并用两种方式遍历map集合例如:doc 的类型的文件有 x 个java 的类型的文件有 x 个txt 的类型的文件有 x 个
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入已有文件路径(如G:\\21-java\\测试):");
String str = scanner.next();
File file = new File(str);
Map<String, Integer> map = new HashMap<>();
add(file,map);
Set<String> set = map.keySet();
for (String s : set) {
System.out.println("文件类型:"+s+"有"+map.get(s)+"个");
}
}
public static void add(File file, Map<String,Integer> map) {
File[] files = file.listFiles(new FileFilter() {
public boolean accept(File pathname) {
if (pathname.isDirectory()||pathname.getName().endsWith(".java")||
pathname.getName().endsWith(".doc")||
pathname.getName().endsWith(".txt")) {
return true;
}
return false;
}
});
for (File file1 : files) {
if (file1.isDirectory()) {
File[] files1 = file1.listFiles();
for (File file2 : files1) {
add(file2, map);
}
} else {
String str = file1.getName();
String[] ss = str.split("\\.");
if (ss[1].equals(".java")) {
map.put(ss[1], map.get(ss[1]) + 1);
} else {
map.put(ss[1], 1);
}
}
}
}