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"); } }