Files类属于java.nio.file包,是Java7新增的文件操作工具类。
使用Files类提供的walkFileTree(Path start, FileVisitor<? super Path> visitor)方法,能够遍历指定目录下的所有文件和文件夹。
walkFileTree方法需要FileVisitor类型的参数,FileVisitor是一个接口,遍历文件和目录时会触发定义在FileVisitor中的方法。
方法如下:
- FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
- 访问目录之前触发
- FileVisitResult visitFile(T file, BasicFileAttributes attrs)
- 访问文件时触发
- FileVisitResult visitFileFailed(T file, IOException exc)
- 访问文件错误时触发
- FileVisitResult postVisitDirectory(T dir, IOException exc)
- 访问目录之后触发
上面4个方法都返回FileVisitResult 对象,定义了4种访问后的行为。
- CONTINUE 继续访问
- TERMINATE 停止访问
- SKIP_SUBTREE 继续访问,跳过当前目录的子目录树
- SKIP_SIBLINGS 继续访问,跳过同级目录或者文件
遍历文件夹代码示例
Path path = Paths.get("d:", "MyWorkSpace", "IdeaProjects");
// 遍历D:\MyWorkSpace\IdeaProjects目录下的所有文件和子目录,寻找FileVisitorTest.java文件
Files.walkFileTree(path
, new SimpleFileVisitor<Path>() {
// 访问文件时触发
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (file.endsWith("FileVisitorTest.java")) {
System.out.println("已经找到FileVisitorTest.java文件!停止查找!");
return FileVisitResult.TERMINATE;
}
System.out.println("正在访问" + file + "文件");
return FileVisitResult.CONTINUE;
}
// 访问目录时触发
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("正在访问:" + dir + " 目录");
return FileVisitResult.CONTINUE;
}
});
注:SimpleFileVisitor是FileVisitor的实现类,使用它我们无需重写FileVisitor中的全部方法。