package com.trs.bwl;
import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;
public class DirList {
public static void main(String[] args) {
File path = new File("d:/");
String[] list;
list = path.list(new DirFilter(".*\\.txt"));
Arrays.sort(list);
for(int i = 0; i < list.length; i++) {
System.out.println(i + ": " + list[i]);
}
}
}
class DirFilter implements FilenameFilter {
private Pattern pattern;
public DirFilter(String reg) {
pattern = Pattern.compile(reg);
}
public boolean accept(File dir, String name) {
return pattern.matcher(new File(name).getName()
).matches();
}
}
public interface FilenameFilter {
boolean accept(文件目录, 字串名);
}
它指出这种类型的所有对象都提供了一个名为accept()的方法。之所以要创建这样的一个类,背后的全部原因就是把accept()方法提供给 list()方法,使list()能够“回调”accept(),从而判断应将哪些文件名包括到列表中。因此,通常将这种技术称为“回调”,有时也称为 “算子”(也就是说,DirFilter是一个算子,因为它唯一的作用就是容纳一个方法)。由于list()采用一个FilenameFilter对象作 为自己的自变量使用,所以我们能传递实现了FilenameFilter的任何类的一个对象,用它决定(甚至在运行期)list()方法的行为方式。回调 的目的是在代码的行为上提供更大的灵活性
源代码:
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])); }
下面是使用FilenameFilter实现图片过滤,只要.gif,.jpg,.png文件
public class ImageFilter implements FilenameFilter{ public boolean isGif(String file) { if (file.toLowerCase().endsWith(".gif")){ return true; }else{ return false; } } public boolean isJpg(String file){ if (file.toLowerCase().endsWith(".jpg")){ return true; }else{ return false; } } public boolean isPng(String file){ if (file.toLowerCase().endsWith(".png")){ return true; }else{ return false; } } public boolean accept(File dir,String fname){ return (isGif(fname) || isJpg(fname) || isPng(fname)); } }
程序测试类:
public class ImageFilterTest{ public static void main(String[] args){ File directory=new File("E:\\program\\FilenameFilter\\images"); String[] images = directory.list(new ImageFilter()); System.out.println("size="+images.length); for (int i = 0; i < images.length; i++){ String imgfile=images[i]; System.out.println("imgfile="+imgfile); } } }