这是thinking java 一书中的一个例子,有点疑惑,请帮忙:
//:DirList.java
//Displays directory listing using regular expressions.
//{Args:"d.*\.java"}
import java.io.*;
import java.util.*;
import java.util.regex.*;public class DirList{
  public static void main(String[] args){
    File path=new File(".");
    String[] list;
    if(args.length==0)
      list=path.list();
    else
      //文件过滤,public String[] list(FilenameFilter filter)
      list=path.list(new DirFilter(args[0]));     
    for(int i=0;i<list.length;i++)
      System.out.println(list[i]);
  }
}//DirFilter类实现FilenameFilter接口
class DirFilter implements FilenameFilter{
  private Pattern pattern;
  public DirFilter(String regex){
    pattern=Pattern.compile(regex);
  }
//此借口唯一要实现的方法是accept,但是不知道是何时调用的,是否是自动调用的?
  public boolean accept(File dir,String name){
    //Strip path information,search for regex:
    //我发现下面的返回语句中的参数name好像没有传递,是怎么实现的?
    //我猜想accept方法根本就没有实现,因为我将下面的注释掉,用return true;代替,结果一样
    return pattern.matcher(new File(name).getName()).matches();
  }
}最近刚结束java的io流的学习,发现很复杂,不知道怎么才能更好地掌握,以上疑问望解答!同时各位高人如果有这方面的学习建议,请执教:怎样才能学好java.io?

解决方案 »

  1.   

    //此借口唯一要实现的方法是accept,但是不知道是何时调用的,是否是自动调用的?
      public boolean accept(File dir,String name){
    这个方法是自动调用的
    你在执行查找的时候就已经是调用这个方法了    //我发现下面的返回语句中的参数name好像没有传递,是怎么实现的?
        //我猜想accept方法根本就没有实现,因为我将下面的注释掉,用return true;代替,结果一样
        return pattern.matcher(new File(name).getName()).matches();
    你可以试试啊,在这句话之前打印一个日志
    或者直接用
    System.out.println("excute ");
    运行程序看有没有这句话
    个人认为,或许你的regex使用的不对
      

  2.   

    accept()是给File.list()方法调用的啊,怎么说是“自动调用”?你代码中不是有这么一句么?:
    list=path.list(new DirFilter(args[0])); 
    list()方法是重载的,可以不接受参数,也可以接受一个FilenameFilter型参数,因为DirFilter实现了FilenameFilter接口,所以它的实例可以作为list()方法的参数,这时它的accept()方法就被调用了。
      

  3.   

    楼上的有点道理,但是accept()方法体
     return pattern.matcher(new File(name).getName()).matches();
    中的name参数是怎么传递的呢
    具体一点,这个方法是怎么实现的,我有点儿糊涂,请再赐教!
      

  4.   

    java的io并不复杂啊,关键是对计算机底层存储原理的了解和对Decorator模式的理解。楼主有这样的问题,看来是java基础知识不扎实所致。
      

  5.   

    楼上的有点道理,但是accept()方法体
     return pattern.matcher(new File(name).getName()).matches();
    中的name参数是怎么传递的呢
    具体一点,这个方法是怎么实现的,我有点儿糊涂,请再赐教!
    -----------------------------------------------------------------------------------accept()方法是给File实例的list()方法调用的,参数自然也应该由list()方法来传递。要了解这个你应该去看File类的源码。另外,我认为楼主没有完全搞清楚这个例子的用意。在这个例子中,只有指定了一个命令行参数,才会使用DirFilter,否则就是列出全部文件。
      

  6.   

    这是我写的一个例子,希望对你有帮助
    先大体介绍一下这个类的功能,从一个文件名包含日期的文件夹里过滤出包含特定日期的File[];
    package zgqx;import java.io.File;
    import java.util.*;
    import java.io.FilenameFilter;public class GetFile implements FilenameFilter{
    private int total;
    public GetFile(int i){
    total = i;
    }
    public List isFavor(){
    Date date = new Date();
    Calendar c = Calendar.getInstance();
    int day = 0;
    List list = new ArrayList();
    String s="",year="";
    for(int a=1;a<=total;a++){
        c.setTime(new Date(date.getTime()-a*86400000l));
        day = c.get(Calendar.DAY_OF_YEAR);
        year = Integer.toString(c.get(Calendar.YEAR));
        if(day<100){
          s=""+year.substring(2)+"0"+day;
        }else{
          s=""+year.substring(2)+day;
        }
        list.add(s);
    }
    return list;
    }
    public boolean accept(File dir,String fname){
    boolean b =false;
    for(int i=0;i<isFavor().size();i++){
    if(fname.indexOf((String)isFavor().get(i))!=-1){
    b=true;
    break;
    }
    }
    return b;
    }
    public static void main(String a[]){
    File dir = new File("e:\\temp");
    File [] re = dir.listFiles(new GetFile(3));
    for(int i=0;i<re.length;i++){
    System.out.println(re[i].getName());
    }
    System.out.println(re.length);
    System.out.println(new GetFile(3).isFavor().get(0));
    }
    }