2016年11月17日木曜日

ファイルツリーの走査例

みなさん。 こんばんは。

前回はファイルツリーの走査の概要について記述しました。

今回は実際の実装例について見ていきましょう。

まず、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 件のコメント:

コメントを投稿