0

在下面的代码中:

public File[] findFiles (String path)
{
    FilenameFilter textFilter = new FilenameFilter()
    {
        @override
        public boolean accept(File dir, String name)
        {
            if(name.toLowerCase().endsWith(".txt"))
                return true;
            else
                return false;
        }
    };

    File[] txtFiles = new File(path).listFiles(textFilter);

    return txtFiles;
}

我知道FilenameFilter定义和实例化了一个实现接口的匿名类。但是我不明白如何在accept不直接调用的情况下调用该方法。

4

3 回答 3

3

如果您检查 的源代码listFiles,则该accept方法正在被调用。这是源代码

public File[] listFiles(FilenameFilter filter) {
String ss[] = list();
if (ss == null) return null;
ArrayList v = new ArrayList();
for (int i = 0 ; i < ss.length ; i++) {
    if ((filter == null) || filter.accept(this, ss[i])) {
                                   ^^^^^^
    v.add(new File(ss[i], this));
    }
}
return (File[])(v.toArray(new File[v.size()]));
}
于 2014-03-27T08:45:20.033 回答
2

accept()方法在调用File.listFiles()它的(目录)文件中找到的每个文件的方法中调用。

这是一个正在运行的回调模式。

于 2014-03-27T08:45:26.277 回答
0

的实现FilenameFilter需要像您所做的那样覆盖接受方法。所以当你使用的时候,方法listFiles( FilenameFilter filter )中的过滤器会listFiles()调用accept方法来决定是否接受。

此链接将有所帮助:http://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles(java.io.FileFilter)

于 2014-03-27T08:46:16.123 回答