Рубрики
Без рубрики

Как удалить каталог в Java

В этой статье показано, как удалить непустой каталог в Java.

Если мы используем NIO Файлы.удалить чтобы удалить непустой каталог в Java, он выбрасывает Исключение DirectoryNotEmptyException ; для устаревшего ввода-вывода File.delete для удаления непустого каталога возвращает значение false. Стандартное решение состоит в том, чтобы рекурсивно зациклить каталог и сначала удалить все его дочернее содержимое (вложенные файлы или подкаталоги), а затем удалить родительское.

В этом примере показаны некоторые распространенные способы удаления каталога в Java.

  1. Файлы.walkFileTree + Файловый посетитель (Java 7)
  2. Файлы.прогулка ( Java 8)
  3. Файлы.DeleteDirectory (Общий ввод-вывод Apache)
  4. Рекурсивное удаление в каталоге (простой код 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 (Stream 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. Удалить каталог – Файлы (Общий ввод-вывод)

В этом примере используются общие файлы ввода-вывода 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/”