私はコード片を持っていて、この再帰パターンを理解するのに本当に苦労しています。
private void indexDirectory(IndexWriter indexWriter, File dataDirectory,
String suffix) throws IOException {
System.out.println("Data directory before: " + dataDirectory.getName());
File[] files = dataDirectory.listFiles();
for (File file : files) {
System.out.println("File name : " + file.getName());
if (file.isDirectory()) {
indexDirectory(indexWriter, file, suffix);
} else {
indexFileWithIndexWriter(indexWriter, file, suffix);
}
}
System.out.println("Data directory : " + dataDirectory.getName());
}
そこの dataDirectory には、その中にいくつかのサブディレクトリとファイルがあるディレクトリへのパスが含まれています。
files[] 配列は次のようになります。
C:\projects\test\.classpath,
C:\projects\test\.project,
C:\projects\test\.settings,
C:\projects\test\build,
C:\projects\test\build.xml,
C:\projects\test\dist,
C:\projects\test\src,
C:\projects\test\WebContent
.classpathと.projectはファイルですが、.settingsは 4 つのファイルを含むディレクトリです。そのため、3 回目の反復で.settingsディレクトリが呼び出され、その中に 4 つのファイルが含まれています。.settings はディレクトリであるため、file.isDirectoryはtrue になり、同じメソッド (indexDirectory) が最新のパラメータ値で呼び出されます。したがって、dataDirectory値は .settings に置き換えられます。コードの実行がループに入ると、 .settingsディレクトリ内にファイルが見つかったため、 else部分に移動します。
4回反復すると(ファイルが4つしかないため)、ループを終了することになります。
しかし奇妙なことに、 dataDirectoryの値が古い値に置き換えられ、以前に配列にあった次の項目 (ビルドディレクトリ) を呼び出し始めます。
ループを終了せずに、なぜそのようなことが起こったのか、誰か説明してもらえますか..明確に説明したいと思います。
どうもありがとうございました。