FilenameFilter 實現文件過濾

  • 2019 年 10 月 4 日
  • 筆記

這是 cxuan 的第

32

篇原創文章

實現 FilenameFilter 接口的類的實例用於過濾文件名。這些實例被用來過濾類 File 的 list 方法中的目錄列表。FilenameFilter 接口很簡單,只有一個 accpet 方法

@FunctionalInterface  public interface FilenameFilter {      boolean accept(File dir, String name);  }  

此接口用 @FunctionalInterface 標註,@FunctionalInterface 的是 Java8 提出來的,它表示由此註解注釋的接口都可以作為功能性接口,功能性接口一種信息性注釋類型,從概念上來講,一個功能性接口應該有一個抽象方法。功能性接口的實例被用來創建 lambda 表達式,方法引用 或者 構造器引用。

所以FilenameFilter 也只有一個 accpet 方法,它用來測試指定的文件是否應包含在文件列表中。下面通過一個例子來演示一下 FilenameFilter 的用法

public class FilenameFilterApp {        public static void main(String[] args) {          File file = new File(".");          // 匿名內部類寫法,可以用 lambda 表達式改寫          File[] files = file.listFiles(new FilenameFilter() {              @Override              public boolean accept(File dir, String name) {                  // 返回 true 是過濾出                  if (name.startsWith(".")) {                      return true;                  }                  // 返回 false 是過濾掉                  return false;              }          });            for(int i = 0;i < files.length;i++){              File f = files[i];              System.out.println(f.getName());          }      }  }  

代碼使用了當前根目錄作為文件的路徑,使用 java.io.File 類中的 listFiles 方法用於列出所有文件,返回一個 File 類型的數組,代碼採用匿名內部類的寫法,引用了 FilenameFilter 中唯一的 accpet() 方法,方法返回 true 表示過濾出滿足條件的文件路徑,返回 false 是過濾掉不滿足條件的文件路徑。

可以使用 lambda 表達式進行改寫:

public class FilenameFilterApp {        public static void main(String[] args) {          File file = new File(".");            File[] files = file.listFiles((d, s) -> {              return s.startsWith(".");          });            for(int i = 0;i < files.length;i++){              File f = files[i];              System.out.println(f.getName());          }      }  }  

文章參考:

Java FileNameFilter Example