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