黑马程序员技术交流社区

标题: FileFilter对象的一个小问题 [打印本页]

作者: 张飞年    时间: 2012-9-9 17:37
标题: FileFilter对象的一个小问题
本帖最后由 张飞年 于 2012-9-9 22:38 编辑

File f4 = new File("d:\\java1");
                File[] f3 = f4.listFiles(new FileFilter(){
                        public boolean accept(File name){
                                return name.isFile();//这里的name为什么就是f4呢???
                        }
                });
                for(File ff:f3){
                        System.out.println(ff);//把file对象输出,对象中封装的其实就是在址,所以输出也是地址
                }
作者: 陈俊来    时间: 2012-9-9 18:33
File f4 = new File("d:\\java1");
                File[] f3 = f4.listFiles(new FileFilter(){
                        public boolean accept(File name){
                                return name.isFile();//在这里name不是f4,name是f4里面的File                        }
                });
                for(File ff:f3){
                        System.out.println(ff);//把file对象输出,对象中封装的其实就是在址,所以输出也是地址
                }
作者: 王红潮    时间: 2012-9-9 19:06
本帖最后由 王红潮 于 2012-9-9 19:09 编辑

FileFilter()是文件过滤器,他底层的原理是多次调用accept方法来判断,accept(File pathname)这个方法是要往里面传一个pathname参数的,并返回true (留下) false(踢掉)
例如:
public boolean accept(File pathname){
    return pathname.isDirectory() || pathname.getName().endsWith(".txt");
}
作者: 创出一片辉煌    时间: 2012-9-9 20:29
这是"listFiles"方法的源码
  public File[] listFiles(FileFilter filter) {
        String ss[] = list();
        if (ss == null) return null;
        ArrayList v = new ArrayList();
        for (int i = 0 ; i < ss.length ; i++) {
            File f = new File(ss, this);
            if ((filter == null) || filter.accept(f)) {
                v.add(f);
            }
        }
        return (File[])(v.toArray(new File[v.size()]));
    }

我们可以看到,他是先通过" File f = new File(ss, this);"这段代码,通过根据 抽象路径名和 child 路径名字符串创建一个新 File 实例。 在把这个实例"f"传递给accept(f)方法,
所以这里你的代码public boolean accept(File name){
                                return name.isFile();//这里的name不是"f4"而是"f4"下面的一个新的文件或文件夹实例
                }

作者: 创出一片辉煌    时间: 2012-9-9 20:34
public File[] listFiles(FileFilter filter) {
        String ss[] = list();                  //取得一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
        if (ss == null) return null;
        ArrayList v = new ArrayList();
        for (int i = 0 ; i < ss.length ; i++) {
            File f = new File(ss, this);     //实例化一个新的f文件对象(就是"this"下面的文件或文件夹)
            if ((filter == null) || filter.accept(f)) {    //把f传递给"accept"方法,通过aceept方法获得一个逻辑值,所以可以通过覆写accept方法,所得到的值控制是否把此文件加入集合中,
                v.add(f);
            }
        }
        return (File[])(v.toArray(new File[v.size()]));
    }

作者: 张飞年    时间: 2012-9-9 22:33
屈俊材 发表于 2012-9-9 20:29
这是"listFiles"方法的源码
  public File[] listFiles(FileFilter filter) {
        String ss[] = list();

源码看起来还是有点费劲,不过根据你的说明看懂了个大概,知道这里面的name是怎么来的。谢了

作者: 张飞年    时间: 2012-9-9 22:34
王红潮 发表于 2012-9-9 19:06
FileFilter()是文件过滤器,他底层的原理是多次调用accept方法来判断,accept(File pathname)这个方法是要往 ...

这和我问的好像有些偏差,不过谢谢光顾
作者: 张飞年    时间: 2012-9-9 22:37
陈俊来 发表于 2012-9-9 18:33
File f4 = new File("d:\\java1");
                File[] f3 = f4.listFiles(new FileFilter(){
         ...

现在知道了。是f4里面的一个新的file类型




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2