Java delete file

In this article, we will take a look at 2 different ways to delete a file in java. At the end, we will also understand how to delete multiple files in a folder and delete files with some particular extension in a directory.

Method 1: Using File.delete()
java.io.File class has a delete() method which deletes a file at the location the file object points to.
delete() returns true, if the file is successfully deleted and false otherwise. Example,

File f = new File("d:\\delete.txt");
if(f.delete()) {
  System.out.print("File deleted");
} else {
  System.out.print("Unable to delete file");
}

If the file object points to a directory, then it must be empty in order to be deleted. If the directory is non-empty, no error will be thrown, but it will not be deleted either.

If the file at the specified path does not exist, there will be no error.
Method 2: Files.delete()
java.nio.file.Files class was added in java 7 and provides static method to deal with files.
This class has a delete() method which accepts an object of java.nio.file.Path as argument and deletes the file at that location. Example,

Path path = Paths.get("d:\\delete.txt");
try {
  Files.delete(path);
} catch(IOException e) {
  e.printStackTrace();
}

delete() method
1. throws IOException and thus, it needs to be surrounded with try-catch block.
2. throws NoSuchFileException if the file does not exist at the given path.
3. throws DirectoryNotEmptyException if the path denotes a directory, which is non-empty at the time of deletion.

Check file exists before deleting
java.nio.file.Files class has a deleteIfExists() method. It is similar to delete() except that it does not throw an error if the file does not exist. Example,

Path path = Paths.get("d:\\delete.txt"); 
try { 
  Files.deleteIfExists(path); 
} catch(IOException e) { 
  e.printStackTrace(); 
}

deleteIfExists() method
1. throws IOException and thus, it needs to be surrounded with try-catch block.
2. throws DirectoryNotEmptyException if the path denotes a directory, which is non-empty at the time of deletion.
Delete files in a directory
java.io.File class has a listFiles() method which returns an array of files in a directory.

To delete all the files in a directory, iterate over this array with a for-each loop as shown below

File dir = new File("d:\\work");
// get files in folder
File[] files = dir.listFiles();
// iterate file list
for(File file : files) {
  file.delete();
}

listFiles() will return an empty array if the directory is empty and null, if the path does not represent a directory.
Delete files with extension
There are two approaches to delete all files in a directory with a certain extension.

1. Check for extension
Get the list of all files with listFiles() method. Iterate over this array and in every iteration, check if the extension of current file matches with the extension that we wish to delete. Example,

File folder = new File("d:\\work");
File[] files = folder.listFiles();
for(File file : files) {
  // check file extension
  if(file.getName().endsWith(".txt")) {
    file.delete();
  }
}

2. Using FileNameFilter
Supply a FileNameFilter to listFiles() method.
FileNameFilter is used to filter file names based on a condition. It is an interface having accept() method which returns a boolean value.

Files for which accept() returns true will be included in the array returned by listFiles(). This means that while iterating over the array, we are not required to check for the extension. Example,

File folder = new File("d:\\work"); 
File[] files = folder.listFiles(new FileNameFilter() {
  @Override
  public boolean accept(File dir, String name) {
    return name.endsWith(".txt");
  }
}); 
for(File file : files) {
  file.delete(); 
}

Note that FileNameFilter is an interface, so it can be implemented as an anonymous inner class as shown in the above example.
accept() method is invoked for every file in listFiles() method. Only the file that satisfies the condition in accept() is added to the result array.

FileNameFilter is a functional interface, meaning that it has only one abstract method. So, entire definition of FileNameFilter can be represented as a java 8 Lambda expression as shown below

File folder = new File("d:\\work"); 
File[] files = folder.listFiles((d, n) -> n.endsWith(".txt")); 
for(File file : files) { 
  file.delete(); 
}

Hope the article was useful.