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);
}
}
}
}
