Java 快速遍历目录(FilenameFilter正则)

yzmm
740 阅读
遍历目录下所有文件名中带有.jsp的不管是1.jsp还是1.jspx或者是1.JsPx,如果不用Filte的话,每次需要读取的文件数会非常多影响速度。简单的看了下实现Java IO的FilenameFilter和FileFilter接口是最佳的选择。
import java.io.File;
import java.io.FilenameFilter;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.regex.Pattern;
public class Dirs implements FilenameFilter{
	static int c = 0;
	public void test(Collection<File> f,File file){
		c++;
		if(file.isDirectory()){
			String[] files = file.list(this);
			for (int i = 0; i < files.length; i++) {
				test(f,new File(file, files[i]));
			}
		}else{
			f.add(file);
		}
	}
	public boolean accept(File dir, String name) {
		return Pattern.compile("\\.jsp",Pattern.CASE_INSENSITIVE|Pattern.DOTALL).matcher(name).find()||new File(dir,name).isDirectory();
	}
	public static void main(String[] args) {
		Dirs t = new Dirs();
		long stime = System.currentTimeMillis();//开始时间
		Collection<File> f = new LinkedHashSet<File>();
		t.test(f,new File("/Users/"));
		for(File a:f){
			System.out.println(a);
		}
		System.out.println("读取:"+c+","+(System.currentTimeMillis()-stime)+"ms");
	}
}

Apache Commons IO 的FileUtils类,虽然提供了类似的方法,但是带递归遍历和后缀过滤的方法都是用的endWith比较的后缀,默认大小写敏感,贴出来仅供参考。

import java.io.File;
import java.util.Collection;
import org.apache.commons.io.FileUtils;
public class ApacheCommonIO {
	public static void main(String[] args) {
		long stime = System.currentTimeMillis();
		Collection<File> f = FileUtils.listFiles(new File("/Users/"),new String[]{"jsp","java"}, true);
		for(File a:f){
			System.out.println(a);
		}
		System.out.println(System.currentTimeMillis()-stime+"ms");
	}
}

评论 (0)

发表评论