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