Java如何递归删除目录
学习使用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<Path>() { @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()方法删除文件本身。