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();

}

资料来源:这里

鉴于新的nioAPI消除了太多的混乱和样板,这让人感到非常笨拙和冗长。

我正在寻找纯本地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-映射PathFile
  • .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,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:最简洁的递归目录删除 的全部内容, 来源链接: utcz.com/qa/418929.html

回到顶部