2012-01-16 2 views
1

가능한 중복 파일없이 고정 :
Is there a workaround for Java's poor performance on walking huge directories?목록 자바 디렉토리에서

내가 File.listFiles를 사용하여 일부 디렉토리 내의 모든 파일을 나열하는 유틸리티를 만들어을() 기능이 있지만 그 디렉토리 아래에 엄청난 양의 파일 (약 100K)을 복사 할 때 문제가 발생했습니다.

나는 해결책을 찾고 있었는데 실제로 그 디렉토리에서 파일의 일부 고정 된 번호 (X)를 처리하고 처리 한 다음 그 파일을 삭제하고 다음 X 개의 파일을 취한다. 아무도 나에게 어떤 해결책을 제안 할 수 있습니다. 당신이 그 시점에서 Exception을 던져, 예외 조금을 남용 할 준비가되어있는 경우

감사

+1

나는 아래의 Pauls 제안이 위의 링크보다 더 우아하다고 생각하지만 그것은 단지 내 의견이다. – Kennet

답변

2

하나의 솔루션으로, 접수 된 파일의 특정 숫자 후 FileNameFilter 중 하나를 반환 false을 사용할 수 또는 수 있습니다.

class CountedFilter implements FilenameFilter { 
    int limit = 0; 

    public CountedFilter (int limit) { 
    this.limit = limit; 
    } 

    public boolean accept(File file, String string) { 
    return limit-- > 0; 
    } 

} 


은 간결 근처에 아무데도 다른 옵션이있다 그러나 나는 더 효과적입니다 생각합니다. BlockingQueue을 통해 각 파일을 발신자에게 다시 게시하는 FilenameFilter이 필요합니다. File.list은 별도의 스레드에서 호출되므로 완료 될 때까지 기다릴 필요가 없습니다.

이 솔루션은 File.list이 실행되는 동안 파일을 처리 할 수 ​​있다는 이점이있어서 반복기와 훨씬 더 매끄러운 솔루션을 제공합니다. 격려가된다면 코드를 별도의 답변으로 게시 할 것입니다.

+0

나는 잘 모르지만 FileNameFilter를 사용하여 아무런 이점도 얻지 못한다. 실제로 파일 유형은 디렉토리에 있으며 파일 이름은 동일하다. 무작위로 datetime을 기반으로, 어떻게 FileNameFilter를 사용할 수 있습니까? – SaQiB

+0

유망 해 보입니다. 고마워. – SaQiB

+0

예측 가능한 순서로 파일을 제공하지 않습니다. 가장 오래된 파일 만 선택하려면 모든 파일을 나열해야합니다. – OldCurmudgeon