2012-05-02 157 views
3

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

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

回答

1
} catch (SQLException ex) { 

這不屬於打算做目錄列表的類!

相關問題