Files.walkFileTree遍历目录文件

在jdk1.7之前我们采用递归遍历目录文件,在其之后,我们可以采用JDK7新增的静态工具方法java.nio.file.Files.walkFileTree。

1.Files.walkFileTree的原理介绍

static Path walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor) throws IOException;
static Path walkFileTree(Path start, FileVisitor<? super Path> visitor) throws IOException;

参数列表:

  • java.nio.file.Path start 遍历的起始路径
  • Set<java.nio.file.FileVisitOption> options 遍历选项
  • int maxDepth 遍历深度
  • java.nio.file.FileVisitor<? super Path> visitor 遍历过程中的行为控制器

2.代码示例

import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author yanxl
 * @since 2022/8/8 14:31
 */
public class FilesWalkFileTreeTest {
    public static void main(String[] args) throws IOException {
        AtomicInteger dirCount = new AtomicInteger();
        AtomicInteger fileCount = new AtomicInteger();
        Path path = Paths.get("D:\\Program Files\\Java\\jdk1.8.0_321");
        Files.walkFileTree(path, new SimpleFileVisitor<Path>(){
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                System.out.println("=====>" + dir);
                dirCount.incrementAndGet();
                return super.preVisitDirectory(dir, attrs);
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                System.out.println(file);
                fileCount.incrementAndGet();
                return super.visitFile(file, attrs);
            }
        });
        System.out.println("dir count:" + dirCount);
        System.out.println("file count:" + fileCount);
    }
}

输出结果:

......
D:\Program Files\Java\jdk1.8.0_321\lib\visualvm\visualvm\update_tracking\com-sun-tools-visualvm-uisupport.xml
D:\Program Files\Java\jdk1.8.0_321\LICENSE
D:\Program Files\Java\jdk1.8.0_321\README.html
D:\Program Files\Java\jdk1.8.0_321\release
D:\Program Files\Java\jdk1.8.0_321\src.zip
D:\Program Files\Java\jdk1.8.0_321\THIRDPARTYLICENSEREADME-JAVAFX.txt
D:\Program Files\Java\jdk1.8.0_321\THIRDPARTYLICENSEREADME.txt
dir count:68
file count:938

image-20220808144736564

注意:代码遍历的目录是68个,而windows系统显示的数据是67个文件夹?这是因为windows计算目录的时候并没有计算根目录jdk1.8.0_321,而代码将其作为一个目录计算。

image-20220808145127087

最后修改:2022 年 08 月 08 日
如果觉得我的文章对你有用,请随意赞赏