Java.nio:最简洁的递归目录删除
我目前正在尝试递归删除目录…奇怪的是,我能够找到的最短代码是以下结构,采用了一个 临时内部类 并且采用了 访问者模式 …
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方法,所以请不要链接到外部库…
回答:
您可以结合使用NIO 2和Stream API。
Path rootPath = Paths.get("/data/to-delete");// before you copy and paste the snippet
// - read the post till the end
// - read the javadoc to understand what the code will do
//
// a) to follow softlinks (removes the linked file too) use
// Files.walk(rootPath, FileVisitOption.FOLLOW_LINKS)
//
// b) to not follow softlinks (removes only the softlink) use
// the snippet below
try (Stream<Path> walk = Files.walk(rootPath)) {
walk.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.peek(System.out::println)
.forEach(File::delete);
}
Files.walk
-返回以下所有文件/目录,rootPath
包括.sorted
-以相反的顺序对列表进行排序,因此目录本身位于包含子目录和文件的后面.map
-映射Path
到File
.peek
-仅显示要处理的条目.forEach
-.delete()
在每个File
对象上调用方法
正如@Seby首先提到的,现在由@JohnDough引用的,Files.walk()
应该在try-with-resource
构造中使用。多亏了两者。
从Files.walk javadoc
如果需要及时处理文件系统资源,则应使用try-with-resources构造来确保流操作完成后调用流的close方法。
这是一些数字。 该目录/data/to-delete
包含解压缩rt.jar
的jdk1.8.0_73和最新版本的activemq。
files: 36,427dirs : 4,143
size : 514 MB
时间(以毫秒为单位)
int. SSD ext. USB3NIO + Stream API 1,126 11,943
FileVisitor 1,362 13,561
两种版本均执行时未打印文件名。最大的限制因素是驱动器。没有执行。
有关选项的一些其他信息FileVisitOption.FOLLOW_LINKS
。
假设以下文件和目录结构
/data/dont-delete/bar/data/to-delete/foo
/data/to-delete/dont-delete -> ../dont-delete
使用
Files.walk(rootPath, FileVisitOption.FOLLOW_LINKS)
将遵循符号链接,该文件/tmp/dont_delete/bar
也将被删除。
使用
Files.walk(rootPath)
将不会遵循符号链接,并且/tmp/dont_delete/bar
不会删除该文件。
切勿在不了解代码功能的情况下将代码用作复制和粘贴。
以上是 Java.nio:最简洁的递归目录删除 的全部内容, 来源链接: utcz.com/qa/418929.html