Проверка существования файла java android

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

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

Автор: David Landup
Дата записи

Вступление

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

Хотя некоторые функции могут создавать новый файл/каталог, если запрошенный не существует, это может быть противоположностью тому, что мы хотим. Если мы хотим добавить дополнительную информацию в существующий файл, а метод выполняется без предупреждения, так как он создает необходимый ему новый файл, мы, возможно, потеряли некоторую информацию, не осознавая этого.

Здесь у нас простая структура:

Там есть file.txt файл и symlink.txt файл. В symlink.txt файл представляет собой символическую ссылку на file.txt .

Аналогично, у нас есть каталог и символическая ссылка на него – directory_link .

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

Для работы с классом Files вам необходимо ознакомиться с классом Path . Файлы принимает только Путь , а не Файл объекты.

Для целей этого урока мы определим Файл и Путь экземпляр для file.txt в нашем каталоге:

Файлы.существует()

Тем не менее, первый способ, которым мы можем проверить, существует ли файл, – это класс Files :

Запуск этого кода даст нам:

Файлы.Не существует()

Возможно, вам будет интересно, почему метод не существует() вообще существует:

Если существует() возвращает истину , это означает, что не существует() должно возвращать ложь . Они логически дополняют друг друга и A = !B , верно?

Ну, вот тут-то многие и ошибаются. Если Files.exists() возвращает false , это не должно означать, что файл не существует.

Это также может означать, что существование файла не может быть проверено . В этом случае оба Files.exists() и Files.notExists() вернут false , поскольку Java не может определить, существует файл или нет.

Обычно это происходит, если у вас есть файл, заблокированный таким образом, что Java не может получить к нему доступ. Представьте, что у нас есть файл, который заблокирован в нашем каталоге – lockedFile.txt :

И если бы мы попытались проверить его существование с помощью:

Нас встретили бы с:

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

Файлы.isRegularFile()

Кроме того, мы можем проверить, является ли файл обычным файлом ( false если это каталог) с помощью метода isRegularFile() :

На выходе получается:

Файл.isFile()

Вместо использования класса Files мы также можем выполнять методы для самих файловых объектов:

Файл.существует()

Аналогично предыдущему варианту, мы можем запустить метод exists() :

И это также возвращает:

Git Essentials

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

Читайте также:  Как зафиксировать экран android

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

Заблокированные Файлы

Забавно отметить, что если вы используете Файл для проверки существования, Java может определить, существует ли заблокированный ранее файл или нет:

Запуск этого фрагмента кода приведет к:

При этом очевидно, что заблокированный файл может быть прочитан с помощью класса File вместо вспомогательного класса Files .

Проверьте, существует ли Каталог

Каталоги-это, по сути, файлы, которые могут содержать другие файлы. Вот почему проверка того, является ли каталог файлом, вернет true . Хотя, если вы проверяете, является ли каталог каталогом (файл особого типа), вы получите более точный результат.

На этот раз мы меняем наше местоположение на:

Файлы.существует()

Опять же, как и в первом примере, мы можем проверить, существует ли он с помощью:

На выходе получается:

Files.isDirectory()

Если бы мы хотели проверить, является ли это конкретным каталогом, мы бы использовали:

И результат таков:

Примечание: Если каталог не существует , метод isDirectory() вернет false . Это связано с тем, как называется метод. Что он делает – он проверяет, существует ли файл и , если это каталог, а не только последний. Файл не может быть каталогом, если он не существует – следовательно, возвращается false .

Проверьте, является ли Файл символической ссылкой

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

Давайте переключим наше местоположение на:

Как обычно, класс Files принимает Путь к файлу:

Запуск этого приведет к:

Файл.getCanonicalPath() против файла.getAbsolutePath()

Другой способ проверить наличие символической ссылки-сравнить результаты канонического пути к файлу и абсолютного пути. Если они разные, то, скорее всего, это символическая ссылка:

Поскольку мы проверяем наличие символической ссылки, и мы знаем, что это так, они должны возвращать другой результат – a symlink.txt и file.txt путь:

