ディレクトリ内のすべてのファイルとすべてのサブディレクトリ(一部を除く)を見つける必要があります。
は現在、私はこの方法を使用しています:ディレクトリとそのすべてのサブディレクトリ内の高速一覧ファイル
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で
あなたはorg.apache.commons.io.FileUtils.listfilesを試しましたか?おそらく、あなたが必要とするほど速いでしょう。 BTW:発見されたすべてのPDFファイルのデータベースを照会しますか?私はこれをパフォーマンスのキラーとして指摘します。 – flash
10-15分?それはどこに長いですか?プロファイラ(または '-Xprof' JVMフラグ)はあなたの親友です。とにかく、私はApache Commonsの 'listfile()'メソッドにショットを与えます。これは世界中で広く使われています。 –
なぜフィルタをlistFilesメソッドに渡さないのですか? http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles(java.io.FilenameFilter) – kofemann