- •Ввод-вывод. Сериализация
- •Цели занятия
- •Ввод-вывод
- •Ввод-вывод
- •Ввод-вывод
- •Ввод-вывод
- •Ввод-вывод
- •Байтовые потоки
- •InputStream
- •InputStream
- •InputStream
- •InputStream
- •InputStream
- •InputStream
- •OutputStream
- •OutputStream
- •OutputStream
- •Символьные потоки
- •Reader
- •Reader
- •Reader
- •Различия Reader и InputStream
- •Reader
- •Writer
- •Writer
- •Writer
- •Символьные и стандартные потоки
- •InputStreamReader и
- •InputStreamReader и
- •InputStreamReader и
- •Краткий обзор классов потоков
- •Потоки Filter
- •Потоки Buffered
- •Потоки Buffered
- •Потоки Buffered
- •Потоки Piped
- •Потоки Piped
- •Потоки Piped
- •Байтовые потоки ByteArray
- •Символьные потоки CharArray и
- •Потоки Print
- •Потоки Print
- •Класс StreamTokenizer
- •Класс StreamTokenizer
- •Класс StreamTokenizer
- •Класс StreamTokenizer
- •Байтовые потоки Data. DataInput и
- •Классы потоков Data
- •Классы потоков Data
- •Классы потоков Data
- •Класс File
- •Потоки File
- •Потоки File
- •Сериализация объектов
- •Сериализация объектов
- •Сериализация объектов
- •Подготовка классов к
- •Подготовка классов к
- •Подготовка классов к
- •Порядок сериализации и
- •Порядок сериализации и
- •Порядок сериализации и
- •Порядок сериализации и
- •Порядок сериализации и
- •Порядок сериализации и
- •Настройка механизма
- •Настройка механизма
- •Настройка механизма
- •Настройка механизма
- •Контроль версий объектов
- •Контроль версий объектов
- •Контроль версий объектов
- •Контроль версий объектов
- •Литература
Байтовые потоки Data. DataInput и
DataOutput
51• В интерфейсах DataInput и DataOutput определены методы потокового ввода-вывода данных простых типов, а классы DataInputStream и DataOutputStream обеспечивают реализацию интерфейсов, предлагаемую по умолчанию
•Интерфейсы, предусматривающие потоковый ввод и вывод бинарных данных, обладают почти одинаковой структурой
•Ниже перечислены методы семейств read и write, обеспечивающих ввод и вывод данных каждого из простых типов:
readBoolean (writeBoolean), readChar (writeChar), readByte (writeByte), readShort (writeShort), readInt (writeInt), readLong (writeLong), readFloat (writeFloat), readDouble (writeDouble), readUTF (writeUTF)
•Методы интерфейса DataInput обычно реагируют на событие достижения конца потока, выбрасывая исключение типа EOFException, производного от IOException
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Классы потоков Data
52• Для каждого интерфейса Data существует определённый поток Data
• Кроме того, имеется класс RandomAccessFile, который реализует одновременно оба интерфейса Data – ввода и вывода
•Каждый класс Data является расширением соответствующего класса Filter, так что потоки Data могут использоваться в целях фильтрации данных других потоков
•В составе каждого класса Data есть конструкторы, в качестве параметра принимающие ссылки на
другой подходящий поток ввода или вывода
•Примеры реализации соответствующих методов приведены в примере 4
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Классы потоков Data
53 Пример 4
public static void writeData(double[] data, String file) throws IOException {
OutputStream fout = new FileOutputStream(file);
DataOutputStream out = new DataOutputStream(fout);
out.writeInt(data.length);
for (int i =0; i < data.length; i++) out.writeDouble(data[i]);
out.close();
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Классы потоков Data
54 Пример 4 (продолжение)
public static double[] readData(String file) throws IOException {
InputStream fin = new FileInputStream(file);
DataInputStream in = new DataInputStream(fin);
double[] data = new double[in.readInt()]; for (int i =0; i < data.length; i++)
data[i] = in.readDouble(); in.close();
return data;
}
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Класс File
55• Класс File реализует ряд полезных средств для работы с файлами и директориями: создание, проверка атрибутов, удаление, переименование
•В составе класса File также объявлены методы, которые позволяют создавать временные файлы, используемые, например, для хранения промежуточных результатов и удаляемые при завершении работы программы
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Потоки File
56• Потоковые классы семейства File – FileInputStream, FileOutputStream, FileReader и FileWriter – позволяют трактовать файл как поток, предназначенный для
ввода(чтения) или вывода(записи) данных.
•В составе каждого из типов предусмотрены три конструктора, принимающие в качестве пареметра одно из следующих значений:
строку String, задающую имя файла
объект класса File, указывающий на файл
объект FileDescriptor
•Объект FileDescriptor служит для представления сущности, описывающей открытый файл и определяемой особенностями применяемой операционной системы
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Потоки File
57• Если при использовании байтового или символьного потоков ввода (чтения),
обнаруживается, что файл не существует, выбрасывается исключение типа FileNotFoundException
•При доступе к файлу во всех случаях проверяется наличие соответствующих полномочий: если необходимые права на обращение к файлу отсутствуют, генерируется исключение типа SecurityException
•Два первых конструктора при построении байтового или символьного потоков вывода(записи) предусматривают создание файла, если такого не существует, при наличии файла его содержимое усекается
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Сериализация объектов
58• Одной из существенных возможностей многих реальных приложений является их способность преобразовывать объекты в байтовые потоки, которые
могут передаваться в пределах сети - например, с целью использования в рамках технологии удалённого вызова метода, - сохраняться на диске в виде файлов, а затем при необходимости восстанавливаться в форме «живых» объектов
•Процесс преобразования содержимого объекта в поток байтов принято называть сериализацией объекта, а обратное преобразование – восстановление объекта из данных потока – десериализацией
•Потоки Object – ObjectOutputStream и ObjectInputStream - позволяют осуществлять сериализацию и десериализацию объектов
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Сериализация объектов
59• ObjectInputStream и ObjectOutputStream, помимо данных стандартных классов (простых типов, строк и их массивов) позволяют вводить и выводить графы объектов
•Под термином граф объекта имеется в виду, что когда содержимое объекта выводится в поток ObjectOutputStream средствами методов writeObject(), в потоки сохраняются наборы байтов, представляющие и текущий объект, и все другие объекты, на который тот ссылается
•Поскольку данные об объекте, подвергшимся сериализации, представляются в форме байтов, в семействе потоков Object отсутствуют символьные разновидности Reader и Writer
•Результатом десериализации последовательности байтов, представляющих ранее сериализованный объект, из потока ObjectInputStream с помощью методов readObject служит граф объекта, равнозначный исходному
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
Сериализация объектов
60 Пример 5 // Сериализация
LinkedList ls = new LinkedList();
FileOutputStream fileOut = new FileOutputStream("list");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(ls);
// Десериализация
FileInputStream fileIn = new FileInputStream("list"); ObjectInputStream in = new ObjectInputStream(fileIn); LinkedList ls = (LinkedList) in.readObject();
Все права защищены. www.haulmont.ru info@haulmont.com |
© HAULMONT, 2013 |
