删除所有文件和子目录,但在Java中保持当前目录为空

删除所有文件和子目录,但在Java中保持当前目录为空,java,file-io,Java,File Io,我有一个文件夹“/a/b/”,我想删除文件夹b中的所有内容,包括文件、目录以及这些目录中的文件和子目录,但我想保持文件夹b为空而不删除它。我试过的是: Files.walk(Paths.get("/a/b/"))// .map(Path::toFile)// .sorted(Comparator.comparing(File::isDirectory))// .forEach(File::del

我有一个文件夹“/a/b/”,我想删除文件夹b中的所有内容,包括文件、目录以及这些目录中的文件和子目录,但我想保持文件夹b为空而不删除它。我试过的是:

Files.walk(Paths.get("/a/b/"))//
                 .map(Path::toFile)//
                 .sorted(Comparator.comparing(File::isDirectory))//
                 .forEach(File::delete);

这个解决方案在删除文件夹b中的所有内容时效果很好,但它也删除了我想保留的文件夹b。我应该如何在这里更改以保留文件夹b,有人能给我提示吗?谢谢您

筛选除此目录以外的所有目录:

Path rootPath = Paths.get("/a/b/");
Files.walk(rootPath)//
     .filter(p -> !p.equals(rootPath))
     .map(Path::toFile)//
     .sorted(Comparator.comparing(File::isDirectory))//
     .forEach(File::delete);

请注意,
.sorted(Comparator.comparing(File::isDirectory))
可能还不够。
首先删除目录很重要,但它们的删除顺序也很重要

假设您有目录:
/a/b/
/a/b/c
/a/b/c/d

您希望在深度优先之前最后删除目录深度,即
/a/b/c/d
之前的
/a/b/c

但是
File.walk()
首先遍历深度。因此,它将按以下顺序迭代:
/a/b/
/a/b/c
/a/b/c/d

因此,颠倒
文件流的自然顺序:

 .sorted(Comparator.reverseOrder())

您可以使用apache commons io中的FileUtils:

FileUtils.cleanDirectory(Paths.get("/a/b/").toFile()); 
文件:

更新:根据文件的文档,仅用于知识。行走

The returned stream encapsulates one or more {@link DirectoryStream}s.
 * If timely disposal of file system resources is required, the
 * {@code try}-with-resources construct should be used to ensure that the
 * stream's {@link Stream#close close} method is invoked after the stream
 * operations are completed.
所以,除非你这样使用:

try(Stream<Path> paths = Files.walks(...)) {
  //Operations here with paths
}
try(流路径=Files.walks(…){
//这里的操作具有路径
}

即使使用forEach,溪流也不会关闭。

我的想法是在之后简单地重新创建它,但这条溪流显然更酷@幽灵猫嘿。对于异常处理,它就不那么酷了:'(但是谢谢:)@GhostCat
Path.equals()
被覆盖。因此,最后,请再次注意,Files.walk()不会关闭打开的资源。您应该与try(Files.walk(..){}@Brother
Stream一起使用。forEach()
关闭流。因此,
DirectoryStreams
的资源实际上已经发布了。顺便说一句,这是个好问题;-)