Рекурсивное удаление каталога в Java

Научитесь использовать классы из Java IO, New IO и Commons IO для удаления каталога, включая все подкаталоги и файлы в нем.

1. Использование FileUtils.deleteDirectory() из Apache Commons IO

Включите модуль Commons IO в проект, используя зависимости Maven.

 <зависимость><groupId>commons-io</groupId><artifactId>commons-io</artifactId><версия>2.11.0</версия></зависимость>

Модуль Commons IO имеет класс FileUtils. Его метод deleteDirectory(dir) можно использовать для удаления каталога вместе со всеми подкаталогами и файлами внутри него.

Этот метод выдает исключение IOException в случае, если удаление по какой-либо причине не удалось.

 Файл file = FileUtils.getFile("c:/temp/innerDir");FileUtils.deleteDirectory(файл);

Используйте другой метод deleteQuitly(dir) для тихого удаления. Этот метод никогда не выдает исключение. Он возвращает true, если каталог был удален, в противном случае false.

 Файл file = FileUtils.getFile("c:/temp/innerDir");boolean isDeleted = FileUtils.deleteQuietly( файл );

2. Использование Files.delete() из Java NIO

Другой подход в документации Java заключается в использовании Files.walkFileTree() для перебора всех подкаталогов и файлов в заданном каталоге и удаления их по одному.

Он работает в два этапа рекурсивно:

  1. Сначала он удаляет все файлы в каталоге, затем
  2. Удаляет сам каталог.

В этом примере Java для выполнения операции удаления используются метод Files.walkFileTree() и SimpleFileVisitor.

импорт java.io.IOException;импорт java.nio.file.FileVisitResult;импорт java.nio.file.Файлы;импорт java.nio.file.Path;импорт java.nio.file.Paths;импорт java.nio.file.SimpleFileVisitor;импорт java.nio.file.attribute.BasicFileAttributes;публичный класс DeleteDirectoryNIO{public static void main(String[] args){Путь dir = Paths.get("c:/temp/innerDir");пытаться{Файлы.walkFileTree(dir, new SimpleFileVisitor<Path>(){@Переопределитьpublic FileVisitResult visitFile(Путь к файлу, BasicFileAttributes attrs)выдает IOException{System.out.println("Удаление файла: " + file);Файлы.удалить(файл);вернуть FileVisitResult.CONTINUE;}@Переопределитьпубличный FileVisitResult postVisitDirectory(Path dir,IOException exc) выдает IOException{System.out.println("Удаление каталога: " + dir);если(искл == ноль) {Файлы.delete(dir);вернуть FileVisitResult.CONTINUE;} еще {бросить отл;}}});}поймать(IOException e){e.printStackTrace();}}}

3. Удаление каталога в Java 8

Начиная с Java 8, мы можем объединить операции Java NIO с потоками Java, и описанный выше подход становится намного чище.

 публичный класс DeleteDirectoryNIOWithStream{public static void main(String[] args){Путь dir = Paths.get("c:/temp/innerDir");Файлы.walk(директория).sorted(Компаратор.reverseOrder()).map(Путь::кФайлу).forEach(Файл::удалить);}}

Здесь Files.walk() возвращает поток путей, обозначающих содержимое каталогов(т.е. файлы) до самих каталогов. После этого он сопоставляет Path с File и удаляет каждый файл. Теперь вы используете метод delete() для удаления самого файла.

Используйте приведенные выше примеры кода всякий раз, когда вам нужно удалить каталог со всеми файлами внутри него.

Исходный код на Github

Прокрутить вверх