【问题标题】:What is the benefit of FileFilter / FilenameFilterFileFilter / FilenameFilter 有什么好处
【发布时间】:2010-12-15 11:26:01
【问题描述】:

使用小型 Java 工具来获取基于一组文件扩展名的一组文件,当我遇到错误文件时,我在使用 listFiles() 和使用 continue; 与使用自定义 FileFilter 之间进行辩论或 FilenameFilter 为我有效地做同样的事情。

在我看来,这些方法对于诸如 Swing 文件浏览之类的集成工具来说是方便的方法,如果我们不使用这些工具中的任何一个,它们并不比手动方法更有效。那是对的吗?这些过滤工具还有其他好处吗?

【问题讨论】:

    标签: java file-io


    【解决方案1】:

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

    所以,如您所见,基本上,这里的操作与手动测试相同。它给您带来的唯一好处是不必重新发明轮子,如果他们突然找到更快的方法来做到这一点,您将不必更改代码:)

    【讨论】:

    • 它给您带来的主要好处是能够参数化列出具有不同过滤条件的文件的代码(在所述代码之外定义)。
    • 谢谢,你是对的。起初,我认为自己做会更简单,但我很快意识到实现 FilenameFilter 既更高效(对代码而言)也更简洁,甚至实际上让我的代码更加健壮。
    【解决方案2】:

    与任何其他基于接口的 API 一样,这允许大量重用逻辑。您可以让 java.io.* API 为您查找任何类型的文件,尤其是在您使用诸如 Apache Commons IO 之类的库时:

    http://commons.apache.org/io/api-1.4/org/apache/commons/io/filefilter/package-summary.html

    【讨论】:

      【解决方案3】:

      是的,它们主要用于接受文件过滤器的工具(或者通常在确定逻辑的代码与评估过滤器的代码不同的任何地方)。引擎盖下没有魔法,他们只是做你可以在自己的循环中做的事情。

      【讨论】:

      • 我同意。 Java 库的这一部分被过度设计并被无用的接口和方法污染。
      • @mklhmnn:我想说 FilenameFilter 是多余的,因为已经有一个 FileFilter,但是有 FileFilter 是个好主意。
      【解决方案4】:

      不,认为你已经得到了正确的钱。它们是方便的方法。他们只是取一个名字,(并且知道你最初设置的扩展名),然后检查它是否应该包含在不列表中。反正和你做的差不多。

      来自 Java 文档:

      public boolean accept(File dir, String name)
      

      测试指定文件是否应包含在文件列表中。

      这正是你正在做的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-04
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多