如何在Java中递归地删除一个目录及其所有子目录和文件
在这篇短文中,你将学习如何递归地删除一个目录及其所有子目录和文件。
有两个例子演示了如何实现这一任务。这两个例子背后的想法是遍历文件树,并在删除目录本身之前删除任何目录中的文件。
递归删除目录 - Java 8+
这个例子使用了 Files.walk(Path)方法,通过以深度优先的方式行走文件树,返回一个由Path对象填充的Stream<Path> 。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Comparator;
public class DeleteDirectoryRecursively {
public static void main(String[] args) throws IOException {
Path dir = Paths.get("java");
// Traverse the file tree in depth-first fashion and delete each file/directory.
Files.walk(dir)
.sorted(Comparator.reverseOrder())
.forEach(path -> {
try {
System.out.println("Deleting: " + path);
Files.delete(path);
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
递归删除目录 - Java 7
下面的例子使用了 Files.walkFileTree(Path, FileVisitor)方法来遍历文件树并为每个文件调用所提供的FileVisitor 。
我们使用一个 SimpleFileVisitor来执行删除操作。
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class DeleteDirectoryRecursively1 {
public static void main(String[] args) throws IOException {
Path dir = Paths.get("java");
// Traverse the file tree and delete each file/directory.
Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("Deleting file: " + file);
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("Deleting dir: " + dir);
if (exc == null) {
Files.delete(dir);
return FileVisitResult.CONTINUE;
} else {
throw exc;
}
}
});
}
}
