快速列出目录及其所有子目录中的文件
问题描述:
我需要查找目录及其所有子目录(除了某些目录)中的所有文件。
目前我使用这种方法:快速列出目录及其所有子目录中的文件
public static Collection<File> listFiles(File directory,FilenameFilter filter,boolean recurse){
Vector<File> files = new Vector<File>();
File[] entries = directory.listFiles();
if(entries!=null){
for (File entry : entries){
if (filter == null || filter.accept(directory, entry.getName())){
files.add(entry);
}
if (recurse && entry.isDirectory()){
files.addAll(listFiles(entry, filter, recurse));
}
}
}
return files;
}
,并使用它像这样:
this.foundFiles=listFiles(new File(this.BaseDirectory), new FilenameFilter() {
public boolean accept(File dir, String name) {
boolean res=true;
if(name.endsWith(".pdf")){
if(!dir.getPath().endsWith("done")){
if((workingFile!=null && (dir.getPath().equals(workingFile.getParent()) && name.equals(workingFile.getName())))){
res=false;
}else{
try {
ArrayList<String> AuthFolders = DB.getGroupAuthFoldersArray();
for(String folder:AuthFolders){
if(dir.getPath().startsWith(BaseDirectory+File.separator+folder)){
res=true;
break;
}else{
res=false;
}
}
} catch (SQLException ex) {
Logger.getLogger(scanner.class.getName()).log(Level.SEVERE, null, ex);
res=false;
} catch (InterruptedException ex) {
Logger.getLogger(scanner.class.getName()).log(Level.SEVERE, null, ex);
res=false;
}
}
}else{
res=false;
}
}else{
res=false;
}
return res;
}
}, true);
但这是太慢了!我在目录中有大约3000个文件,并且需要10-15分钟(!!)才能找到所有这些文件。
如何快速做到这一点?
我正在考虑使用org.apache.commons.io.FileUtils.listfiles
方法。有更快的方法吗?
感谢
答
} catch (SQLException ex) {
这不属于打算做目录列表的类!
您是否尝试过org.apache.commons.io.FileUtils.listfiles?也许它的速度和你需要的一样快。顺便说一句:你查询每个找到的pdf文件的数据库?我会指出这是一个表现杀手。 – flash
10-15分钟?它在哪里这么久? profiler(或'-Xprof' JVM标志)是你最好的朋友。无论如何,我会给Apache Commons的listfile()方法一个镜头,它在全世界范围内广泛使用。 –
为什么你不把过滤器传递给listFiles方法? http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles(java.io.FilenameFilter) – kofemann