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. Конструкторы данного класса представлены на рисунке ниже:

java работа с файлами

Первый конструктор принимает в качестве аргумента путь к целевому файлу в виде строки, а второй – в виде объектного представления. Хотя первый конструктор используется чаще, во втором случае есть возможность изучить свойства файла доступными в классе File методами. При создании экземпляра класса FileInputStream открывает поток ввода для чтения файла.

Конструкторы класса FileOutputStream показаны ниже:

java android

Ситуация похожа на FileInputStream, но он также может принимать логическое значение “append”, которое при true говорит о том, что данные, записываемые в целевой файл будут дописываться к уже имеющимся, а при false – будет идти полная перезапись файла, т.е. старые данные не сохранятся.

Давайте разберем пример с использованием этих классов:

java работа с файлами пример

Поток ввода FileInputStream читает данные из файла file1.txt побайтово при помощи метода read(). Каждый прочитанный байт сохраняется в переменную в целочисленном виде. Далее в теле цикла while эта переменная передается в качестве аргумента методу write экземпляра FileOutputStream, который записывает принятый байт в файл file2.txt. В конце оба потока в обязательном порядке закрываются при помощи метода close.

Классы FileReader и FileWriter

Если вам заведомо известно, что при работе с файлами вы будете иметь дело с текстом, то вместо байтовых потоков имеет смысл использовать символьные. Данные потоки представлены классами FileReader и FileWriter в Java. Работа с файлами при помощи этих классов происходит примерно так же, как и в предыдущем случае. Они являются потомками классов Reader и Writer соответственно, в которых определены основные методы для ввода и вывода данных.

Конструкторы классов FileReader и FileWriter представлены на рисунке ниже:

java работа с файлами и папками

Согласитесь, отличий в семантике по сравнению с байтовыми потоками практически нет. Суть в том, что данные классы предназначены специально для работы с символами в Юникоде, чего не могут делать байтовые потоки. Вот таким образом организована в Java работа с файлами. Пример использования данных классов приведен ниже:

java работа с файлами

Как видите, отличий не наблюдается. Стоит отметить, что хотя потоки символьные, метод read возвращает, а метод write принимает целочисленное значение. Хотя сигнатура метода write предполагает прием аргумента типа int, записывается в поток только младшие 16 бит, поскольку символы в Java представляются именно таким количеством бит.

Заключение

Итак, мы разобрали основные классы для работы с файлами в Java. Стоит отметить, что если вы собираетесь разрабатывать ПО под Java Android, можете смело использовать данный инструментарий.

Статья закончилась. Вопросы остались?
Комментарии 0
Подписаться
Я хочу получать
Правила публикации
Редактирование комментария возможно в течении пяти минут после его создания, либо до момента появления ответа на данный комментарий.