黑马程序员技术交流社区

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

作者: 常在河边走_    时间: 2013-9-16 00:04
标题: 文件过滤器的问题
/*
* 需求:请获取d盘目录下以java结尾的文件名称。
*/
public class FileDemo2 {
        public static void main(String[] args) {
                // 封装目录
                File file = new File("d:\\");

                // 获取满足条件的名称
                String[] strArray = file.list(new FilenameFilter() {
                        @Override
                        public boolean accept(File dir, String name) {                //  这里不懂, 我想问的是这里的 dir 和 name 是怎么传入的?一直看不懂
                                //判断是否是文件                                  判断是否是.java后缀的文件
                                return new File(dir,name).isFile() && name.endsWith(".java");
                        }
                });
               
                //遍历
                for(String str : strArray){
                        System.out.println(str);
                }
        }
}


作者: 路边小色狼    时间: 2013-9-16 02:21
这是一个函数啊,调用时传入啊,你把代码写完整应该能看出来
作者: 2012    时间: 2013-9-16 12:24
File.list()方法的参数是一个FilenameFilter,FilenameFilter接口中包含一个accept方法,我们需要实现这个方法,在该方法中知道自己的规则,也就是需要过滤出的东西。
这种用法是一个典型的Comman设计模式,因为File的list方法需要判断规则:判断那些文件需要列出。
作者: 王广亚    时间: 2013-9-16 17:43
本帖最后由 王广亚 于 2013-9-16 17:44 编辑

不知楼主是否还记得比较器?一样的道理
  1. <p>import java.io.*;
  2. import java.util.*;
  3. class Student{
  4.         private String name;
  5.         private int age;
  6.         Student(String name,int age)
  7.         {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }        
  11.         public String getName()
  12.         {
  13.                 return name;
  14.         }
  15.         public int getAge()
  16.         {
  17.                 return age;
  18.         }
  19. }
  20. class TreeSetDemo2
  21. {
  22.         public static <T> void main(String[] args)
  23.         {
  24.                 TreeSet<Student> ts = new TreeSet<Student>(new MyCompare<Object>());</p><p>                ts.add(new Student("lisi02",22));
  25.                 ts.add(new Student("lisi02",21));
  26.                 ts.add(new Student("lisi007",20));
  27.                 ts.add(new Student("lisi09",19));
  28.                 ts.add(new Student("lisi06",18));
  29.                 ts.add(new Student("lisi06",18));
  30.                 ts.add(new Student("lisi007",29));
  31.                 Iterator<Student> it = ts.iterator();
  32.                 while(it.hasNext())
  33.                 {
  34.                         Student stu = (Student)it.next();
  35.                         System.out.println(stu.getName()+"..."+stu.getAge());
  36.                 }
  37.         }
  38. }
  39. class MyCompare<T> implements Comparator<T>//定义比较器
  40. {
  41.         public int compare(Object o1,Object o2)
  42.         {
  43.                 Student s1 = (Student)o1;
  44.                 Student s2 = (Student)o2;
  45.                 int num = s1.getName().compareTo(s2.getName());
  46.                 if(num==0)
  47.                 {
  48.                         return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
  49.                 }
  50.                 return num;
  51.         }
  52. }</p>
复制代码

作者: 王广亚    时间: 2013-9-16 18:48
其实list方法是这样写的,如果你能看懂你就知道他是如何传值得了
  1. public String[] list(FilenameFilter filter) {
  2.         String names[] = list();
  3.         if ((names == null) || (filter == null)) {
  4.             return names;
  5.         }
  6.         List<String> 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 v.toArray(new String[v.size()]);
  13.     }
复制代码

作者: 影响力147753321    时间: 2013-9-17 10:06
第一个参数表示要过滤的目录,也就是你要遍历的时传入的目录。第二个参数表示你要遍历目录中所包含的文件(非目录)。这个方法是一个回调函数,每次调用这个方法,该方法会自动把你要遍历的当前目录传进去根据你实现的方法 的返回值进行过滤。对于这你的这个程序来说就会把你当前文件对象传入当作目录来进行过滤,如果你传入的文件不是目录就会报错。大体意思就是这样!希望可以帮到你。




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