- Java: Проверьте, существует ли файл или каталог
- Вступление
- Проверьте, существует ли файл
- Файлы.существует()
- Файлы.Не существует()
- Файлы.isRegularFile()
- Файл.isFile()
- Файл.существует()
- Git Essentials
- Заблокированные Файлы
- Проверьте, существует ли Каталог
- Файлы.существует()
- Files.isDirectory()
- Проверьте, является ли Файл символической ссылкой
- Файлы.isSymbolicLink()
- Файл.getCanonicalPath() против файла.getAbsolutePath()
- Проверьте, Существует Ли Какой-Либо Из Них
- Вывод
- Как проверить, существует ли файл в Java?
- 21 ответ
- Проверка наличия файла или каталога в Java
- 5 ответов
- Файлы и директории, класс File
- Примеры создания объектов File
- Свойства и методы класса File
- Интерфейс FileFilter
- Пример использования фильтра FileFilter
- Чтение содержимого файла FileInputStream
- Запись в файл FileOutputStream
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 и на самом деле изучите это!
Разница между этими двумя заключается в том, что первый проверяет, является ли это файлом, а другой проверяет, существует ли он. В разных обстоятельствах они дали бы разные результаты.
Заблокированные Файлы
Забавно отметить, что если вы используете Файл для проверки существования, Java может определить, существует ли заблокированный ранее файл или нет:
Запуск этого фрагмента кода приведет к:
При этом очевидно, что заблокированный файл может быть прочитан с помощью класса File вместо вспомогательного класса Files .
Проверьте, существует ли Каталог
Каталоги-это, по сути, файлы, которые могут содержать другие файлы. Вот почему проверка того, является ли каталог файлом, вернет true . Хотя, если вы проверяете, является ли каталог каталогом (файл особого типа), вы получите более точный результат.
На этот раз мы меняем наше местоположение на:
Файлы.существует()
Опять же, как и в первом примере, мы можем проверить, существует ли он с помощью:
На выходе получается:
Files.isDirectory()
Если бы мы хотели проверить, является ли это конкретным каталогом, мы бы использовали:
И результат таков:
Примечание: Если каталог не существует , метод isDirectory() вернет false . Это связано с тем, как называется метод. Что он делает – он проверяет, существует ли файл и , если это каталог, а не только последний. Файл не может быть каталогом, если он не существует – следовательно, возвращается false .
Проверьте, является ли Файл символической ссылкой
Возможно, вы также захотите проверить, является ли файл просто символической ссылкой. В этом случае вы бы использовали класс Files .
Давайте переключим наше местоположение на:
Файлы.isSymbolicLink()
Как обычно, класс 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 предназначен прежде всего для записи двоичных файлов. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.
Источник