Java如何递归删除目录

后端 潘老师 7个月前 (10-23) 132 ℃ (0) 扫码查看

学习使用Java IO、New IO和Commons IO类来删除目录以及其中的所有子目录和文件。

1.使用Apache Commons IO中的FileUtils.deleteDirectory()

将Commons IO模块包含在项目中,使用Maven依赖项。

Dependency<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

Commons IO模块具有FileUtils类。其deleteDirectory(dir)方法可以用于删除一个目录以及其中的所有子目录和文件。

如果由于任何原因删除失败,此方法将抛出IOException。

//删除一个目录、子目录及其中的所有文件
File file = FileUtils.getFile("c:/temp/innerDir");
FileUtils.deleteDirectory( file );

请使用另一个方法deleteQuitly(dir)以安静地删除。此方法从不抛出异常,它返回true如果目录被删除,否则返回false。

File file = FileUtils.getFile("c:/temp/innerDir");
boolean isDeleted = FileUtils.deleteQuietly( file );

2. 使用Java NIO中的Files.delete()

Java文档中的另一种方法是使用Files.walkFileTree()来迭代给定目录中的所有子目录和文件,并逐个删除它们。

它递归地工作分两步:

  • 首先,它首先删除目录中的所有文件
  • 然后它删除目录本身

这个Java示例使用Files.walkFileTree()方法和SimpleFileVisitor来执行删除操作。

// 递归删除一个目录
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
public class DeleteDirectoryNIO
{
    public static void main(String[] args)
    {
        Path dir = Paths.get("c:/temp/innerDir");
        try
        {
            Files.walkFileTree(dir, new SimpleFileVisitor&lt;Path&gt;()
            {
                  @Override
                  public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                          throws IOException
                  {
                      System.out.println("Deleting the file: " + file);
                      Files.delete(file);
                      return FileVisitResult.CONTINUE;
                  }
                  @Override
                  public FileVisitResult postVisitDirectory(Path dir,
                          IOException exc) throws IOException
                  {
                      System.out.println("Deleting the dir: " + dir);
                      if (exc == null) {
                          Files.delete(dir);
                          return FileVisitResult.CONTINUE;
                      } else {
                          throw exc;
                      }
                   }
                });
        }
        catch (IOException e)
        {
          e.printStackTrace();
        }
    }
}

3.Java 8中删除目录的方法

自Java 8以来,我们可以将Java NIO操作与Java流结合起来,上述方法变得更加简洁。

// Java 8递归删除目录
public class DeleteDirectoryNIOWithStream
{
    public static void main(String[] args)
    {
        Path dir = Paths.get("c:/temp/innerDir");
        Files.walk(dir)
                  .sorted(Comparator.reverseOrder())
                  .map(Path::toFile)
                  .forEach(File::delete);
    }
}

在这里,Files.walk()返回一个路径流,表示目录内容(即文件),先于目录本身。然后它将路径映射为文件并删除每个文件。现在您可以使用delete()方法删除文件本身。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/10216.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】