特定のディレクトリ内のファイルを見つける:私はこのようなFiles.walkFileTree
を使用して大規模かつ深くネストされたディレクトリ構造を反復:はEfficently私は簡単な問題を抱えている
final int CUTOFF = 5;
final List<Path> foundList = new ArrayList<>();
Files.walkFileTree(codeRoot, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
throws IOException {
String rPath = codeRoot.relativize(dir).toString();
int level = rPath.length() - rPath.replace("/", "").length();
if (dir.getFileName().toString().equals("target") || level < CUTOFF) {
return FileVisitResult.CONTINUE;
}
return FileVisitResult.SKIP_SUBTREE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
if (file.getFileName().toString().endsWith(".txt")) {
foundList.add(file);
}
return FileVisitResult.CONTINUE;
}
});
私の目標は、特定のディレクトリtarget
の下にあるすべてのファイルを追加することであるI知っているのはCUTOFF
レベルでcodeRoot
です。
これは、必要な場合には、stat()
コールまたは「完了できません」という声で、より効率的な方法を探しています。
言語レベルはJava8です。
なぜそれはできると思いますか? walkFileTreeはNIOを使用します。これは、パフォーマンス面でネイティブウォークと同じくらいよくなることを意味します。これを頻繁に呼び出すと、いくつかのキャッシュを使用できます。キャッシュの例:最後の呼び出し以降に変更されていないディレクトリをキャッシュする(一部のファイルシステムでは)ディレクトリの最終変更時刻。 –
@MladenAdamovic私は主に、アルゴリズムのショートカットがないと思っていました。また、 'relativize()'が避けることができるfsの性能に影響を与えるかどうかは分かりません。繰り返し実行の最適化についてのあなたの考えは良いものです、ありがとう! – mabi
あなたはスピードの尺度として何を使用していますか?参照点としてC/C++で同様のソリューションを実装しましたか?これまでのところ、それはなぜ非効率だと思いますか? – Fallso