Если мы используем NIO Файлы.удалить
чтобы удалить непустой каталог в Java, он выбрасывает Исключение DirectoryNotEmptyException
; для устаревшего ввода-вывода File.delete
для удаления непустого каталога возвращает значение false. Стандартное решение состоит в том, чтобы рекурсивно зациклить каталог и сначала удалить все его дочернее содержимое (вложенные файлы или подкаталоги), а затем удалить родительское.
В этом примере показаны некоторые распространенные способы удаления каталога в Java.
Файлы.walkFileTree
+Файловый посетитель
(Java 7)Файлы.прогулка
( Java 8)Файлы.DeleteDirectory
(Общий ввод-вывод Apache)- Рекурсивное удаление в каталоге (простой код Java)
Структура каталогов.
Мы используем Файлы
для создания каталогов и файлов для тестирования.
public static void createDummyFiles() throws IOException { Files.createDirectories(Paths.get("/home/mkyong/test2/test3/test4/test5/")); Files.write(Paths.get("/home/mkyong/test2/test2.log"), "hello".getBytes()); Files.write(Paths.get("/home/mkyong/test2/test3/test3.log"), "hello".getBytes()); }
Просмотрите структуру каталогов.
$ tree test2 test2 ├── test2.log └── test3 ├── test3.log └── test4 └── test5
Позже мы удалим тест2
каталог, включая все его содержимое (подкаталоги или вложенные файлы)
1. Удалить каталог – Файлы.walkFileTree (Java 7)
В этом примере используется дерево NIO Files.walkFileTree
+ SimpleFileVisitor
для удаления каталога. FileVisitor
посетит все подкаталоги и вложенные файлы по указанному пути.
package com.mkyong.io.directory; import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; public class DirectoryDelete1 { public static void createDummyFiles() throws IOException { Files.createDirectories(Paths.get("/home/mkyong/test2/test3/test4/test5/")); Files.write(Paths.get("/home/mkyong/test2/test2.log"), "hello".getBytes()); Files.write(Paths.get("/home/mkyong/test2/test3/test3.log"), "hello".getBytes()); } public static void main(String[] args) { String dir = "/home/mkyong/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; } } ); } }
Выход
File is deleted : /home/mkyong/test2/test2.log Directory is deleted : /home/mkyong/test2/test3/test4/test5 Directory is deleted : /home/mkyong/test2/test3/test4 File is deleted : /home/mkyong/test2/test3/test3.log Directory is deleted : /home/mkyong/test2/test3 Directory is deleted : /home/mkyong/test2 Done
2. Удалите Файлы каталогов.прогулка (Java 8)
В этом примере используется Файлы.перейдите
, чтобы вернуть Stream<Путь>
для каталога, и Stream<Путь>
содержит все подкаталоги и вложенные файлы для указанного пути.
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 (Streamwalk = 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. Удалить каталог – Файлы (Общий ввод-вывод)
В этом примере используются общие файлы ввода-вывода Apache .DeleteDirectory
для удаления каталога.
commons-io commons-io 2.7
import org.apache.commons.io.FileUtils; FileUtils.deleteDirectory(new File(dir));
4. Удалить Каталог – Простой Java-Код
В этом примере используется устаревший ввод-вывод java.io . *
и простой алгоритм рекурсивного цикла для удаления каталога.
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); } }
Выход
Visit /home/mkyong/test2/test2.log Delete : /home/mkyong/test2/test2.log Visit /home/mkyong/test2/test3 Visit /home/mkyong/test2/test3/test4 Visit /home/mkyong/test2/test3/test4/test5 Delete : /home/mkyong/test2/test3/test4/test5 Delete : /home/mkyong/test2/test3/test4 Visit /home/mkyong/test2/test3/test3.log Delete : /home/mkyong/test2/test3/test3.log Delete : /home/mkyong/test2/test3 Delete : /home/mkyong/test2 Done
Скачать Исходный Код
$клон git $клон git
$cd java-ввод-вывод
Рекомендации
Оригинал: “https://mkyong.com/java/how-to-delete-directory-in-java/”