LoginSignup
1
1

【JavaGold】FilesクラスのwalkFileTreeメソッド

Posted at

概要

指定されたディレクトリから再帰的に全てのファイルやサブディレクトリを走査する。

シグネチャは以下である。

Path walkFileTree(Path start,Set<FileVisitOption>,int maxDepth,FileVisitor<? super Path> visitor)throws IOException
  • start:再帰的な走査を開始するディレクトリのPathインスタンスを指定する。

  • options:走査オプションを含むSet<FileVisitOption>である。
    主なオプションとしてFileVisitOption.FOLLOW_LINKSがあり、シンボリックリンク1をたどるかを指定できる。

  • maxDepth:再帰の深さの最大値を指定する。

    • 0を指定:
      startディレクトリのみを走査する。
    • 1を指定:
      startディレクトリとその直下のフォルダ、サブディレクトリを走査する。
    • Integer.MAX_VALUEを指定:
      全てのサブディレクトリを再帰的に走査する。
  • visitorFileVisitor<? super Path>インタフェースを実装してファイル走査処理を指定する。

FileVisitorインタフェース

FileVisitorインタフェースには、処理タイミングが異なる以下の4つの抽象メソッドが含まれており、全て実装する必要がある。

  1. preVisitDirectory(Path dir, BasicFileAttributes attrs)
    ディレクトリに入るに実行される。

  2. postVisitDirectory(Path dir, IOException exc)
    ディレクトリを出たに実行される。

  3. visitFile(Path file, BasicFileAttributes attrs)
    ファイルに遭遇した時に実行される。

  4. visitFileFailed(Path file, IOException exc)
    ファイルの処理に失敗した時に実行される。

これらのメソッドを実装することで、ファイルツリーの走査中に実行したいアクションを指定できる。

なお、それぞれのメソッドはEnumのjava.nio.file.FiveVisitResultで定義された以下の定数を返す。

FiveVisitResultの定数

以下4つの定数は、FileVisitorインタフェースのメソッド内で、ファイルやディレクトリに対するアクションの結果の戻り値に指定する。

  1. CONTINUE
    ファイルやディレクトリの走査を続ける。
  2. TERMINATE
    ファイルやディレクトリの走査を終了(中止)する。
  3. SKIP_SUBTREE
    サブディレクトリの走査をスキップし、直接次のディレクトリに進む。
  4. SKIP_SIBLINGS
    同じ親ディレクトリ内の次のエントリにスキップし、現在のディレクトリの走査を終了する。

これらの定数を使用することで、ファイルツリーの再帰的な走査を制御することができる。
例えば、特定の条件に合致するファイルを見つけた場合に走査を終了したり、特定のディレクトリ以下の走査をスキップするなどである。

import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitOption.*;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitOption.*;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitOption.*;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;

public class FileVisitorExample implements FileVisitor<Path> {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        // ディレクトリに入る前に実行されるアクション
        System.out.println("Entering directory: " + dir);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        // ファイルに対して実行されるアクション
        System.out.println("File: " + file);
        // 特定の条件に合致するファイルを見つけた場合に走査を終了する例
        if (file.getFileName().toString().equals("file3.txt")) {
            return FileVisitResult.TERMINATE;
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
        // ファイルにアクセスできなかった場合に実行されるアクション(スキップ可能)
        System.err.println("Failed to visit file: " + file);
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
        // ディレクトリを出た後に実行されるアクション
        System.out.println("Exiting directory: " + dir);
        return FileVisitResult.CONTINUE;
    }

    public static void main(String[] args) {
        Path dirPath = Paths.get("example_directory");

        try {
            Files.walkFileTree(dirPath, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE,
                               new FileVisitorExample());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

この例では、FileVisitorExampleクラスがFileVisitor<Path>インタフェースを実装している。

  • preVisitDirectory()メソッド内:
    ディレクトリに入る前に実行するアクションを指定
  • visitFile()メソッド内:
    ファイルに遭遇した時に実行するアクションを指定
  • postVisitDirectory()メソッド内:
    ディレクトリを出た後に実行するアクションを指定

また、特定の条件に合致するファイル(ここではfile3.txt)を見つけた場合に走査を終了するために、visitFile()メソッド内でFileVisitResult.TERMINATEを返している。

FileVisitorインタフェースに定義されている4つの抽象メソッドは全て実装しなければならない。
しかし、ファイルを削除したいだけなどシンプルな操作であれば、最低限の実装だけ待つjava.nio.file.SimpleFileVisitorクラスを使用することで必要なメソッドのみオーバーライドすることができる。

  1. ディスク上で扱うファイルなどを本来の位置とは別にファイルを作成し、それを通じてアクセスできるようにする仕組みのこと。Windowsでいうショートカットのイメージ。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1