我目前正在尝试递归地删除一个目录……奇怪的是,我能找到的最短代码是以下结构,采用 临时内部类 和 访问者模式……
Path rootPath = Paths.get("data/to-delete");
try {
Files.walkFileTree(rootPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("delete file: " + file.toString());
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
System.out.println("delete dir: " + dir.toString());
return FileVisitResult.CONTINUE;
}
});
} catch(IOException e){
e.printStackTrace();
}
资料来源: 这里
鉴于新的 nio
API 消除了如此多的混乱和样板,这感觉非常笨拙和冗长……
有没有更短的方法来实现强制的递归目录删除?
我正在寻找纯原生 Java 1.8 方法,所以请不要链接到外部库…
原文由 fgysin 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以结合使用 NIO 2 和 Stream API。
Files.walk
- 返回下面的所有文件/目录rootPath
包括.sorted
- 以相反的顺序对列表进行排序,因此目录本身位于包括子目录和文件之后.map
- 将Path
映射到File
.peek
- 仅显示处理了哪个条目.forEach
- 在每个File
对象上调用.delete()
方法编辑 正如 @Seby 首次提到的,现在被@John Dough 引用,
Files.walk()
应该在try-with-resource
构造中使用。感谢两者。来自 Files.walk javadoc
编辑
这里有一些数字。
目录
/data/to-delete
包含解压缩的rt.jar
的 jdk1.8.0_73 和最近构建的 activemq 。以毫秒为单位的时间
两个版本都在没有打印文件名的情况下执行。最大的限制因素是驱动器。不是实施。
编辑
有关选项
FileVisitOption.FOLLOW_LINKS
的一些附加信息。假设以下文件和目录结构
使用
将遵循符号链接,文件
/tmp/dont_delete/bar
也将被删除。使用
不会遵循符号链接,文件
/tmp/dont_delete/bar
也不会被删除。注意: 切勿在不了解代码功能的情况下将代码用作复制和粘贴。