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.

  1. Files.walkFileTree + FileVisitor (Java 7)
  2. Files.walk (Java 8)
  3. FileUtils.deleteDirectory (Apache Common IO)
  4. 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

References

Leave a Reply

Your email address will not be published. Required fields are marked *