Автор оригинала: Mona Mohamadinia.
1. Обзор
В этом кратком руководстве мы познакомимся с несколькими способами узнать, является ли каталог пустым или нет.
2. Использование Files.newDirectoryStream
Начиная с Java 7, метод Files.newDirectoryStream возвращает DirectoryStream <Путь> для перебора всех записей в каталоге . Таким образом, мы можем использовать этот API, чтобы проверить, является ли данный каталог пустым или нет:
public boolean isEmpty(Path path) throws IOException { if (Files.isDirectory(path)) { try (DirectoryStreamdirectory = 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 (Streamentries = 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 .