Однако здесь это не так. Это связано с тем, что символическая ссылка была создана в Windows с использованием NTFS (Файловая система новой технологии). Символическая ссылка была создана с помощью команды mklink в CMD.

Проверьте, Существует Ли Какой-Либо Из Них

Из предыдущих примеров очевидно, что метод Files.exists() вернет true как для существующих файлов, так и для каталогов. Хотя, это не работает лучше всего, когда дело доходит до заблокированных файлов.

С другой стороны, метод exists() из класса File также вернет true как для файлов, так и для каталогов и сможет прочитать заблокированный файл, который класс Files не может.

Вывод

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

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

После проверки того, существует ли ваш файл или нет, вы, скорее всего, захотите прочитать и записать файлы на Java .

Источник

Как проверить, существует ли файл в Java?

Как проверить, существует ли файл, прежде чем открывать его для чтения на Java? (эквивалент Perl -e $filename ).

Единственный похожий вопрос на SO касается написания файла и, таким образом, ответил с помощью FileWriter, который здесь явно не применим.

Если возможно, я предпочел бы, чтобы настоящий вызов API возвращал true/false, а не какой-то «Call API», чтобы открыть файл и поймать, когда он выдает исключение, которое вы проверяете «нет файла» в тексте «, но я могу жить с последним.

Читайте также:  Андроид авто хендай крета

21 ответ

Я бы рекомендовал использовать isFile() вместо exists() . Большую часть времени вы пытаетесь проверить, указывает ли путь к файлу не только, что он существует. Помните, что exists() вернет true, если ваш путь указывает на каталог.

new File(«C:/»).exists() вернет true, но не позволит вам открывать и читать из него как файл.

Используя nio в Java SE 7,

Если оба существуют и notExists возвращают false, существование файла не может быть проверено. (возможно, нет права доступа к этому пути)

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

Использование Java 8:

Это не приведет к созданию физического файла. Просто создаст объект класса File. Чтобы физически создать файл, вы должны явно его создать:

So f.exists() может использоваться для проверки наличия или отсутствия такого файла.

Вы можете использовать следующее: File.exists()

первый хит для «java файла существует» в google:

Есть несколько способов достичь этого.

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

не делать. Просто поймайте FileNotFoundException. Файловая система должна проверить, существует ли файл в любом случае. Нет смысла делать все это дважды, и несколько причин не делать этого, например:

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

Не пытайтесь угадать систему. Он знает. И не пытайтесь предсказать будущее. В общем, лучший способ проверить, доступен ли какой-либо ресурс, — просто попытаться его использовать.

Источник

Проверка наличия файла или каталога в Java

с этой Java учебник по oracle:

обратите внимание, что !Файлы.exists (путь) не эквивалентен Файлы.notExists(путь).

Почему бы им не быть эквивалентными? она не идет дальше в плане объяснения. Кто-нибудь знает больше об этом? Заранее спасибо!

5 ответов

  • true если файл не существует или его существование не может быть определено
  • false если существует файл
  • true если файл не существует
  • false Если файл существует и его существование не может быть определено

как мы видим из файлы.существует обратный результат:

и файлы.notExists обратный результат:

если !Files.exists(path) возвращение TRUE означает, что он не существует или существование не может быть определено (2 возможности) и Files.notExists(path) возвращение TRUE означает, что он не существует (только 1 возможность).

вывод !Files.exists(path) != Files.notExists(path) или 2 possibilities not equals to 1 possibility (см. объяснение выше про возможности).

глядя в исходном коде на различия, они оба делают то же самое с 1 большой разницей. The notExist(. ) метод имеет дополнительное исключение для перехвата.

в результате различия следующие:

!exists(. ) возвращает файл не существует, если IOException выбрасывается при попытке получить файл.

notExists(. ) возвращает файл как несуществующий, убедившись, что конкретный IOException subexception NoSuchFileFound не выдается, и что он не subexception на IOException вызывая не найден результат

С Oracle docs of notExists .

