前回はファイルツリーの走査の概要について記述しました。
今回は実際の実装例について見ていきましょう。
まず、FileVisitorインターフェースの匿名クラスを示します。
それぞれのメソッドはすべて、第1引数の型はPathインターフェースになります。
preVisitDirectoryメソッドとvisitFileメソッドは、第2引数の型がBasicFileAttributesクラスになります。
postVisitDirectoryメソッドとvisitFileFailedメソッドの第2引数の型はIOException例外となり、
走査中に発生した例外が引数となります。ただし、走査が正常に行われた場合、
postVisitDirectoryメソッドの第2引数の値はnullになります。
すべてのメソッドの返り値の型はFileVisitResult列挙型です。
FileVisitResult列挙型は以下の4種類の値を取ります。
- CONTINUE
- SKIP_SIBLINGS
- SKIP_SUBTREE
- TERMINATE
走査を続けるのであればCONTINUEを返します。
SKIP_SUBLINGSはディレクトリに依存するそれ以降のファイル/ディレクトリの走査をスキップするために使用します。
同様にSKIP_SUBTREEもサブツリーの走査をスキップするために使用します。
最後のTERMINATEは走査を中止させます。
// ファイルツリーを走査するFileVisitor
FileVisitor<Path> visitor = new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDIrectory(Path dir, BasicFileAttributes attrs) {
System.out.println("Pre visit Directory; " + dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
System.out.println("Visit File: " + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
System.out.println("Post Visit Directory: " + dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
System.out.println("Visit File Failed: " + file);
return FileVisitResult.TERMINATE;
}
};
// ファイルツリーの走査実行
Path path = Paths.get("alpha");
Files.walkFileTree(path, visitor);
上記のソースでは、4種類のメソッドとともに第1引数を標準出力に出力する処理だけを行っています。
これで、どのメソッドがどの順番にコールされるかわかるはずです。
visitFileFailedメソッド以外のメソッドは正常に走査が行われているので、返り値としてCONTINUEを返しています。
visitFileFailedメソッドだけは、何らかの異常が発生したことを示しているので、走査を中止するためTERMINATEを返すようにしています。
Paths.getメソッドの引数に起点のディレクトリを指定し、FilesクラスのwalkFileTreeメソッドが実際にファイルツリーの走査を行います。
今回はFileVisitorインターフェースの匿名クラスを使用しましたが、空のメソッドが定義されている
SimpleFileVisitorクラスを使用して必要なメソッドだけオーバーライドすることもできます。
今回はコンソールに出力するだけでしたが、次回はもう少し役にたつ実装例を示していきたいと思います。
それでは今日はこの辺で!
人気ブログランキングへ
0 件のコメント:
コメントを投稿