-1
以下のFileRepository
クラスを指定すると、私は500以上のクライアントディレクトリを処理しているので、どのようにファイル検索を最適化できますか。おそらく私はStreams
を使って以下を書き直すことができますか?findパターンは再帰的にファイルに一致します
最初のレベルですべての顧客ディレクトリを見てからforeachカスタマーディレクトリは下のレベルを見て、COB02Oct2010
のような昨日のフォルダを考慮に入れるだけです。私はDateHelper
を書いてこれを元に戻しました。関連するサブディレクトリだけを考えてみましょう。次に、そのディレクトリにある一致するファイルパターンを見て、送信するファイルを取得します。
私は単にPaths
とDirectoryStream
を使用してこれを行うことはできますか?
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);
}
}
}