Файлы и директории, класс 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 предназначен прежде всего для записи двоичных файлов. Его можно использовать для работы с текстовыми файлами, но все же для этой задачи больше подходят другие классы.
Name already in use
java_notes / IO / java.io.File.md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Класс предназначен для манипуляции файлами и каталогами, чтения и установки атрибутов. Файлы можно создавать, удалять, переименовывать и т.п..
Методы анализа файла
| Метод | Описание |
|---|---|
| boolean isDirectory() | Является ли «объект файла» директорией |
| boolean isFile() | Является ли объект файлом |
| Ьoolean isHidden() | Является ли файл скрытым |
| long length() | Возвращает размер/длину файла в байтах. |
| boolean exists() | Возвращает true, если файл с таким именем существует на диске компьютера. |
| String getAbsolutePath() | Возвращает полный путь файла со всеми поддиректориями. |
| String getCanonicalPath() | Возвращает канонический путь файла. Например, преобразовывает путь «c:/dir/dir2/../a.txt» к пути «c:/dir/a.txt» |
| String getName() | Возвращает только имя файла, без пути. |
| String getParent() | Возвращает только путь (директорию) к текущему файлу, без самого имени. |
| File getParentFile() | Возвращает только путь (директорию) к текущему файлу как объект File |
| Метод | Описание |
|---|---|
| boolean createNewFile() | Создает файл. Если такой файл уже был, возвращает false. |
| boolean delete() | Удаляет файл объекта на диске. Если объект – директория, то только, если в ней нет файлов. |
| void deleteOnExit() | Добавляет файл в специальный список файлов, которые будут автоматически удалены при закрытии программы. |
| File createTempFile(String prefix, String suffix, File directory) | Создает «временный файл» — файл с случайно сгенерированным уникальным именем – что-типа «dasd4d53sd». Дополнительные параметры – префикс к имени, суффикс (окончание). Если директория не указана, то файл создается в специальной директории ОС для временных файлов |
| boolean renameTo(File) | Переименовывает файл – содержимое файла фактически получает новое имя. Т.е. можно переименовать файл «c:/dir/a.txt» в «d:/out/text/b.doc». |
| Метод | Описание |
|---|---|
| boolean mkdir() | Создает директорию. Название mkdir происходит от «make directory». |
| boolean mkdirs() | Создает директорию и все поддиректории. |
| String[] list() | Возвращает массив имен файлов, которые содержатся в директории, которой является текущий объект-файл. |
| String[] list(FilenameFilter filter) | возвращает файлы ограниченные filter — функциональный интерфейс boolean accept (File dir, String name) |
| File[] listFiles() | Возвращает массив файлов, которые содержатся в директории, которой является текущий объект-файл. |
| File[] listFiles(FileFilter filter) | FileFilter — функ.интерфейс boolean accept(File pathname) |
| File[] listFiles(FilenameFilter filter) | Возвращает массив файлов, которые содержатся в директории, которой является текущий объект-файл, ограниченные filter |
Вывести на экран список всех файлов, которые находятся в определенной директории
Вывести имена всех файлов, которые есть в той же директории, что и текущий файл
Проверьте, существует ли файл или каталог в Java
В этом кратком руководстве мы познакомимся с различными способами проверки существования файла или каталога.
Сначала мы начнем с современных API-интерфейсов NIO, а затем рассмотрим устаревшие подходы к вводу-выводу.
2. Использование java.nio.file.Files
Чтобы проверить, существует ли файл или каталог, мы можем использовать метод Files.exists (Path) . Как видно из сигнатуры метода, мы должны сначала получить путь к нужному файлу или каталогу. Затем мы можем передать этот путь в метод Files.exists(Path) :
Поскольку файл не существует, он возвращает false . Также стоит упомянуть, что если метод Files.exists(Path) встречает IOException , он также возвращает false .
С другой стороны, когда данный файл существует, он вернет true , как и ожидалось:
Здесь мы создаем временный файл, а затем вызываем метод Files.exists(Path) .
Это работает даже для каталогов :
Если мы специально хотим знать, существует ли файл или каталог, мы также можем использовать методы Files.isDirectory(Path) или Files.isRegularFile(Path) :
Существует также метод notExists(Path) , который возвращает true , если заданный путь не существует:
Иногда Files.exists(Path) возвращает false , потому что у нас нет необходимых прав доступа к файлам . В таких сценариях мы можем использовать метод Files.isReadable(Path) , чтобы убедиться, что файл действительно доступен для чтения текущему пользователю:
2.1. Символические ссылки
По умолчанию метод Files.exists(Path) следует символическим ссылкам . Если файл A имеет символическую ссылку на файл B , то метод Files.exists(A) возвращает значение true тогда и только тогда, когда файл B уже существует:
Теперь, если мы удалим цель ссылки, Files.exists(Path) вернет false :
Поскольку цель ссылки больше не существует, переход по ссылке ни к чему не приведет, а Files.exists(Path) вернет false .
Можно даже не переходить по символическим ссылкам, передав соответствующий LinkOption в качестве второго аргумента:
Поскольку сама ссылка существует, метод Files.exists(Path) возвращает значение true. Кроме того, мы можем проверить, является ли путь символической ссылкой, используя метод Files.isSymbolicLink(Path) :
3. Использование java.io.File
Если мы используем Java 7 или более новую версию Java, настоятельно рекомендуется использовать современные API-интерфейсы Java NIO для таких требований .
Однако, чтобы убедиться, что файл или каталог существует в устаревшем мире ввода-вывода Java, мы можем вызвать метод exists () для экземпляров File :
Если файл или каталог уже существует, он вернет true :
Как показано выше, метод exists() не заботится о том, файл это или каталог. Поэтому, пока он существует, он будет возвращать true .
Однако метод isFile() возвращает true , если указанный путь является существующим файлом:
Точно так же метод isDirectory() возвращает true , если указанный путь является существующим каталогом:
Наконец, метод canRead() возвращает true , если файл доступен для чтения:
Когда он возвращает false , файл либо не существует, либо текущий пользователь не имеет разрешения на чтение файла.
4. Вывод
В этом кратком руководстве мы увидели, как убедиться, что файл или каталог существует в Java. Попутно мы говорили о современном NIO и устаревших API-интерфейсах ввода-вывода. Кроме того, мы увидели, как NIO API обрабатывает символические ссылки.
Проверка, существует ли файл или каталог в Java
Обратите внимание, что! Files.exists(путь) не эквивалентен Files.notExists(путь).
Почему они не эквивалентны? это не идет дальше с точки зрения объяснения. Кто-нибудь знает больше об этом? Спасибо заранее!
5 ответов
- true , если файл не существует или его существование не может быть определено
- false , если файл существует
- true , если файл не существует
- false , если файл существует или его существование не может быть определено
Глядя в исходном коде для различий, они оба делают то же самое с 1 большой разницей. У метода notExist(. ) есть дополнительное исключение, которое можно поймать.
В результате различия заключаются в следующем:
!exists(. ) возвращает файл как несуществующий, если при попытке извлечь файл создается IOException .
notExists(. ) возвращает файл как несуществующий, убедившись в том, что вызывается конкретное IOException subexception NoSuchFileFound и что он не является другим подэлементом на IOException , вызывая не найденный результат
Как видно из Files.exists, результат возврата:
И из Files.notExists результат возврата:
Итак, если !Files.exists(path) return TRUE означает, что он не существует или существование не может быть определено (2 возможности), а для Files.notExists(path) return TRUE означает, что он не существует (всего одна возможность).
Заключение !Files.exists(path) != Files.notExists(path) или 2 possibilities not equals to 1 possibility (см. объяснение выше о возможностях).
Обратите внимание, что этот метод не является дополнением к методу exist. Если невозможно определить, существует ли файл или нет, оба метода возвращают false.
Вы можете просто указать абсолютный путь, если каталог/каталоги не выйдет, он создаст каталог/директории.