Files.walkFileTree的原理介绍
原型:static Path Files.walkFileTree(Path start, FileVisitor<? super Path> visitor);
ii. 表示从start代表的节点开始遍历文件系统;
iii. 其中visitor是遍历过程中的行为控制器;
4) 遍历行为控制器——FileVisitor:
i. 它是一个接口,里面定义了4个方法用来指定当你访问一个节点之前、之中、之后、失败时应该采取什么行动;
ii. 这个设计非常优雅和科学,毕竟你在遍历文件系统时想要做的事情无外乎发生在这几个时间点上,Java全部为你考虑好了,并搭好了框架!多么的贴心!!
public interface FileVisitor {
FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) // 访问一个目录前要干啥
throws IOException;
FileVisitResult postVisitDirectory(T dir, IOException exc) // 访问一个目录后要干啥
throws IOException;
FileVisitResult visitFile(T file, BasicFileAttributes attrs) // 正在访问一个文件时要干啥
throws IOException;
FileVisitResult visitFileFailed(T file, IOException exc) // 访问一个文件失败时要干啥
throws IOException;
}
实际例子一:
// 发布站点版本的时候,将数据从Tomcat下复制到Nginx下
File nginxFolder = getStaticPagesFolderNginx(siteVersion);
File tomcatFolder = getStaticPagesFolderTomcat(siteVersion);
try {
Path source = Paths.get(tomcatFolder.toString());
Path target = Paths.get(nginxFolder.toString());
// 源文件夹非目录
if(null==source||!Files.isDirectory(source))
throw new IllegalArgumentException(“source must be directory”);
Files.walkFileTree(source, new SimpleFileVisitor
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
// 在目标文件夹中创建dir对应的子文件夹
Path subDir =null;
if (dir.compareTo(source) == 0) {
subDir = target;
} else {
subDir = target.resolve(dir.subpath(source.getNameCount(), dir.getNameCount()));
}
Files.createDirectories(subDir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.copy(file, target.resolve(file.subpath(source.getNameCount(), file.getNameCount())),StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
实际例子二:
try {
File eventFile = new File(eventService.getPublishPath());
if (!eventFile.exists()) {
return;
}
Files.walkFileTree(eventFile.toPath(), new SimpleFileVisitor
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException {
if (e == null) {
Files.delete(dir);
return FileVisitResult.CONTINUE;
} else {
throw e;
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
更多文章欢迎浏览博客:https://blog.csdn.net/qq_37022150