Научитесь проверять, пуст ли каталог или содержит ли он какие-либо файлы, в Java с помощью API NIO.
1. Использование Files.list()
Files.list(dirPath) возвращает лениво заполненный поток файлов и каталогов(нерекурсивный) по заданному пути. Мы можем использовать метод stream.findAny(), который возвращает пустой Optional, если каталог пуст.
- Если указанный путь не является каталогом, то выдается исключение NotDirectoryException.
- Каталог закрывается путем закрытия потока.
Эта операция findAny(), которая замыкает терминальную операцию, может сделать вывод о результате после выбора любого элемента в потоке, поэтому ей не нужно просматривать весь каталог и его файлы перед принятием решения. Это делает этот подход хорошим решением с эффективной производительностью даже для очень больших каталогов.
Path dirPath = Paths.get("C:/temp");boolean isEmptyDirectory = Files.list(dirPath).findAny().isPresent();
2. Использование DirectoryStream
Поток каталогов позволяет удобно использовать конструкцию for-each для итерации по каталогу.
DirectoryStream открывается при создании и закрывается вызовом метода close(). В качестве альтернативы мы должны использовать оператор try-with-resources, который автоматически закрывает поток после использования.
Используя итератор потока каталога, мы можем вызвать его hasNext(), который проверяет, есть ли в потоке какой-либо элемент файла/каталога. Если каталог пуст, то hasNext() вернет false.
Path dirPath = Paths.get("C:/temp");boolean isEmptyDirectory = false;if(Files.isDirectory(dirPath)) {try(DirectoryStream<Path> dirStream =Files.newDirectoryStream(dirPath)) {isEmptyDirectory = !dirStream.iterator().hasNext();}}
3. Заключение
В этом уроке Java мы изучили несколько проверенных методов проверки того, пуст ли данный каталог или нет. Мы используем ленивое поведение потока для улучшения производительности, которая в противном случае иногда является очень дорогой операцией в случае больших папок.