2017-10-03 2 views
-1

아래 FileRepository 클래스가 주어지면 파일 검색을 최적화하여 어떻게 500 개 이상의 클라이언트 디렉토리를 처리 할 수 ​​있습니까? 아마도 Streams을 사용하여 아래에 다시 쓸 수 있습니까?패턴 찾기가 파일을 재귀 적으로 찾습니다.

먼저 모든 고객 디렉토리를 살펴보고 foreach 고객 디렉토리는 아래 레벨을보고 어제의 폴더 인 COB02Oct2010만을 고려해야합니다. 나는 DateHelper을 써서이 이전 근무일로 돌아가서 관련된 하위 디렉토리 만 고려해 보았다. 그런 다음 그 디렉토리에있는 일치하는 파일 패턴을보고 파일을 보내도록했다.

간단히 PathsDirectoryStream을 사용할 수 있습니까? AbacusUtil

public List<File> getFilesToSend(String sourcePath, String pattern, String format) { 
    final Predicate<File> isTargetFile = f -> f.isFile() 
           && N.startsWithIgnoreCase(f.getName(), pattern) 
           && N.endsWithIgnoreCase(f.getName(), "." + format); 

    return Stream.list(new File(sourcePath)) 
      .filter(File::isDirectory) 
      .map(f -> new File(f, "COB" + getPreviousWorkingDay())) 
      .flatMap(cobDir -> Stream.list(cobDir, true).filter(isTargetFile)) 
      .toList(); 
} 
: 여기
try (DirectoryStream<Path> stream = Files.newDirectoryStream(directoryPath, filter)) { 
      for (Path path : stream) { 
       if (Files.isRegularFile(path)) { 
        consumer.accept(path); 
       } 
      } 
} 

답변

0

내 라이브러리에 의해 샘플 솔루션입니다 :

public class FileRepository { 

    public List<File> getFilesToSend(String sourcePath, String pattern, String format) { 

     List<File> files = new ArrayList<>(); 

     File[] customerDir = getCustomerDirs(sourcePath); 

     for (int i = 0; i < clientDirs.length; i++) { 
      files.addAll(processClientDirectory(clientDirs[i], pattern, format)); 
     } 
     return files; 
    } 

    private List<File> processClientDirectory(File clientDir, String pattern, String format) { 

     List<File> result = new ArrayList<>(); 

     pattern = pattern.toLowerCase(Locale.ENGLISH); 
     format = Constants.EXTENSION_SEPARATOR + format.toLowerCase(Locale.ENGLISH); //add a "." 

     File cobDir = new File(clientDir, "COB" + DateHelper.getPreviousWorkingDay()); 
     getFilesToProcess(result, cobDir, pattern, format); 

     return result; 
    } 

    private void getFilesToProcess(List<File> result, File cobDir, String pattern, String format) { 


     if (!cobDir.exists()) { 
      return; 
     } 

     File[] files = cobDir.listFiles(pathName -> { 
      if (pathName.isDirectory()) { 
       return true; 
      } 

      if (!pathName.isFile()) { 
       return false; 
      } 

      String name = pathName.getName().toLowerCase(Locale.ENGLISH); 
      if (!name.startsWith(pattern)) { 
       return false; 
      } 
      if (!name.endsWith(format)) { 
       return false; 
      } 

      return true; 
     }); 

     for (int i = 0; i < files.length; i++) { 
      File current = files[i]; 
      if (current.isDirectory()) { 
       getFilesToProcess(result, current, pattern, format); 
       continue; 
      } 
      result.add(current); 
     } 
    } 

    public File[] getCustomerDirs(String sourcePath) { 
     File[] directories = new File(sourcePath).listFiles(File::isDirectory); 
     return directories; 
    } 
} 

나는 어쩌면이 같은 예를 들어 필터를 쓸 수있는 방법을 잘하지 않은