1. 程式人生 > >FilenameFilter 檔案過濾器的用法

FilenameFilter 檔案過濾器的用法

FilenameFilter 是一個檔案過濾器的介面,使用這個介面必須先實現  accept 這個方法

(File dir, String name) 
          測試指定檔案是否應該包含在某一檔案列表中。

通過一個類來實現FilenameFilter 介面程式碼如下:

/**
 * @author L.Eric
 * 實現此介面的類例項可用於過濾器檔名。Abstract Window Toolkit 的檔案對話方塊元件使用這些例項過濾 File 類的 list 方法中的目錄清單。 
 */
class MyFileFilter implements FilenameFilter{
	private String ext;
	public MyFileFilter(String ext) {
		this.ext = ext;
	}
	
	//覆蓋accept方法,
	/**
	 * 測試指定檔案是否應該包含在某一檔案列表中
	 * 當且僅當該名稱應該包含在檔案列表中時返回 true;否則返回 false。
	 * */
	@Override
	public boolean accept(File dir, String name) {
		return !name.endsWith(ext);
	}
	
}
MyFileFilter 類必須有一個顯式的構造方法。 用於把檔案的需要過濾的名字傳入。 當然你要以其他形式過濾也可以,只要在accept這個方法進行修改就可以了!

那麼如何使用MyFileFilter 這個類呢?很簡單。

熟悉API的人就知道: 

File f = new File("目錄或檔名");

f.listFiles();  這裡有三個建構函式分別是

 
          返回一個抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中的檔案。

 
          返回抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中滿足指定過濾器的檔案和目錄。

 
          返回抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中滿足指定過濾器的檔案和目錄

它們返回的值都是  File[] 

我們通過第三個建構函式就可以把MyFileFilter類 傳入。 接下來我來個例子說明一下:

public class FileTest {
	//這個方法才用遞迴遍歷
	/**
	 * @param pathname   目錄或者檔案路徑
	 * @param space      父目錄和子目錄的空格,便於打印出來觀察
	 * @param ext        代表要過濾的檔案的擴張名
	 */   
	public static void readALLFilesForFilter(String pathname, String space, String ext){
		File f = new File(pathname);
		//通過過濾器來獲得檔案的目錄和檔案
		File[] fileList = f.listFiles(new MyFileFilter(ext)); //new 一個過濾器傳入就ok了
		for(File f1 : fileList){
			if(f1.isFile()) {
				System.out.println(space + "-" + f1.getName());
			}
			//判斷是否為目錄
			if(f1.isDirectory()) {
				System.out.println(space + "-" + f1.getName());
				readALLFiles(f1.getPath().toString(), space +"  ");
			}
		}
	}
	
	public static void main(String[] args) {
		FileTest.readALLFilesForFilter("D://", " ", ".avi");
	}
	
	
	
	
}