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