Java.nio:最简洁的递归目录删除
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java.nio:最简洁的递归目录删除,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2357字,纯文字阅读大概需要4分钟。
内容图文
![Java.nio:最简洁的递归目录删除](/upload/InfoBanner/zyjiaocheng/702/7baa29077a7f4d098227def901658a43.jpg)
我目前正在尝试以递归方式删除目录…奇怪的是,我能够找到的最短代码是以下构造,采用ad-hoc内部类和访问者模式…
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();
}
资料来源:here
考虑到新的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
Files.walk(rootPath)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.peek(System.out::println)
.forEach(File::delete);
> Files.walk – 返回rootPath下面的所有文件/目录,包括
> .sorted – 以相反的顺序对列表进行排序,因此目录本身位于包含子目录和文件之后
> .map – 将路径映射到文件
> .peek – 只显示处理的条目
> .forEach – 在每个File对象上调用.delete()方法
编辑
这是一些数字.
目录/ data / to-delete包含jdk1.8.0_73的解压缩rt.jar和最近版本的activemq.
files: 36,427
dirs : 4,143
size : 514 MB
以毫秒为单位的时间
int. SSD ext. USB3
NIO + 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:最简洁的递归目录删除全部内容,希望文章能够帮你解决Java.nio:最简洁的递归目录删除所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。