Files クラスの walkFileTree メソッド


1. Files.walkFileTree() はファイルを走査します

walkFileTree()ディレクトリ ツリーを再帰的に走査するためのメソッドが含まれています。メソッド パラメータは Path オブジェクトとオブジェクトを受け取りますFileVisitor。Path オブジェクトは、走査する必要があるディレクトリを指し、FileVisitor走査中に呼び出されます。FileVisitorインターフェースは次のように定義されます。

public interface FileVisitor {
    
    

    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException;

    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException;

    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException;

    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    
    

}

使用時に実装する必要があるFileVisitorインターフェース

try {
    
    
    Files.walkFileTree(start, new FileVisitor<Path>() {
    
    
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
    
    
            System.out.println("pre visit dir:" + dir);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    
    
            System.out.println("visit file:" + file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
    
    

            System.out.println("visit file failed:" + file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    
    

            System.out.println("post visit dir:" + dir);
            return FileVisitResult.CONTINUE;
        }
    });
} catch (IOException e) {
    
    
    e.printStackTrace();
}

出力:

pre visit dir:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data
visit file:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data\nio-data-to.txt
visit file:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data\nio-data.txt
post visit dir:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data

FileVisitorインターフェイス内のメソッドはさまざまなタイミングで呼び出されます。

  • preVisitDirectory(): ディレクトリにアクセスする前に呼び出されます。
  • postVisitDirectory(): 任意のディレクトリへのアクセスが完了した後に呼び出されます。
  • visitFile(): 各ファイルがアクセスされるときに呼び出されます。
  • visitFileFaild(): ファイルへのアクセスが失敗したときに呼び出されます。

FileVistResult4 つのメソッドはすべて、次の 4 つのオプションを含む列挙型のインスタンスを返しますFileVistResult

  • CONTINUE: 横断を続けます。
  • TERMINATE: トラバースを直ちに終了します。
  • SKIP_SIBLINGS: 現在のディレクトリ内の兄弟ファイルをスキップして、トラバースを続行します。
  • SKIP_SUBTREE: 現在のディレクトリをスキップして、トラバースを続行します。これは、preVisitDirectory() メソッドでのみ返されます。他のメソッドで返された場合は、CONTINUE と同じ効果があります。

2. walkFileTree を使用してファイル取得を実装する

private static void extracted4()  {
    
    
        Path start = Paths.get("D:/test");
        try {
    
    
            Files.walkFileTree(start, new SimpleFileVisitor<Path>(){
    
    
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    
    
                    String filePath = file.toAbsolutePath().toString();
                    if(filePath.endsWith("test1.txt")){
    
    
                        System.out.println("file found at path:" + filePath);
                        return FileVisitResult.CONTINUE;
                    }
                    return super.visitFile(file, attrs);
                }
            });
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

ここに画像の説明を挿入します


3. walkFileTree を使用してディレクトリを再帰的に削除する

walkFileTreeディレクトリとディレクトリ内のすべてのファイルを再帰的に削除するためにも使用できます。削除できるのはFiles.delete()空のディレクトリまたはファイルのみです。ディレクトリにファイルが含まれている場合、直接削除することはできません。ディレクトリは、ディレクトリ内のすべてのファイルを削除した後にのみ削除できます。walkFileTreeメソッド. ファイル内でディレクトリを削除しisitFile()、その後、postVisitDirectory()ディレクトリを再帰的に削除できます。

  Path start = Paths.get("D:/test/io");
        try {
    
    
            Files.walkFileTree(start, new SimpleFileVisitor<Path>(){
    
    
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
    
    
                    System.out.println("delete file:" + file);
                    Files.delete(file);
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
    
    
                    System.out.println("delete dir:" + dir);
                    Files.delete(dir);
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

ここに画像の説明を挿入します


おすすめ

転載: blog.csdn.net/lzfaq/article/details/125742399