Java 快速遍历目录(FilenameFilter正则)
遍历目录下所有文件名中带有.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");
}
}