JAVA IO 流中的 FilenameFilter 介面用來過濾檔案名稱,就是說可以從指定目錄中選出符合一定條件的檔案,這個條件就在實現了 FilenameFilter 介面的類中設定。具體實現見下例:
在例子中的目錄中多放幾個檔案,然後看輸出結果。
Test.java
===================================================================================
package com.test;
import java.io.*;
public class Test {
public static void main(String args[]) {
File dir = new File("E:/wp/Test/src/com/test");
String file[] = dir.list(new MyFilter(".java"));
for (int i=file.length; i>0; i--) {
System.out.println(file[i-1]);
}
}
}
class MyFilter implements FilenameFilter {
String name;
MyFilter(String name) {
this.name = name;
}
public boolean accept(File dir, String name) {
System.out.println("accept()");
return name.endsWith(this.name);
}
}
===================================================================================
FilenameFilter 介面中只定義了一個方法, public boolean accept(File dir, String name),根據字面的意思理解,dir 顯然是想要查詢的目錄,name 則是 dir 中的檔案名稱。 accept 方法裡指定了檔案名稱要滿足的條件,上面的例子中條件為副檔名為 .java 的檔案。可能第一次接觸這個介面的人會奇怪,並沒有看到調用 accept 方法,但是結果卻說明確實調用了 accept 方法,下面來看一下 File 類的 list 方法的原始碼。
===================================================================================
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
ArrayList v = new ArrayList();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return (String[])(v.toArray(new String[v.size()]));
}
===================================================================================
File 類裡面重載了 list 方法。一個是沒參數的,另一個只有一個 FilenameFilter 參數。這個 list 方法先把指定目錄(調用 list 方法的 File 對象就是一個目錄)中的所有檔案名稱放到 names 數組中,然後用一個迴圈挨個檢查。最後返回一個 String[] 。