2012-05-02 2 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을 자바 7에서

+0

org.apache.commons.io.FileUtils.listfiles를 사용해 보셨나요? 아마도 당신이 필요로하는만큼 빠릅니다. BTW : 발견 된 모든 pdf 파일에 대해 데이터베이스를 쿼리합니까? 나는 이것을 성능 희생자로 지적 할 것이다. – flash

+0

10-15 분? 너무 오래 어디 있었 니? 프로파일 러 (또는'-Xprof' JVM 플래그)는 가장 친한 친구입니다. 어쨌든, 나는 아파치 코 몬즈의'listfile()'메소드에 한방을 주겠다. 그것은 전 세계적으로 광범위하게 사용된다. –

+1

왜 필터를 listFiles 메소드에 전달하지 않습니까? http://docs.oracle.com/javase/6/docs/api/java/io/File.html#listFiles(java.io.FilenameFilter) – kofemann

답변

1
} catch (SQLException ex) { 

이것은 디렉토리 목록을 작성하려는 클래스에 속하지 않습니다!

관련 문제