各位小夥伴們大家好,在之前的文章中,小編介紹了「創作開運禮」Java之使用遞歸進行文件搜索,這次小編要介紹的是過濾器,我們可以使用過濾器來遍歷文件夾以及裡面的子文件夾還有相對應的文件。
在File類中有兩個和ListFiles重載的方法,方法的參數傳遞的就是過濾器。
1.File[] listFiles(FileFilter filter)
java.io.FileFilter接口:用於抽象路徑名(File對象)的過濾器。
作用:用來過濾文件(File對象)
抽象方法:用來過濾文件的方法
boolean accept(Filepathname)測試指定抽象路徑名是否應該包含在某個路徑名列表中。
參數:
File pathname:使用listFiles方法遍歷目錄,得到的每一個文件對象。
2.File[] listFiles(FilenameFilter filter)
java.io.FilenameFilter接口:實現此接口的類實例可用於過濾文件名
作用:用於過濾文件名稱
抽象方法:用來過濾文件的方法
boolean accept(File dir,String name)測試指定文件是否應該包含在某一文件列表中。
參數:
File dir:構造方法中傳遞的被遍歷的目錄
String name:使用ListFiles方法遍歷目錄,獲取的每一個文件夾/文件夾的名稱
注意:兩個過濾接口是沒有實現類的,需要我們自己寫實現類,重寫過濾的方法accept,在方法中自己定義過濾的規則。
小編先來將第一種過濾器:File[] listFiles(FileFilter filter)
代碼如下(定義一個實現類):
import java.io.File;
import java.io.FileFilter;
/*創建過濾器FileFilter的實現類,重寫過濾方法accept,定義過濾規則*/
public class FileFilterImpl implements FileFilter {
public boolean accept(File pathname) {
//如果pathname是一個文件夾,返回true,繼續遍歷這個文件夾
/*過濾規則:
在accept方法中,判斷File對象是否以.pkt結尾
是,返回true
不是,返回false/*
if(pathname.isDirectory()) {
return true;
}
return pathname.getName().toLowerCase().endsWith(".pkt");
}
}
main方法
import java.io.File;
public class Demo01Filter {
public static void main(String args[]) {
File file=new File("D:\\programming\\Cisco Packet Tracer");
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 {
System.out.println(f);
}
}
}
}
由上面的代碼可以知道,其實過濾器的使用只是根據之前的「創作開運禮」Java之遞歸列印多級目錄上面加上了實現類,之後在傳遞過濾器對象,File[] files=dir.listFiles(new FileFilterImpl());接下來,小編來講一下過濾器的原理。
首先我們需要明白:
過濾器中的accept方法是誰調用的。accept方法中的參數pathname是什麼File[] files=dir.listFiles(new FileFilterImpl());
我們先來說一下listFiles方法,一個做了三件事情:
listFiles方法會對構造方法中傳遞的目錄進行遍歷,獲取目錄中每一個文件或者文件夾-->封裝成File對象。listFiles方法會調用參數,把參數傳遞給過濾器的方法accept3.listFiles方法會把遍歷得到的每一個File對象,傳遞給accept方法的參數pathname。
關於FileFilter過濾器的使用與及原理,其實簡單一點來講就是listFiles方法調用了accept方法,把遍歷的每一個File對象傳遞給accept方法的參數pathname,其實pathname就是File對象。然後這個實現類會自己定義規則,滿足條件的返回true,傳遞過去的對象會保存到數組中;否則返回false,傳遞過的對象不會保存到數組中,小編就先說到這裡,希望這篇文章可以幫到大家,也歡迎各位小夥伴補充和糾錯。
圖像來自網絡,如有侵權,請聯繫作者刪除