黑马程序员技术交流社区

标题: 问个关于文件过滤器的问题 [打印本页]

作者: 莫嘉伟    时间: 2013-2-21 22:34
标题: 问个关于文件过滤器的问题
import java.io.File;
import java.io.FilenameFilter;

public class FilenameFilterTest {
public static void main(String[] args){
  File file=new  File(".");
  String[] nameList=file.list(new MyFilenameFilter());
  for(String name:nameList){
   System.out.println(name);
  }
}
}
class MyFilenameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
  return name.endsWith(".java")||new File(name).isDirectory();
}
}
这个代码在下有点不懂,在list()方法中传入FilenameFilter的时候只是新建了个对象但是没有调用accept方法,而且accept方法好像也不返回文件名啊··是不是说这些都是在list()方法中完成的,list()用FilenameFilter()对象调用accept方法,还传入文件路径和文件名给accept方法,然后根据accept方法的返回值列出相关文件,它的运作机制是这样的吗?

作者: 李挺    时间: 2013-2-21 22:51
本帖最后由 李挺 于 2013-2-21 22:53 编辑

它在list()方法中传入的是MyFilenameFilter,下面有实现FilenameFilter,复写accept方法是判断文件后缀名是不是一样
List方法使用传入的MyFilenameFilter中的accept方法判断这个文件目录下的文件对于accept方法是否返回是true,如果是,则写入前面的集合
作者: 谢波    时间: 2013-2-21 23:01
  1. public String[] list() {
  2.         SecurityManager security = System.getSecurityManager();
  3.         if (security != null) {
  4.             security.checkRead(path);
  5.         }
  6.         return fs.list(this);
  7.     }
复制代码
  1. public String[] list(FilenameFilter filter) {
  2.         String names[] = list();
  3.         if ((names == null) || (filter == null)) {
  4.             return names;
  5.         }
  6.         ArrayList v = new ArrayList();
  7.         for (int i = 0 ; i < names.length ; i++) {
  8.             if (filter.accept(this, names[i])) {
  9.                 v.add(names[i]);
  10.             }
  11.         }
  12.         return (String[])(v.toArray(new String[v.size()]));
  13.     }
复制代码
这是list两个方法的源码,第二个是带过滤器的list方法
从中可以看出楼主的理解是正确的
作者: 莫嘉伟    时间: 2013-2-21 23:35
谢谢3楼~




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