обратите внимание, что этот метод не является дополнением метода exists. где невозможно определить, существует ли файл или нет, то оба метода возвращают false. .

вы можете просто указать абсолютный путь, если каталог/каталоги не выходит, он создаст каталог/каталоги.

Источник

Файлы и директории, класс File

Класс File пакета java.io используется для управления информацией о файлах и каталогах. На уровне операционной системы файлы и каталоги имеют существенные отличия, но в Java они описываются одним классом File. Каталог в Java трактуется как обычный файл, но с дополнительным свойством — списком имен файлов, который можно просмотреть с помощью метода list.

Читайте также:  Смартфоны андроид с оптической стабилизацией

В зависимости от назначения объект File — файл или каталог, можно использовать один из конструкторов для создания объекта:

Примеры создания объектов File

Свойства и методы класса File

Для определения стандартных свойств файла в классе File имеются различные методы. Однако класс File несимметричен, т.е. методы определения свойств объекта существуют, но соответствующие функции для изменения этих свойств отсутствуют.

Функции Описание
String getName() Наименование файла или каталога.
String getParent() Наименование родительского каталога.
long length() Функция определения размера файла в байтах.
String getAbsolutePath() Функция определения абсолютного пути файла или каталога.
boolean delete() Удаления файла или каталога.
boolean exists() Проверка существования файла или каталога.
boolean isDirectory() Проверка, является ли данный объект каталогом.
boolean isFile() Проверка, является ли данный объект файлом.
long lastModified() Функция определения даты последней модификации файла.
boolean canRead() Проверка, можно ли читать данные из файла.
boolean canWrite() Проверка, можно ли записывать данные в файл.
boolean isHidden() Проверка, являются ли каталог или файл скрытыми.
String[] list() Чтение массива наименований файлов и подкаталогов.
File[] listFiles() Чтение массива файлов и подкаталогов.
boolean mkdir() Создание нового каталога.
boolean renameTo(File dest) Переименовывание файла или каталога.

В следующем примере открываем файл «d:/test/MyFile.txt» (Windows) и извлекаем его характеристики:

В консоли будет отпечатана следующая информация:

Интерфейс FileFilter

Класс File включает метод, позволяющий прочитать список только определенных файлов.

В отличие от одноименного метода, но без параметра, данный метод отбирает только те файлы каталога, которые удовлетворяют определенному условию. Параметр filter предназначен для задания этого условия. При этом тип параметра FileFilter — это не класс, а интерфейс, который имеет всего один метод, возвращающий true, если файл удовлетворяет определенным условиям, и false в противном случае.

Метод listFiles будет вызывать метод accept для каждого файла в каталоге, и те, для которых accept вернет true, будут включены в результирующий список. Остальные будут проигнорированы.

Для использования FileFilter необходимо создать объект и определить в нем соответствующий метод accept.

Пример использования фильтра FileFilter

Чтение содержимого файла FileInputStream

Для чтения содержимого файла можно использовать класс FileInputStream, который является наследником класса InputStream и реализует все его методы. Конструктор класса FileInputStream :

Если файл не может быть открыт то генерируется исключение FileNotFoundException.

Пример считывания данных из файла и вывод содержимого в консоль:

Данные файла можно считать в массив байтов :

Класс FileInputStream предназначен прежде всего для работы с двоичными файлами. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.

Пример использования FileInputStream для чтения файла свойств в кодировке UTF-8:

Файл свойств «data.properties» в кодировке UTF-8:

Запись в файл FileOutputStream

Класс FileOutputStream, является производным от класса OutputStream, поэтому наследует всю его функциональность.

Пример записи строки в файл:

Для создания объекта FileOutputStream используется конструктор, принимающий в качестве параметра путь к файлу для записи. Для записи строки ее сначала переводим в массив байт и с помощью метода write строка записывается в файл. Необязательно записывать весь массив байтов. Используя перегрузку метода write(), можно записать и одиночный байт:

Пример перезаписи содержимого из одного файла в другой:

Класс FileOutputStream предназначен прежде всего для записи двоичных файлов. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.

Источник

Оцените статью