If we use the NIO Files.delete to delete a non-empty directory in Java, it throws DirectoryNotEmptyException; for legacy IO File.delete to delete a non-empty directory, it returns a false. The standard solution is to loop the directory recursively, and delete all its children’s contents first (sub-files or sub-directories), and delete the parent later.
This example shows some common ways to delete a directory in Java.
Files.walkFileTree+FileVisitor(Java 7)Files.walk(Java 8)FileUtils.deleteDirectory(Apache Common IO)- Recursive delete in a directory (Plain Java code)
Directory Structure.
We use Files to create directories and files for testing.
public static void createDummyFiles() throws IOException {
Files.createDirectories(Paths.get("/home/favtuts/test2/test3/test4/test5/"));
Files.write(Paths.get("/home/favtuts/test2/test2.log"), "hello".getBytes());
Files.write(Paths.get("/home/favtuts/test2/test3/test3.log"), "hello".getBytes());
}
Review the directory structure.
$ tree test2
test2
├── test2.log
└── test3
├── test3.log
└── test4
└── test5
Later we will delete the test2 directory, including all its contents (sub-directories or sub-files)
1. Delete Directory – Files.walkFileTree (Java 7)
This example uses the NIO Files.walkFileTree + SimpleFileVisitor to delete a directory. The FileVisitor will visit all the sub-directories and sub-files for a specified path.
DirectoryDelete1.java
package com.favtuts.io.directory;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class DirectoryDelete {
public static void createDummyFiles() throws IOException {
Files.createDirectories(Paths.get("/home/tvt/workspace/favtuts/test2/test3/test4/test5/"));
Files.write(Paths.get("/home/tvt/workspace/favtuts/test2/test2.log"), "hello".getBytes());
Files.write(Paths.get("/home/tvt/workspace/favtuts/test2/test3/test3.log"), "hello".getBytes());
}
public static void main(String[] args) {
String dir = "/home/tvt/workspace/favtuts/test2/";
try {
//createDummyFiles();
deleteDirectoryJava7(dir);
System.out.println("Done");
} catch (IOException e) {
System.err.printf("Failed to delete the directory %n%s%n", e);
}
}
public static void deleteDirectoryJava7(String filePath)
throws IOException {
Path path = Paths.get(filePath);
Files.walkFileTree(path,
new SimpleFileVisitor<>() {
// delete directories or folders
@Override
public FileVisitResult postVisitDirectory(Path dir,
IOException exc)
throws IOException {
Files.delete(dir);
System.out.printf("Directory is deleted : %s%n", dir);
return FileVisitResult.CONTINUE;
}
// delete files
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs)
throws IOException {
Files.delete(file);
System.out.printf("File is deleted : %s%n", file);
return FileVisitResult.CONTINUE;
}
}
);
}
}
Output
File is deleted : /home/tvt/workspace/favtuts/test2/test2.log
File is deleted : /home/tvt/workspace/favtuts/test2/test3/test3.log
Directory is deleted : /home/tvt/workspace/favtuts/test2/test3/test4/test5
Directory is deleted : /home/tvt/workspace/favtuts/test2/test3/test4
Directory is deleted : /home/tvt/workspace/favtuts/test2/test3
Directory is deleted : /home/tvt/workspace/favtuts/test2
Done
2. Delete Directory – Files.walk (Java 8)
This example uses Files.walk to return a Stream<Path> for the directory, and the Stream<Path> contains all sub-directories and sub-files for the specified path.
package com.favtuts.io.directory;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Comparator;
import java.util.stream.Stream;
public class DirectoryDelete {
public static void createDummyFiles() throws IOException {
Files.createDirectories(Paths.get("/home/tvt/workspace/favtuts/test2/test3/test4/test5/"));
Files.write(Paths.get("/home/tvt/workspace/favtuts/test2/test2.log"), "hello".getBytes());
Files.write(Paths.get("/home/tvt/workspace/favtuts/test2/test3/test3.log"), "hello".getBytes());
}
public static void main(String[] args) {
String dir = "/home/tvt/workspace/favtuts/test2/";
try {
createDummyFiles();
deleteDirectoryJava8(dir);
System.out.println("Done");
} catch (IOException e) {
System.err.printf("Failed to delete the directory %n%s%n", e);
}
}
public static void deleteDirectoryJava8(String dir) throws IOException {
Path path = Paths.get(dir);
// read java doc, Files.walk need close the resources
// try-with-resources to ensure that the stream's open directories are closed
try (Stream<Path> walk = Files.walk(path)) {
walk
.sorted(Comparator.reverseOrder())
.forEach(DirectoryDelete::deleteDirectoryJava8Extract);
}
}
// extract method to handle exception in lambda
public static void deleteDirectoryJava8Extract(Path path) {
try {
Files.delete(path);
} catch (IOException e) {
System.err.printf("Unable to delete this path : %s%n%s", path, e);
}
}
}
3. Delete Directory – FileUtils (Common IO)
This example uses the Apache Common IO FileUtils.deleteDirectory to delete a directory.
pom.xml
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
import org.apache.commons.io.FileUtils;
FileUtils.deleteDirectory(new File(dir));
4. Delete Directory – Plain Java Code
This example uses the legacy IO java.io.* and a simple recursive loop algorithm to delete a directory.
public static void deleteDirectoryLegacyIO(File file) {
File[] list = file.listFiles();
if (list != null) {
for (File temp : list) {
//recursive delete
System.out.println("Visit " + temp);
deleteDirectoryLegacyIO(temp);
}
}
if (file.delete()) {
System.out.printf("Delete : %s%n", file);
} else {
System.err.printf("Unable to delete file or directory : %s%n", file);
}
}
Output
Visit /home/tvt/workspace/favtuts/test2/test2.log
Delete : /home/tvt/workspace/favtuts/test2/test2.log
Visit /home/tvt/workspace/favtuts/test2/test3
Visit /home/tvt/workspace/favtuts/test2/test3/test3.log
Delete : /home/tvt/workspace/favtuts/test2/test3/test3.log
Visit /home/tvt/workspace/favtuts/test2/test3/test4
Visit /home/tvt/workspace/favtuts/test2/test3/test4/test5
Delete : /home/tvt/workspace/favtuts/test2/test3/test4/test5
Delete : /home/tvt/workspace/favtuts/test2/test3/test4
Delete : /home/tvt/workspace/favtuts/test2/test3
Delete : /home/tvt/workspace/favtuts/test2
Done
Download Source Code
$ git clone https://github.com/favtuts/java-core-tutorials-examples
$ cd java-io/directory