2010-12-15 59 views
3

使用一個小型的Java工具來獲取一組基於一組文件擴展名的文件,我在討論使用listFiles()和使用continue;當我遇到一個壞文件時,與使用自定義FileFilter或FilenameFilter對我執行相同的操作。FileFilter/FilenameFilter的好處

在我看來,這些方法是集成工具(如Swing文件瀏覽)的便捷方法,並且如果我們不掛鉤任何這些工具,則不會比手動方法更有效。那是對的嗎?這些過濾工具是否還有其他好處?

回答

2

從JDK 1.6源:

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

所以,你可以看到,基本上,同樣的事情在這裏,你會用手工測試做完成。它帶給你的唯一的東西就是不必重新發明輪子,如果他們突然發現了更快的方式來做到這一點,你將不必更改代碼:)

+0

它帶給你的主要功能是能夠參數化列出具有不同過濾條件(在所述代碼之外定義的)的文件的代碼。 – Thilo 2010-12-15 11:37:22

+0

謝謝,你說得對。起初,我認爲自己做起來會更簡單,但我很快意識到實現FilenameFilter更有效(代碼)並且更加簡潔,甚至實際上讓我的代碼更加健壯。 – dimo414 2010-12-15 12:58:28

0

不,你認爲你在那裏的錢是正確的。他們是便利的方法。他們只是取一個名字,(並且知道你最初設置的擴展名),並且檢查它是否應該包含在非列表中。無論如何你都在做什麼。

從Java文檔:

public boolean accept(File dir, String name) 

測試指定的文件應該包含在文件列表中。

這正是你在做什麼。

1

是的,他們大多是用於那些接受文件篩選器工具(或者一般情況下,確定邏輯的代碼與評估過濾器的代碼不同)。在引擎蓋下沒有魔法,他們只是做你自己的循環所能做的。

+0

我同意。 Java庫的這一部分已被過度設計並被無用的接口和方法所污染。 – Mot 2010-12-15 12:07:27

+0

@mklhmnn:我說FilenameFilter是多餘的,因爲已經有一個FileFilter,但FileFilter是一個好主意。 – Thilo 2010-12-16 01:19:02