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

Проверьте, пуст ли каталог в Java

Узнайте, как проверить, является ли каталог пустым в Java.

Автор оригинала: Mona Mohamadinia.

1. Обзор

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

2. Использование Files.newDirectoryStream

Начиная с Java 7, метод Files.newDirectoryStream возвращает DirectoryStream <Путь> для перебора всех записей в каталоге . Таким образом, мы можем использовать этот API, чтобы проверить, является ли данный каталог пустым или нет:

public boolean isEmpty(Path path) throws IOException {
    if (Files.isDirectory(path)) {
        try (DirectoryStream directory = Files.newDirectoryStream(path)) {
            return !directory.iterator().hasNext();
        }
    }

    return false;
}

Для входов, не относящихся к каталогу, мы вернем false , даже не пытаясь загрузить записи каталога:

Path aFile = Paths.get(getClass().getResource("/notDir.txt").toURI());
assertThat(isEmpty(aFile)).isFalse();

С другой стороны, если входные данные являются каталогом, мы попытаемся открыть Поток каталогов в этот каталог. Тогда мы будем считать каталог пустым тогда и только тогда, когда первый вызов метода hasNext() вернет false . В противном случае он не пуст:

Path currentDir = new File("").toPath().toAbsolutePath();
assertThat(isEmpty(currentDir)).isFalse();

Поток Каталогов является Закрываемым ресурсом, поэтому мы помещаем его в блок try-with-resources|/. Как и следовало ожидать, метод isEmpty возвращает true для пустых каталогов:

Path path = Files.createTempDirectory("baeldung-empty");
assertThat(isEmpty(path)).isTrue();

Здесь мы используем Files.createTempDirectory для создания пустого и временного каталога.

3. Использование файлов.список

Начиная с JDK 8, файлы .метод list использует Files.newDirectoryStream API внутренне для предоставления Stream . Каждый Путь является записью внутри данного родительского каталога. Поэтому мы также можем использовать этот API для той же цели:

public boolean isEmpty(Path path) throws IOException {
    if (Files.isDirectory(path)) {
        try (Stream entries = Files.list(path)) {
            return !entries.findFirst().isPresent();
        }
    }
        
    return false;
}

Опять же, мы касаемся только первой записи, используя метод findFirst . Если возвращаемый Необязательный пуст, то каталог тоже пуст.

Поток поддерживается ресурсом ввода-вывода , поэтому мы позаботимся о том, чтобы освободить его соответствующим образом, используя блок try-with-resources.

4. Неэффективные Решения

Оба файла .список и Files.newDirectoryStream будет лениво перебирать записи каталога. Поэтому они будут работать с огромными каталогами очень эффективно . Однако подобные решения не будут хорошо работать в этом сценарии:

public boolean isEmpty(Path path) {
    return path.toFile().listFiles().length == 0;
}

Это будет с нетерпением загружать все записи внутри каталога, что будет довольно неэффективно при работе с огромными каталогами.

5. Заключение

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

Как обычно, все примеры доступны на GitHub .