学习使用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()方法删除文件本身。