在下面的代码中:
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
而不直接调用。
答案 0 :(得分:3)
如果您检查listFiles
的源代码,则会调用accept
方法。 here's the source code
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()]));
}
答案 1 :(得分:2)
accept()
方法在File.listFiles()
方法中为在其调用的(目录)文件中找到的每个文件调用。
这是一个callback模式。
答案 2 :(得分:0)
FilenameFilter
的实现需要覆盖accept方法,因为您已经这样做了。因此,当您使用listFiles( FilenameFilter filter )
时,listFiles()
方法中的过滤器会调用accept方法是否接受。
此链接有助于:http://docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles(java.io.FileFilter)