代码如下:import java.io.*;
public class FileFilterDemo
{
public static void main(String args[]){
//创建文件对象
File dir = new File("C:/Classes/");
//创建文件类型过滤器
Filter filter = new Filter("java");
//取得文件名字符串数组
String fileList[] = dir.list(filter);
int I;
for (I=0;I<fileList.length;I++){
//获取文件对象
String dir2="C:/Classes/"+fileList[I];
File tmpFile = new File(dir2);

//取得文件属性
if(tmpFile.isFile()){
System.out.println("文件"+tmpFile);
}
else{
System.out.println("目录"+tmpFile);
}
}
}
}
//定义文件过滤器
class Filter implements FilenameFilter
{
//扩展名
String extension;
//构造方法
Filter(String extension)
{
this.extension = extension;
}
//测试文件的扩展名是否为extension
public boolean accept(File directory,String filename)
{
return filename.endsWith("."+extension);
}
}为什么程序根本没有调用 Filter的accept()方法,就应用到accept()呢? 而accept()中的参数 File directory,String filename 在方法里面根本没有用到,为什么呢?

解决方案 »

  1.   

    对Filter的accept()的方法调用是在File类中实现的,就是 
    String fileList[] = dir.list(filter); 以下是File.list(FilenameFilter filter)的源码。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[0]));
      

  2.   

    我不觉得这段代码有什么问题。accept中的参数File dir没什么用,主要是当你需要根据父文件夹的属性来确定返回值的时候才有用。