Java: работа с файлами - запись, чтение, удаление
Java имеет множество инструментов для работы с файлами, поскольку они служат хранилищем данных во многих программах. Особенно часто доступ к файлам требуется в Java Android. Все классы для работы с файлами расположены в пакете java.io, где также хранятся классы для работы с потоками ввода и вывода. Строго говоря, в Java работа с файлами происходит преимущественно через байтовые и символьные потоки ввода-вывода. Исключением в данном случае является класс File. С него и начнем.
Класс File Java - работа с файлами
Класс File взаимодействует непосредственно с файлами и файловой системой. Экземпляр данного класса используется, прежде всего, для доступа к свойствам файла и перемещения по иерархии подкаталогов. В нем не определены способы извлечения и сохранения данных в файл, но с помощью этого класса можно получить множество сведений о самом файле: дата, время, права доступа и путь к каталогу. По сути, класс File является объектной интерпретацией файла или каталога в Java.
Чтобы создать экземпляр класса File, используют один из его конструкторов: File(String путь к папке, String имя файла).
Рассмотрим основные методы данного класса, позволяющие получать сведения о файле или каталоге:
- getName() – возвращает имя файла;
- exists() – возвращает логическое значение true, если файл существует, или false в обратном случае;
- isFile() – определяет, указывает ли объект на файл, возвращая соответствующее логическое значение;
- isDirectory() – возвращает true, если это папка;
- canWrite() – возвращает true, если файл доступен для записи;
- canRead() – возвращает true, если файл доступен для чтения;
- setReadOnly() – делает файл доступным только для чтения;
- length() – возвращает размер файла в байтах;
- renameTo(File новое имя) – переименовывает текущий файл в соответствии с переданным аргументом. Возвращает true, если операция успешна;
- delete() – удаляет файл или папку (если она пуста), на который указывает вызывающий объект;
- list() – извлекает список имен объектов, хранящихся в данном каталоге, в виде массива строк (применим исключительно к каталогам).
Таким образом, с помощью класса File обеспечивается в Java работа с файлами и папками.
Работа с файлами посредством классов FileInputStream и FileOutputStream
Ранее мы упоминали, что в Java работа с файлами осуществляется преимущественно посредством потоков ввода-вывода. Байтовые потоки для работы с файлами представлены в виде классов FileInputStream и FileOutputStream. Эти классы являются наследниками базовых абстрактных классов InputStream и OutputStream соответственно, поэтому методы этих классов доступны для работы с файлами.
Рассмотрим сначала FileInputStream. Конструкторы данного класса представлены на рисунке ниже:
Первый конструктор принимает в качестве аргумента путь к целевому файлу в виде строки, а второй – в виде объектного представления. Хотя первый конструктор используется чаще, во втором случае есть возможность изучить свойства файла доступными в классе File методами. При создании экземпляра класса FileInputStream открывает поток ввода для чтения файла.
Конструкторы класса FileOutputStream показаны ниже:
Ситуация похожа на FileInputStream, но он также может принимать логическое значение “append”, которое при true говорит о том, что данные, записываемые в целевой файл будут дописываться к уже имеющимся, а при false – будет идти полная перезапись файла, т.е. старые данные не сохранятся.
Давайте разберем пример с использованием этих классов:
Поток ввода FileInputStream читает данные из файла file1.txt побайтово при помощи метода read(). Каждый прочитанный байт сохраняется в переменную в целочисленном виде. Далее в теле цикла while эта переменная передается в качестве аргумента методу write экземпляра FileOutputStream, который записывает принятый байт в файл file2.txt. В конце оба потока в обязательном порядке закрываются при помощи метода close.
Классы FileReader и FileWriter
Если вам заведомо известно, что при работе с файлами вы будете иметь дело с текстом, то вместо байтовых потоков имеет смысл использовать символьные. Данные потоки представлены классами FileReader и FileWriter в Java. Работа с файлами при помощи этих классов происходит примерно так же, как и в предыдущем случае. Они являются потомками классов Reader и Writer соответственно, в которых определены основные методы для ввода и вывода данных.
Конструкторы классов FileReader и FileWriter представлены на рисунке ниже:
Согласитесь, отличий в семантике по сравнению с байтовыми потоками практически нет. Суть в том, что данные классы предназначены специально для работы с символами в Юникоде, чего не могут делать байтовые потоки. Вот таким образом организована в Java работа с файлами. Пример использования данных классов приведен ниже:
Как видите, отличий не наблюдается. Стоит отметить, что хотя потоки символьные, метод read возвращает, а метод write принимает целочисленное значение. Хотя сигнатура метода write предполагает прием аргумента типа int, записывается в поток только младшие 16 бит, поскольку символы в Java представляются именно таким количеством бит.
Заключение
Итак, мы разобрали основные классы для работы с файлами в Java. Стоит отметить, что если вы собираетесь разрабатывать ПО под Java Android, можете смело использовать данный инструментарий.