快速列出目录及其所有子目录中的文件

问题描述:

我需要查找目录及其所有子目录(除了某些目录)中的所有文件。
目前我使用这种方法:快速列出目录及其所有子目录中的文件

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方法。有更快的方法吗?

感谢

+0

您是否尝试过org.apache.commons.io.FileUtils.listfiles?也许它的速度和你需要的一样快。顺便说一句:你查询每个找到的pdf文件的数据库?我会指出这是一个表现杀手。 – flash

+0

10-15分钟?它在哪里这么久? profiler(或'-Xprof' JVM标志)是你最好的朋友。无论如何,我会给Apache Commons的listfile()方法一个镜头,它在全世界范围内广泛使用。 –

+1

为什么你不把过滤器传递给listFiles方法? http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles(java.io.FilenameFilter) – kofemann

} catch (SQLException ex) { 

这不属于打算做目录列表的类!

使用Files.walkFileTree在Java 7中,这是快于listFiles因为它使用流媒体。阅读tutorial了解更多信息。