2017-10-03 17 views
-1

以下のFileRepositoryクラスを指定すると、私は500以上のクライアントディレクトリを処理しているので、どのようにファイル検索を最適化できますか。おそらく私はStreamsを使って以下を書き直すことができますか?findパターンは再帰的にファイルに一致します

最初のレベルですべての顧客ディレクトリを見てからforeachカスタマーディレクトリは下のレベルを見て、COB02Oct2010のような昨日のフォルダを考慮に入れるだけです。私はDateHelperを書いてこれを元に戻しました。関連するサブディレクトリだけを考えてみましょう。次に、そのディレクトリにある一致するファイルパターンを見て、送信するファイルを取得します。

私は単にPathsDirectoryStreamを使用してこれを行うことはできますか?

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; 
    } 
} 

私はこのような例のために多分フィルタを書くことができるかどうかはわかりませんがあります。ここでは

try (DirectoryStream<Path> stream = Files.newDirectoryStream(directoryPath, filter)) { 
      for (Path path : stream) { 
       if (Files.isRegularFile(path)) { 
        consumer.accept(path); 
       } 
      } 
} 

答えて

0

は私のライブラリによって、サンプル溶液である: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(); 
} 
関連する問題