File это старый способ доступа к файловой системе path это новый рекомендуемый способ
Работа с файлами в Java. Класс File . Основные методы работы
В данной теме расписаны базовые методы класса File , который есть частью системы ввода/вывода Java. Для рассмотренных методов приведены примеры с объяснениями.
Содержание
- 1. Создание экземпляра класса File . Конструкторы класса
- 2. Метод getName() . Получить имя файла или каталога
- 3. Метод getPath() . Получить имя файла
- 4. Метод isAbsolute() . Определить, указан ли полный путь к файлу
- 5. Метод getAbsolutePath() . Получить полный путь к файлу
- 6. Методы canRead() , canWrite() . Определение того, допускает ли файловый объект чтение и запись
- 7. Метод exists() . Определение наличия файла (каталога)
- 8. Метод isDirectory() . Определить, связан ли файловый объект с директорием
- 9. Метод isFile() . Определить, связан ли файловый объект с файлом
- 10. Метод isHidden() . Определить, есть ли файловый объект скрытым
- 11. Метод length() . Определить размер в байтах файла, который связан с файловым объектом
- 12. Метод delete() . Удаление файла
- 13. Метод mkdir() . Создание папки или каталога
- 14. Метод mkdirs() . Создание нескольких вложенных папок
- 15. Метод renameTo() . Переименование файла
- 16. Метод getTotalSpace() . Определение объема диска
- 17. Метод getFreeSpace() . Определить свободное место на диске
- 18. Метод getUsableSpace() . Определение полезного места на диске
Поиск на других ресурсах:
1. Создание экземпляра класса File . Конструкторы класса
В классе File реализованы несколько конструкторов, каждый из которых позволяет формировать имя файла или каталога разными способами.
Наиболее распространенным есть конструктор, который получает строку типа String . В этой строке задается полное (абсолютное) или сокращенное (относительное) имя файла или каталога, который рассматривается (создается, определяется и т.п.).
Также существуют конструкторы, формирующие имя файла из нескольких частей.
Пример.
Результат выполнения программы
2. Метод getName() . Получить имя файла или каталога
Метод getName() возвращает имя файла или каталога, с которым связана файловая переменная. Если абсолютный путь к имени файла (каталога) содержит несколько уровней вложения, то возвращается непосредственно имя этого файла (каталога). Общая форма использования метода следующая
- name – переменная типа String , которая есть результатом выполнения метода;
- fileObj – файловый объект, связанный с файлом или каталогом.
Пример.
- path – строка типа String , что есть именем файла (каталога), которое было задано при создании файловой переменной fileObj .
Пример.
4. Метод isAbsolute() . Определить, указан ли полный путь к файлу
Метод isAbsolute() позволяет определить, указан ли полный путь к файлу при создании файлового объекта в конструкторе класса File . Общая форма использования метода следующая
- res – результат, который равен true , если при создании файловой переменной fileObj был задан абсолютный путь.
Пример.
5. Метод getAbsolutePath() . Получить полный путь к файлу
Метод getAbsolutePath() возвращает полный путь к файлу. Общая форма использования метода следующая
- path – строка типа String , которая есть результатом;
- fileObj – файловый объект, который связан с файлом, для которого нужно определить абсолютный путь.
Пример.
Результат работы программы
7. Метод exists() . Определение наличия файла (каталога)
Метод exists() предназначен для определения существования файла, ассоциированного с файловым объектом. Общая форма использования метода следующая
- res – результат работы метода. Если res = true , то заданный файл существует;
- fileObj – объект, который проверяется.
Пример.
8. Метод isDirectory() . Определить, связан ли файловый объект с директорием
Метод isDirectory() предназначен для определения того, есть ли файл директорием (папкой). Общая форма использования метода следующая
- res – значение типа bool . Если res=true , то файл есть директорием;
- fileObj – файловый объект, который проверяется.
Пример.
9. Метод isFile() . Определить, связан ли файловый объект с файлом
Метод isFile() возвращает true , если файловый объект связан с файлом. Общая форма использования метода следующая
- res – результат вычисления. Если файловый объект есть файлом, то res = true ;
- fileObj – файловый объект.
Пример.
10. Метод isHidden() . Определить, есть ли файловый объект скрытым
- fileObj – файловый объект;
- res – результат работы метода. Если res = true , то файловый объект связан со скрытым файлом.
Пример.
11. Метод length() . Определить размер в байтах файла, который связан с файловым объектом
Метод length() предназначен для определения размера файла и имеет следующую общую форму
Пример.
Результат работы программы
12. Метод delete() . Удаление файла
Метод delete() используется для удаления файла. Общая форма использования метода
- fileObj – файловый объект, который связан с файлом, который нужно удалить;
- res – результат выполнения метода. Если res = true , то удаление файла состоялось успешно.
Пример.
13. Метод mkdir() . Создание папки или каталога
Метод mkdir() используется для создания папки (каталога). Общая форма использования метода следующая
- res – результат типа bool . Если каталог создан успешно, то res = true , в противном случае res = false ;
- fileObj – объект типа File , который связан с именем создаваемого каталога.
Пример. Создается каталог с именем 123 в текущем каталоге.
Результат работы программы
14. Метод mkdirs() . Создание нескольких вложенных папок
Метод mkdirs() позволяет создать несколько уровней вложений папок за один раз. В отличие от метода mkdir() , этот метод создает уровни вложения папок, которые не существуют. В методе mkdir() чтобы создать подпапку нужно, чтобы предварительно обязательно была созданная папка верхнего уровня.
Общая форма использования метода следующая:
- fileObj – файловый объект, который содержит строку с именем или именами папок, которые нужно создать;
- res – результат выполнения метода. Если последовательность папок создана успешно, то res = true .
Пример.
15. Метод renameTo(File). Переименование файла
Метод renameTo() предназначен для переименования файла. Общая форма использования метода следующая
- res – результат выполнения метода. Если файл переименован успешно, то res = true , иначе res = false ;
- f1 – файловая переменная, соответствующая файлу-источнику, который нужно переименовать;
- f2 – файловая переменная, соответствующая новому имени файла-источника f1 после его переименования.
Пример.
16. Метод getTotalSpace() . Определение объема диска
С помощью метода getTotalSpace() можно определить общий размер носителя (диска) в байтах. Метод возвращает результат типа long . Общая форма использования метода следующая
Так делают, например, для того, чтобы получить массив файлов.
File наследуется от object . Ответ: да! Жду комментариев.
Как преобразовать объект File к типу Path ?
Зачем нужен класс Files?
Взяли за основу класс File , добавили в него немного нового, переименовывали методы, а в конце еще и разделили на два. Так что теперь есть два новых класса – Path и Files .
Path – это, фактически новый аналог класса File , а Files – это утилитный класс (по аналогии с классами Arrays & Collections ), в него вынесли все статические методы класса File . Так «правильнее» с точки зрения ООП.M
Немного из документов:
public final class Files
extends Object
This class consists exclusively of static methods that operate on files, directories, or other types of files.
In most cases, the methods defined here will delegate to the associated file system provider to perform the file operations.
Какие классы для архивации вы знаете?
Неплохая статья на эту тему и выдержка из нее: Архивация в Java
Для работы с архивами в спецификации Java существуют два пакета – java.util.zip и java.util.jar соответственно для архивов zip и jar. Различие форматов jar и zip заключается только в расширении архива zip. Пакет java.util.jar аналогичен пакету java.util.zip , за исключением реализации конструкторов и метода voidputNextEntry(ZipEntry e) класса JarOutputStream . Ниже будет рассмотрен только пакет java.util.jar . Чтобы переделать все примеры на использование zip-архива, достаточно всюду в коде заменить Jar на Zip.
Как добавить директорию в архив?
Для себя я понял этот вопрос, как добавление пустой директории в готовый архив. Никаких рабочих примеров я не нашел. Вот код: (Он наглядно показывает, что можно в архив положить любой файл, а вот с пустой директорией… я не знаю как ответить, постить на StackOverFlow не стал, за такой вопрос заминусят точно) Если у кого есть предложения, то напишите.
Вопрос о последней testDir, ее то как раз в получившийся архив JVM не кладет, со всеми остальными txt – файлами норм получается.
Зачем нужны Properties ?
Properties – это файл свойств. Структура его: ключ – значение. Для работы с такими файлами в Java есть класс Properties , он унаследован от HashTable<Object, Object>
Есть статья про манипуляции с ним — Java Properties file examples
В каком виде хранятся данные в файле .properties ?
Можно ли изменять данные в объекте Properties после загрузки их из файла?
Если он унаследован от HashMap , тогда можно, только потом нужно будет изменения в этот файл отписать. Для этого есть метод setProperty .
Зачем нужен класс FileReader ?
public class FileReader
extends InputStreamReader
Convenience class for reading character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream.
FileReader is meant for reading streams of characters.
Класс для чтения символов файлов. Конструкторы этого класса предполагают, что кодировка символов дефолтная и дефолтный размер буфера являются подходящими. Чтобы задать эти значения самостоятельно, следует построить InputStreamReader над FileInputStream . FileReader предназначен для считывания потоков символов.
Зачем нужен класс FileWriter ?
public class FileWriter
extends OutputStreamWriter
Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.
Whether or not a file is available or may be created depends upon the underlying platform. Some platforms, in particular, allow a file to be opened for writing by only one FileWriter (or other file-writing object) at a time. In such situations the constructors in this class will fail if the file involved is already open. FileWriter is meant for writing streams of characters.
Класс для записи символов файлов. Конструкторы этого класса предполагают, что кодировка символов дефолтная и дефолтный размер буфера являются приемлемым. Чтобы задать эти значения самостоятельно, следует построить OutputStreamWriter над FileOutputStream . Является ли файл доступен для записи, зависит от используемой платформы. Некоторые платформы разрешают держать файл для записи только одним FileWriter (или другого объекта записи файла), в одно время. FileWriter предназначен для записи потоков символов. Для написания потоков необработанных байтов, используйте FileOutputStream .
Эти классы ( FileReader и FileWriter ) специально ориентированы для работы с текстом и строками.
За основу данной статьи была взята информация из 9-ой главы книги «Oracle Certified Professional Java SE 7 Programmers Exams 1Z0-804 and 1Z0-805». Она была немного изменена (кое-где обрезана, а кое-где дополнена с помощью Google и Википедии). Здесь показаны далеко не все возможности NIO — для более подробной информации следует обратиться к официальной документации. Приятного прочтения.
Немного терминологии
Интерфейс программирования приложений (иногда интерфейс прикладного программирования) (англ. application programming interface, API) — набор готовых классов, процедур, функций, структур и констант, предоставляемых приложением (библиотекой, сервисом) для использования во внешних программных продуктах.
I/O (input/output, Ввод-вывод ) — взаимодействие между обработчиком информации и её поставщиком и/или получателем. Ввод — сигнал или данные, полученные обработчиком, а вывод — сигнал или данные, посланные им (или из него).
NIO ( /*в контексте Java*/ Non-blocking I/O, New I/O) — коллекция прикладных программных интерфейсов для языка Java, предназначенных для реализации высокопроизводительных операций ввода-вывода. Также встречается аббревиатура NIO.2 – она относится к нововведениям относительно этого направления в Java 7.
Символьная ссылка (Symbolic link, симлинк) — специальный файл в файловой системе, содержащий только текстовую строку с указателем. Эта строка трактуется как путь к файлу, который должен быть открыт при попытке обратиться к данному файлу.
Абсолютный путь — это путь, который указывает на одно и то же место в файловой системе, вне зависимости от текущей директории. Полный путь всегда начинается с корневого каталога.
Относительный путь — это путь по отношению к текущему рабочему каталогу.
Немного истории
Изначально Java предоставляла класс File (в пакете java.io) для доступа к файловым системам. Этот класс представляет файл/каталог в файловой системе и позволяет выполнять такие операции, как проверка на существование файла/каталога, получении свойств, и удаление файла/каталога. Тем не менее, первый вариант API не был достаточен для удовлетворения потребностей разработчиков. Ощущалась явная необходимость доработки I/O API.
Краткий список недостатков первой I/O API:
- Классу File не хватало функциональности. Например не было метода copy для копирования файла/каталога.
- В классе File определено много методов, которые возвращают Boolean-значение. В случае ошибки, возвращалось false, а не бросалось исключение, что затрудняло обнаружение и исправление ошибок.
- Класс File не предоставляет хорошей обработки символьных ссылок.
- Класс File обрабатывает файлы/каталоги неэффективно (проблемы с масштабированием);
- Класс File предоставляет доступ к ограниченному набору атрибутов файлов, который зачастую недостаточен.
Для преодоления этих проблем, в Java 4 введен NIO (New IO). Ключевые особенности NIO:
В Java 7 был введён пакет java.nio.file для лучшей поддержки и обработки символьных ссылок, полного доступа к атрибутам и работы с файловой системой через интерфейсы или классы, такие как Path, Paths, and Files.
Использование интерфейса Path
Java 7 представляет новую абстракцию для пути, а именно интерфейс Path. Он используется в новых функциях и API, по всему NIO.2. Объект пути содержит имена каталогов и файлов, которые составляют полный путь до файла/каталога, представленного объектом Path; Path содержит методы для извлечения элементов пути, манипуляций с ними и их добавления.
Ниже приведён пример кода, для выполнения на Unux-системе, но пользователи Windows могут раскомментировать одну строку и закомментировать другую, для выполнения примера на своих машиах (см. комментарии в коде). Существование соответствующих файлов и катологов (test и testfile.txt) в файловой системе не обязательно. В этом примере создаётся объект Path и извлекается основная информация, связанная с ним:
Вывод получается такой:
- Сначала создаётся объект класса Path, с использованием метода get () класса. Данный метод принимает строку, содержащую путь.
- Обратите внимание на использование управляющего символа '\' в Paths.get("D:\\test\\testfile.txt") для Windows-систем. Без него '\t' будет интерпретироваться как символ табуляции, что приведёт к java.nio.file.InvalidPathException при запуске программы, т.к. символы табуляции не могут содержаться в путях. (На мой взгляд пути Linux-систем более удобны для программистов, т.к. используют символ слэша, не требующий экранирования.)
- Затем происходит извлечение имени файла с использованием метода getFilename() объекта Path
- Далле используется метод getRoot() для получения корневого элемента объекта Path и метод getParent() для получения родительской директории целевого файла.
- В конце данного примера происходит обход елементов пути с помощью цикла foreach. Как альтернативу можно использовать обычный цикл и методы getNameCount() (для получения числа элементов в пути) и getName(index) (для получения элемента по индексу).
Перейдём к другому примеру который включает получение абсолютного пути от относительного пути и нормализацию пути:
- Метод toUri() возвращает URI (путь который может быть открыт из браузера).
- Метод toAbsolutePath() возвращает абсолютный путь от данного относительного пути. В случае, если был введён абсолютный путь, метод вернёт его же.
- Метод normalize() выполняет нормализацию пути, другими словами удаляет ненужные символы (такие как “ . ” и “ .. ”) из объекта Path.
- Метод toRealPath () возвращает абсолютный путь от полученного пути (как toAbsolutePath ()) и нормализует его (как normalize()). Кроме того, если все параметры выбраны правильно, то он может даже работать с символьными ссылками. Однако, для этого метода необходимо, чтобы конечный файл/каталог существовал в файловой системе (это не является обязательным условием для других методов Path).
Пример вывода при выполнении данного кода (файл Test не должен существовать в файловой системе для аналогичного вывода):
(Пользователи Windows-систем получат sun.nio.fs.WindowsException.translateToIOException вместо sun.nio.fs.UnixException.translateToIOException и т. д. и т.п.)
Пример вывода при выполнении данного кода (файл Test должен существовать в файловой системе для аналогичного вывода):
Интерфейс Path содержит два метода для сравнения объектов Path: equals() and compareTo(). Метод equals() сравнивает пути и возвращает Boolean. Метод compareTo() сравнивает пути посимвольно и возвращает: 0, если пути равны; отрицательное целое значение, если путь в объекте вызывающем метод лексикографически меньше пути в объекте, переданном в качестве параметра; положительное целое значение в противоположном случае.
Последний System.out.println является подсказкой — он выводит путь, который должен быть передан в path2 для аналогичного вывода. Вывод должен получится такой:
Использование класса Files
Рассмотрим класс Files (введён в Java 7, находится в пакете java.nio.file), который можно использовать для выполнения различных операций с файлами и каталогами. Files является служебным классом, это означает, что это final-класс с private-конструктором и содержит только статические методы. В этом классе находится множество методов для выполнения различных действий. Рассмотрим некоторые из них.
Выше был показан пример кода, в котором выяснялось, указывают ли два пути на один файл. Сущесвует способ проверить это с помощью метода isSameFile () из класса Files:
Т.к. тут сравниваются файлы, а не пути, то существование соответствующего файла обязательно (см. подсказку для пути в предыдущем примере) иначе будет получена ошибка java.nio.file.NoSuchFileException.
В случае, если файл по указанному адресу существует, получим такой вывод:
Можно определить, имеем мы дело с файлом или директорией (папкой) с помощью метода isDirectory() класса Files и проверить их существование с помощью метода exists():
Вывод должен получится примерно такой (выбирайте пути в соответствии с вашей ОС и расположением файлов):
Интересный вывод можно получить, если написать Path path = Paths.get("/"); для Unix-систем или Path path = Paths.get("С:\\"); для Windows-систем, т.е. если передать в качестве параметра имя корневого котолога:
Для корневого каталога path.getFileName() возвращает null.
Класс Files содержит методы isReadable(), isWriteable() и isExecutable() для проверки возможности чтения, записи и выполнения файлов:
Метод getAttribute() позволяет получить свойства (атрибуты) файла. Метод принимает переменное число параметров: первый — объект Path; второй — имя атрибута; далее от нуля до нескольких значений LinkOption (это enum):
Коппирование файлов
Теперь рассмотрим коппирование файла/диретории. Для этого используем метод Files.copy(). Сигнатура данного метода:
Path copy(Path source, Path target, CopyOption. . . options)
Первый параметр — путь к исходному файлу, второй — путь к тому файлу, что будет создан в результате копирования (включая имя нового файла), далее можно задать параметры копирования,а можно и не задать, как в примере ниже:
После первого запуска всё должно отработать корректно для корректных путей. Но если данный код без изменений скомпилировать и выполнить повторно, то будет получено исключение java.nio.file.FileAlreadyExistsException. Оно связано с тем, что целевой файл уже существует. Для избежания таких проблем можно указать, чтобы в случае его существования он перезаписывался. Для этого надо немного изменить одну строку кода:
Перемещение файла
Метод для перемещения файла очень похож на метод для копирования:
Path move(Path source, Path target, CopyOption. . . options)
Значения передаваемых параметров совпадают по смыслу. Пример кода отличается от предыдущего минимально:
Если при копировании директории содержащиеся в ней файлы и директории не копировались, то при её перемещении, в случае отсутствия ошибок, перемещается и всё содержимое.
Удаление файла
Посмотрим на пример кода:
Несколько моментов, которые необходимо помнить относительно метода Files.delete():
- В случае удаления каталога, необходимо, чтобы он был пустым, иначе будет получено исключение (java.nio.file.DirectoryNotEmptyException)
- Если передать в данный метод символьную ссылку, то будет удалена ссылка, а не целевой файл.
- Для данного метода необходимо, чтобы файл существовал, иначе будет получено исключение (java.nio.file.NoSuchFileException) . Если необходимо игнорировать данные случаи, то лучше подойдёт метод deleteIfExists(), который удаляет файл в случае его существования и не бросает подобное исключение при его отсутствии.
Обход дерева файлов
При работе с файловой системой может возникнуть необходимость обхода дерева файлов, например при поиске файла или копировании каталога со всем его содержимым. Класс Files содержит два метода, позволяющих обходить дерево файлов. Их сигнатуры приведены ниже:
Оба метода принимают путь, с которого начнётся обход дерева и экземпляр типа FileVisitor, который будет определять поведение при обходе дерева. Второй метод имеет два дополнительных параметра: Set, содержащий опции обхода, и максимальную глубину. Максимальная глубина определяет, насколько уровней каталогов будет происходить обход. Если в её качестве указать 0, то будет рассматриваться только указанный файл, а если указать MAX_VALUE, то будут пройдены все подкаталоги.
FileVisitor — это интерфейс, содержащий следующие методы:
- FileVisitResult preVisitDirectory(T dir, BasicFileAttributesattrs) — выполняется перед достуом к элементам каталога.
- FileVisitResult visitFile(T file, BasicFileAttributes attrs) — выполняется при доступе к файлу.
- FileVisitResult postVisitDirectory(T dir, IOException exc) — выполняется, когда все элементы директории пройдены .
- FileVisitResult visitFileFailed(T file, IOException exc) — выполняется, если к файлу нет доступа.
Вам необходимо реализовать интерфейс FileVisitor, чтобы передать соответствующий объект в метод walkFileTree(). Но если необходимости реализовывать все четыре метода этого интерфейса нет, то можно просто расширить реализацию класса SimpleFileVisitor, переопределив лишь необходимые методы.
При выполнении данного кода будут выведены все вложенные каталоги и файлы по указанному пути. Вот что следует понять:
- Объявляется класс MyFileVisitor, унаследованный от SimpleFileVisitor, в котором переопределены два метода: visitFile() (для вывода имени файла) и preVisitDirectory() (для вывода имени директории).
- Вызывается walkFileTree() в который передаётся объект MyFileVisitor.
- Метод walkFileTree() начинает выполнение с переданного в него каталога. При этом вызывается метод visitFile() при каждом проходе файла, preVisitDirectory() — перед просмотром элементов директории, postVisitDirectory() — после просмотра элементов директории, visitFileFailed() — в случае отсутствия доступа к файлу/дириктории.
- Из этих четырёх методов были переопределены только два для вывода имён каталогов и файлов.
- Можно контролировать поток обхода с помощью возвращаемых этими методами значений (enum FileVisitResult). Их четыре:
- CONTINUE: указывает на то, что обход дерева следует продолжить.
- TERMINATE: указывает, что обход нужно немедленно прекратить.
- SKIP_SUBTREE: указывает, что подкаталоги должны быть пропущены для обхода.
- SKIP_SIBLINGS: указывает на то, что обход должен быть остановлен в текущем каталоге и каталогах одного уровня с ним. Если это значение возвращается из preVisitDirectory(), то вложенные файлы/каталоги не обходятся и postVisitDirectory() не срабатывает. Если это значение возвращается из visitFile (), то остальные файлы каталога не обходятся. Если он возвращается из postVisitDirectory (), то остальные каталоги того же уровня не будут обходиться.
Доработка копирования файлов
Возвращаясь к «глупому» копированию каталога в котором что-то есть — используя полученные знания можно реализовать его более логично, относительно результата, ожидаемого пользователем:
В методе preVisitDirectory() происходит копирование посещаемого каталога и аналогично копируется файл в методе visitFile(). Чтобы получить новый путь назначения, используется метод relativize() из класса Path.
Поиск файлов
Поняв принципы обхода дерева файлов, можно легко организовать поиск нужного файла. При поиске конкретного файла/каталога можно проверять соответствие имени файла/каталога с искомым с помощью метода visitFile () или preVisitDirectory (). Однако, если необходимо найти все файлы, соответствующие некоторому шаблону (например, все исходные файлы Java или XML-файлы ), то лучше использовать использовать универсальный символ (glob) или регулярное выражение (regex). Тут пригодится интерфейс PathMatcher. Данный интерфейс реализован для каждой файловой системы и вы можете получить экземпляр этого типа из класса FileSystem используя метод getPathMatcher().
Перед тем, как перейти к примеру стоит пояснить шаблоны Glob (похожи на regex, но немного проще. Если понятие regex для Вас ново, то ближе с ним можно ознакомится здесь — Регулярные выражения в Java). В таблице ниже приведены шаблоны, поддерживаемые glob-синтаксисом:
Шаблон | Описание |
* | Соответствует любой строке любой длины, даже пустой. |
** | Как и *, но выходит за границы каталогов. |
? | Любой одиночный символ. |
[XYZ] | Либо X, либо Y, либо Z. |
4 | Соответствует любому символу от 0 до 5. |
[a–z] | Любой строчный символ латинского алфавита. |
Либо XYZ или ABC. |
Ниже приведён пример кода, который находит все java-файлы в указанном каталоге. Для поиска используется glob-шаблон, но в коментариях приведён regex-шаблон, который можно использовать для этой же цели. Обратите внимание, что в строке с шаблоном сначала указывается его тип (glob или regex), потом ставится доеточие, а потом пишется сам шаблон. Ради интереса можете запустить этот же код убрав первую часть с двоеточием, но сначала просто попробуйте скомпилировать и выполнить:
Отслеживание изменений в каталоге
Предположим, что необходимо написать некое приложение, работающее с файлами (IDE, файловый менеджер или какой-либо редактор). Допустим какой-либо файл, важный для приложения был либо создан, либо изменён, либо удалён из вне и надо сообщить об этом пользователю.
Java 7 предоставляет сервис для слежения за каталогами. Вы можете зарегистрировать в нём каталог, чтобы получать уведомления о любом изменении в каталоге (создание, изменение и удаление файла).
Рассмотрим API этого сервиса на примере. Для этого примера используйте каталог в котором при выполнении программы в бесконечном цикле Вы будете создавать, изменять и удалять файлы — действия должны выводится на консоли. Код ниже:
Пояснения к коду:
- Получение экземпляра WatchService осуществляется через вызов метода newWatchService() из класса FileSystem, который в свою очередь был получен из объекта класса Path через вызов метода getFileSystem(). Но его (экземпляр FileSystem) можно получить и через вызов метода getDefault() из класса FileSystems, т.е. можно заменить watchService = path.getFileSystem().newWatchService();
на
watchService = FileSystems.getDefault().newWatchService(); - Далее происходит регистрация каталога на данном сервисе. Из объекта Path можно вызвать два метода register(), которые различаются принимаемыми параметрами. В нашем случае — это метод принимающий объект сервиса и переменное число параметров, определяющих отслеживаемые события.
- OVERFLOW указывает, что несколько уведомлений о событиях были отброшены или пропущены. ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY соответствуют созданию, редактированию и удалению.
- В цикле происходит ожидание события. Здесь можно использовать три метода для уведомления:
- Метод poll() возвращает ключи очереди, если они есть, в противном случае сразу завершается.
- Метод poll(long, TimeUnit) возвращает ключи очереди, если они есть, в противном случае ждёт указанное число единиц времени.
- Метод take() возвращает ключ очереди, если он доступен, иначе ждёт, пока он не будет доступен.
Основное различие между poll() и take() в том, что poll() это неблокирующий вызов, а take() — блокирующий.
Когда ключ возвращается, то одно или более событий могут быть помещены в очередь, именно поэтому используется ещё один цикл (для перебора всех событий).
Обработка файлов в Java необходима для выполнения различных задач, таких как создание, чтение, запись и т. д. В этой статье я расскажу вам, как создать файл в Java с использованием различных методов.
Поток выполнения Java-программы
Все языки программирования высокого уровня (также называемые третьим поколением) позволяют писать программы на языке, аналогичном (хотя и гораздо более простом), чем естественный язык. Программа высокого уровня называется исходным кодом.
Что такое файл в Java?
При чтении файла в Java мы должны знать класс файлов Java. Класс Java File представляет файлы и имена каталогов в абстрактной манере. Класс File имеет несколько методов для работы с каталогами и файлами, таких как создание новых каталогов или файлов, удаление и переименование каталогов или файлов и т. д. Объект File представляет фактический файл / каталог на диске.
Теперь давайте разберемся с различными методами создания файла.
Методы для создания файла в Java
1. Создайте файл с классом java.io.File
Вам нужно использовать метод File.createNewFile(). Этот метод возвращает логическое значение:
- истина, если файл выполнен.
- false, если файл уже существует или операция по какой-то причине не открывается.
Этот метод также генерирует исключение java.io.IOException, когда он не может создать файл.
Когда мы создаем объект File, передавая имя файла, он может быть с абсолютным путем, или мы можем предоставить только имя файла, или мы можем предоставить относительный путь. Для неабсолютного пути объект File пытается найти файлы в корневом каталоге проекта.
Если мы запустим программу из командной строки, для неабсолютного пути объект File попытается найти файлы из текущего каталога. Экземпляры класса File являются неизменяемыми; то есть, после создания абстрактный путь, представленный объектом File, никогда не изменится.
Теперь давайте рассмотрим небольшой пример и разберемся, как он работает.
Пожалуйста, обратите внимание, что этот метод будет только создавать файл, но не записывать в него никакого содержимого. Теперь давайте двигаться дальше и рассмотрим следующий метод.
2. Создайте файл с классом java.io.FileOutputStream
Если вы хотите создать новый файл и в то же время, если хотите записать в него некоторые данные, вы можете использовать метод записи FileOutputStream. В Java FileOutputStream является классом потока байтов. Чтобы записать данные в файл, вы должны преобразовать данные в байты, а затем сохранить их в файл.
Класс FileOutputStream хранит данные в виде отдельных байтов. Может использоваться для создания текстовых файлов. Файл представляет собой хранилище данных на втором носителе, таком как жесткий диск или компакт-диск. Метод FileOutputStream.write() автоматически создает новый файл и записывает в него содержимое.
public static Path createFile(Path path, FileAttribute<?>. attrs) throws IOException
Создает новый и пустой файл, и если файл уже существует, то будет ошибка.
Далее, давайте посмотрим на создание временного файла.
4. Java также может создавать временные файлы
Создание временного файла в java может потребоваться во многих сценариях, но в основном это происходит во время модульных тестов, где вы не хотите сохранять результаты. Как только тестовый пример закончен, вас не волнует содержимое файла.
Создание временного файла с использованием java.io.File.createTempFile()
с использованием NIO
Для создания временного файла используются следующие два метода.
Вышеуказанный метод принимает четыре аргумента.
Путь -> указать каталог, в котором будет создан файл.
Строка -> чтобы упомянуть префикс имени файла. Используйте ноль, чтобы избежать префикса.
Строка -> чтобы упомянуть суффикс имени файла. т.е. расширение файла. Используйте null, чтобы использовать .tmp в качестве расширения.
attrs -> Это необязательно, чтобы упоминать список атрибутов файла, чтобы установить атомарно при создании файла
Читайте также: