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

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

В этом уроке мы рассмотрим примеры кода о том, как проверить, пуст ли файл или каталог в Java, используя классы File, Files и DirectoryStream.

Автор оригинала: Luka Čupić.

Вступление

В Java работа с файлами и каталогами довольно распространена. Мы также часто интересуемся содержимым этих файлов и каталогов.

В зависимости от содержимого файла мы можем захотеть вести себя по-разному. Возможно, мы записываем некоторые данные в файл, и сначала мы хотим проверить, содержит ли он уже некоторую информацию, прежде чем перезаписывать ее. Аналогично, мы можем захотеть удалить каталог, если он пуст. Знание того, пусто оно или нет, может в таких случаях иметь жизненно важное значение.

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

Проверьте, пуст ли файл в Java

Есть два способа проверить, пуст ли файл |.

Мы будем работать с двумя файлами, одним пустым и одним непустым:

09/17/2020  01:00 PM                 0 file
09/17/2020  01:00 PM                 2 file2

файл является 0 байт в длину, в то время как файл2 равен 2 байт в длину.

Стоит отметить, что перед выполнением каких-либо операций с файлом или каталогом следует проверить , существует ли файл или каталог, а также их тип, чтобы избежать использования неправильных методов.

Использование File.length()

Согласно его документации , объект File является “абстрактным представлением имен файлов и каталогов”. Каждый Файл объект имеет методы для получения информации об этом конкретном файле.

Давайте продолжим и создадим простой вспомогательный метод, который возвращает true , если длина файла равна 0 и ложь в противном случае:

public boolean isFileEmpty(File file) {
    return file.length() == 0;
}

Теперь давайте проверим это на пустом и непустом файле:

File file1 = new File("/file");
File file2 = new File("/file2");

System.out.println(isFileEmpty(file1));
System.out.println(isFileEmpty(file2));

Этот код возвращает:

true
false

Использование BufferedReader

Другой способ проверить, является ли длина файла | 0 или нет - это использовать BufferedReader . Это позволяет нам получать содержимое символов из потоков (например, файлов). Если в файле нет содержимого, он пуст:

public boolean isFileEmpty(File file) {
    BufferedReader br = new BufferedReader(new FileReader(file));     
    return br.readLine() == null;
}

Объявление метода остается таким же, как и раньше: он принимает Файл и возвращает логическое значение . Хотя на этот раз мы создали экземпляр BufferedReader и предоставили ему Файловый редактор , который принимает ваш Файл . Это немного сложнее, чем раньше, но оно выполняет свою работу так же хорошо.

Затем, если BufferedReader не имеет ничего для чтения из файла, мы знаем, что он пуст.

Еще раз, давайте проверим это на пустом и непустом файле:

File file1 = new File("/file");
File file2 = new File("/file2");

System.out.println(isFileEmpty(file1));
System.out.println(isFileEmpty(file2));

Этот код возвращает:

true
false

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

Также есть два способа проверить, пуст ли каталог в Java.

Использование File.list()

Класс File имеет удобный метод для сбора всех файлов и каталогов ( записей , то есть как файлов, так и каталогов) внутри данного каталога. Мы можем использовать этот метод, чтобы проверить, равно ли количество таких записей нулю:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

public boolean isDirectoryEmpty(File directory) {  
    String[] files = directory.list();
    return files.length == 0;  
}

Метод возвращает массив имен записей. Если длина этого массива равна 0 , каталог пуст.

Давайте запустим это в пустом и непустом каталоге:

File directory1 = new File("/empty_directory");
File directory2 = new File("/directory");

System.out.println(isDirectoryEmpty(directory1));
System.out.println(isDirectoryEmpty(directory1));

Это возвращает:

true
false

Использование потока каталогов

Другой быстрый, хотя и более продвинутый, метод включает использование потоков. Сначала мы создаем новый Поток каталогов , вызывая Files.newDirectoryStream() класс. Этот метод принимает Путь , поэтому нам нужно преобразовать наш Файл в Путь , вызвав метод toPath() :

public boolean isDirectoryEmpty(File directory) throws IOException {
    DirectoryStream stream = Files.newDirectoryStream(directory.toPath());
    return !stream.iterator().hasNext();  
}

Затем мы собираем итератор потока и проверяем, содержит ли он следующую запись, вызывая hasNext() . Если в нем нет хотя бы одной записи, каталог пуст.

Давайте запустим этот код:

File directory1 = new File("/empty_directory");
File directory2 = new File("/directory");

System.out.println(isDirectoryEmpty(directory1));
System.out.println(isDirectoryEmpty(directory1));

И это приводит к:

true
false

Вывод

В этом уроке мы привели несколько примеров проверки того, пусты ли файлы и каталоги. Сначала мы проверили, пусты ли файлы, используя класс File и его метод length () , а затем метод BufferedReader .

Затем мы проверили, пуст ли каталог, используя File.list() и создав Поток каталогов .