Bootstrap

Java Files.walkFileTree 文件遍历

参数1:路径  参数2:FileVisitor对象

walkFileTree(Path start, FileVisitor<? super Path> visitor)

FileVisitor当中有四个方法

public interface FileVisitor<T> {

    
    FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
        throws IOException;

    
    FileVisitResult visitFile(T file, BasicFileAttributes attrs)
        throws IOException;

    FileVisitResult visitFileFailed(T file, IOException exc)
        throws IOException;

    
    FileVisitResult postVisitDirectory(T dir, IOException exc)
        throws IOException;

preVisitDirectory:访问目录时触发

visitFile:文件被访问时触发

visitFileFailed:访问文件发生错误时触发

postVisitDirectory:离开目录时触发

 上面方法返回都是FileVisitResult类,他是一个枚举类:

public enum FileVisitResult {
    /**
     *继续访问
     */
    CONTINUE,
    /**
     * 停止访问
     */
    TERMINATE,
    /**
     * 继续访问,但是不访问该文件或者目录的子目录
     */
    SKIP_SUBTREE,
    /**
     * 返回上一层目录继续访问,停止访问相邻目录或文件
     */
    SKIP_SIBLINGS;
}

使用的时候我们可以直接使用SimpleFileVisitor 他是FileVisitor的接口实现类

案例1:查看当前目录文件与文件夹的数量

public static void main(String[] args) throws IOException {
        AtomicInteger dirCount = new AtomicInteger();
        AtomicInteger fileCount = new AtomicInteger();
        Files.walkFileTree(Paths.get("D:\\jdk"), new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                System.out.println("----->" + dir);
                dirCount.incrementAndGet();
                return CONTINUE;
            }
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                System.out.println("-------->" + file);
                fileCount.incrementAndGet();
                return CONTINUE;
            }
        });
        System.out.println("文件夹数量:" + dirCount.get());
        System.out.println("文件数量:" + fileCount.get());
    }

注意:此方法便利的文件夹数量会比我们右键文件属性看到的文件夹数量多一,因为文件属性里是不包含当前文件夹的

 案例 2:删除当前目录以及子目录和文件

删除我们可以使用Files下的delete方法 但是如果当前目录下有子目录或者文件是不允许删除的

所有需要walkFileTree来进行遍历

注意:删除就没了

Files.walkFileTree(Paths.get("D:\\jdk - 副本"), new SimpleFileVisitor<Path>() {
          
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Files.delete(file);
                return CONTINUE;
            }
            
            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { 
                Files.delete(dir);
                return CONTINUE;
            }
        });

;