2012-05-02 18 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メソッドを使用することを考えています。より速い方法がありますか?

おかげで、それはストリーミングを使用しているためlistFilesよりも高速でのJava 7で

+0

あなたはorg.apache.commons.io.FileUtils.listfilesを試しましたか?おそらく、あなたが必要とするほど速いでしょう。 BTW:発見されたすべてのPDFファイルのデータベースを照会しますか?私はこれをパフォーマンスのキラーとして指摘します。 – flash

+0

10-15分?それはどこに長いですか?プロファイラ(または '-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) { 

これは、ディレクトリリストを作成するクラスに属していません。

関連する問題