public class Test{
//暂时没调用
public static File[] local(File dir,final String regex){
return dir.listFiles(new FilenameFilter(){
private Pattern pattern=Pattern.compile(regex);
@Override
public boolean accept(File dir, String name) {
return pattern.matcher(new File(name).getName()).matches();
}
});
}
public static class TreeInfo implements Iterable<File>{
public List<File> files=new ArrayList<File>();
public List<File> dirs=new ArrayList<File>();
@Override
public Iterator<File> iterator() {
// TODO Auto-generated method stub
return files.iterator();
}
void addAll(TreeInfo other){
files.addAll(other.files);
dirs.addAll(other.dirs);
}
public void show(){
System.out.println("目录:");
for(File item : dirs){
System.out.println(item.getName());
}
System.out.println("文件:");
for(File item : files){
System.out.println(item.getName());
}
}
}
//匹配的开始目录,需要匹配的正则表达式
public static TreeInfo walk(String start){
return recurseDirs(new File(start),".*\\.rmvb");
}
private static TreeInfo recurseDirs(File file, String regex) {
TreeInfo result=new TreeInfo();
for(File item : file.listFiles()){
if(item.isDirectory()){
result.dirs.add(item);
result.addAll(recurseDirs(item,regex));
}else if(item.getName().matches(regex)){
result.files.add(item);
}
}
return result;
}
public static void main(String[] args) {
TreeInfo info=walk("D:\\娱乐");
info.show();
}
}
这里的FilenameFilter采用的是一种策略模式(Strategy)
1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
ConcreteStrategy(具体策略类):
2、 实现了Strategy定义的接口,提供具体的算法实现。
另外的一种找到自定义文件的方法
File files[]=local(new File("D:\\娱乐\\电影"),".*\\.rmvb");
List<File> lists=Arrays.asList(files);
for(Iterator it=lists.iterator();it.hasNext();){
System.out.println(it.next());
}
// for(File item :files){
// System.out.println(item.getName());
// }