Запись данных в файлы на языке Java
Запись в файл — это поток данных, которым управляют классы выводного потока. На вершине дерева этих классов находится OutputStream, который содержит в себе дочерние классы управлением потока вывода байтов в файлы, консоль, сокеты и другое. Наследниками OutputStream являются следующие классы:
- FileOutputStream (далее OS),
- ObjectOS,
- BufferedOS,
- ByteArrayOS,
- FilterOS,
- DataOS.
Однако в рамках манипуляций с файловыми потоками, а точнее для записи символов, удобнее использовать стек классов из абстрактного класса Writer. Он специально разработан передачи строковых и символьных данных для записи в файлы и другие объекты. Он включает в себя следующие классы: CharArrayWriter, FileWriter, BufferedWriter, FilterWriter.
Запись байтов в файл
Запись байтов в файл осуществляется посредством создания объекта байтового потока класса FileOutputStream. Конструктор объекта предусматривает один параметр, который задает путь к файлу типа String.
Также в качестве пути можно вставить в конструктор объект типа File. Второй параметр не обязателен и является типом boolean. У него есть два значения: true — запись файла продолжается; false — имеющиеся данные в файле обнуляются и запись начинается с начала.
Пример записи строки в файл:
class Example{
public static void Main(){
String t = «Don’t worry! We w’got everything we need.»; \\ Строка для записи в файл
FileOutputStreambyteFlow = new FileOutputStream(«note.txt», false); \\ Создаем объект потока к файлу note.txt
byte[] strToByte = t.getBytes(); \\ перевод строки в байты
byteFlow.write(strToByte); \\ Запись байтов в файл
t.close();
}
}
Задача программы — запись в файл «note.txt», который расположен в папке проекта строки «Don’tworry! Wew’goteverythingweneed.» в байтовом формате:
- Сохраняется в переменную «t» главная строка, которую планируется записать в текстовый файл.
- Открываем файловый поток созданием объекта класса FileOutputStream и ставим ему в качестве первого параметра путь к файлу, второй параметр указывает на то, что файл будет перезаписан.
- Переводим каждый символ строки в числовой формат и сохраняем его в массив символов.
- Записываем числовые байты в файл, которые автоматически конвертируются в символы и становятся первоначальной строкой.
- Закрываем поток.
Здесь есть один вопрос: Зачем записывать текстовые файлы в байтовом формате? Ведь язык Java имеет все необходимое для записи текстовых файлов. Байтовый поток требуется для графических, медиа-файлов. Для текстовых файлов предусмотрены отдельные классы и набор методов.
Класс FileWriter для записи текстовых файлов
FileWriter наследует весь функционал от верхнего в иерархии класса Writer. Конструктор объектов класса FileWriter может получать следующие параметры:
- Объект типа File.
- Строковой путь к файлу с его именем.
- Дескриптор файла типа FileDescriptor.
Второй параметр не обязателен. Его значения true или false, где первый вариант продолжает запись файла, а второй полностью перезаписывает его.
Пример записи текстового файла:
FileWritertxt_file = newFileWriter(C:\\docs\tf.txt, false);
txt_file.write(«Good morning!»);
txt_file.close();
В данном примере мы обошлись без форматирования строки в байты. Метод write(text) просто записывает строку в начало файла, поскольку в конструкторе выставлен параметр его перезаписи. Следует не забывать закрывать файловый поток с помощью метода close(). Это позволит экономно распоряжаться памятью и не перегружать приложение лишними активностями, которые возможно в дальнейшем не будут использоваться.
Если же запись в файл осуществляется посредством события, к примеру нажатием на кнопку, то рекомендуется оставлять поток открытым и закрывать его при выходе из программы.
Методы для записи файлов через байтовый поток
Класс OutputStream передает своим потомкам следующие методы:
- write(byte[] b)- запись массива байтов в файл;
- write(byte[] b, intgoto, intlength) — записывает массив байтов в файл из первого параметра, второй параметр смещает каретку на int ступеней, третий параметр указывает количество записываемых байтов.
- write(intch) — записывает в файл лишь один байт в числовом формате, указанном в единственном параметре.
- close() — закрытие потока и очистка памяти.
- flush() — очистка буфера потока от одного или массива байтов.
Все данные методы ничего не возвращают. Поэтому, их возвращаемое значением по умолчанию является void.
Методы для манипуляций с текстовым потоком
Класс Writer предоставляет несколько методов для дочерних классов:
- write(char[] str) — запись строки в файл по символьно.
- write(Stringstr, intgoto, intlength) — запись строки со смещением каретки на goto символов вперед с ограниченной длиной строки length.
- Writerappend(CharSequencestr) — в конец файла записывается строка str, и возвращается объект Writer.
- close() — закрытие текстового потока.
Заключение
Все дочерние классы OutputStream и Writer наследуют методы своих предков. Следует использовать именно тот тип потока, который отвечает текущей операции. Ведь для записи текстовых файлов предусмотрен более простой функционал, нежели для байтового потока.
Всегда следует закрывать поток, чтобы не перегружать программу, которая будет забирать значительную долю ресурсов на слабых компьютерах. В Java достаточно низкий функционал для манипуляции с файлами. Однако нельзя сказать, что этого недостаточно. Напротив, язык обладает хоть и не гибкими возможностями, но необходимыми.