Скачать презентацию Механизмы ввода и вывода Лекция 4 3 УНЦ Скачать презентацию Механизмы ввода и вывода Лекция 4 3 УНЦ

Тема4_3_Механизмы ввода и вывода.ppt

  • Количество слайдов: 40

Механизмы ввода и вывода Лекция 4. 3 УНЦ «Инфотех» Воронеж 2012 Механизмы ввода и вывода Лекция 4. 3 УНЦ «Инфотех» Воронеж 2012

План лекции n Потоки данных n Виды потоков и базовые классы n Разновидности потоков План лекции n Потоки данных n Виды потоков и базовые классы n Разновидности потоков n Сериализация 1

Ввод/вывод n Система ввода/вывода не должна зависеть от платформы n Применяется модель потоков данных: Ввод/вывод n Система ввода/вывода не должна зависеть от платформы n Применяется модель потоков данных: упорядоченная последовательность данных, которой соответствует определенный источник (потоки ввода) или получатель (потоки вывода) l Поток ввода ? Поток вывода ? 2

Разновидности потоков Ввод Вывод Байтовые Потоки ввода Потоки вывода Символьные Потоки чтения Потоки записи Разновидности потоков Ввод Вывод Байтовые Потоки ввода Потоки вывода Символьные Потоки чтения Потоки записи 3

Структура пакета java. io Типы общего назначения n Классы разновидностей потоков n Специализированные классы Структура пакета java. io Типы общего назначения n Классы разновидностей потоков n Специализированные классы и интерфейсы для ввода и вывода значений простых типов n Классы и интерфейсы работы с файлами n Классы и интерфейсы механизма сериализации n 4

Разновидности потоков Ввод Байтовые Символьные Вывод Потоки ввода Потоки вывода Input. Stream Output. Stream Разновидности потоков Ввод Байтовые Символьные Вывод Потоки ввода Потоки вывода Input. Stream Output. Stream Потоки чтения Потоки записи Reader Writer Input. Stream, Output. Stream, Reader, Writer – абстрактные классы 5

Класс Input. Stream n abstract int read() throws IOException - читает один байт из Класс Input. Stream n abstract int read() throws IOException - читает один байт из входного потока. Результат int (занимает 4 байта). Прочитанный байт заносится в младший байт результата. n int read(byte[] b) throws IOException - читает последовательность байт из файла. Длина последовательности равна длине массива, заданного в качестве параметра. Может прочесть меньше байт, если чтение достигло конца файла. Возвращает количество прочитанных байтов. n int read(byte[] b, int off, int len) throws IOException – то же, что и предыдущий метод, но заполняет массив с указанного байта и читает не больше, чем указано параметром len. n long skip(long n)throws IOException - пропускает n байт файла. Возвращает количество пропущенных байтов. n int available() throws IOException - возвращает количество байтов, доступных для чтения в настоящий момент. n void close() throws IOException - закрывает источник ввода. Последующие попытки чтения из этого потока приводят к возбуждению IOException. 6

Класс Output. Stream n abstract void write(int b)throws IOException - записывает в поток один Класс Output. Stream n abstract void write(int b)throws IOException - записывает в поток один байт - младший байт числа, заданного параметром b n n void write(byte[] b) throws IOException - записывает в поток массив байт void write(byte[] b, int off, int len) throws IOException - Модификация предыдущего метода, позволяющая задать смещение в массиве и длину записываемой порции n void flush() throws IOException - выталкивает из буфера в поток все, что в нем накоплено n void close()throws IOException - закрывает поток 7

Класс Reader Имеет точно такие же методы, как и класс Input. Stream n int Класс Reader Имеет точно такие же методы, как и класс Input. Stream n int read() throws IOException n abstract int read(char[] b, int off, int len) throws IOException n int read(char[] b) throws IOException n long skip(long n) throws IOException n boolean ready() throws IOException n abstract void close() throws IOException 8

Класс Writer n n n n void write(int ch) throws IOException abstract void write(char[] Класс Writer n n n n void write(int ch) throws IOException abstract void write(char[] b, int off, int len) throws IOException void write(char[] b) throws IOException void write(String str, int off, int len) throws IOException void write(String str) throws IOException abstract void flush() throws IOException abstract void close() throws IOException 9

Особенность n n Потоки: System. out System. in System. err Print. Stream Input. Stream Особенность n n Потоки: System. out System. in System. err Print. Stream Input. Stream Print. Stream Байтового типа (для совместимости с версиями Java 1. 0 и 1. 1) 10

Классы потоков ввода и вывода n Образуют 4 иерархии, в основе которых лежат базовые Классы потоков ввода и вывода n Образуют 4 иерархии, в основе которых лежат базовые абстрактные классы n Имя любого дочернего класса в иерархии имеет суффикс, совпадающий с именем корневого класса n По сути делятся на 2 вида: «Реальные» потоки: источник (получатель) данных реален l Потоки-обертки: источником (получателем) данных является другой поток l 11

Иерархия байтовых потоков Input. Stream Output. Stream Byte. Array. Input. Stream Byte. Array. Output. Иерархия байтовых потоков Input. Stream Output. Stream Byte. Array. Input. Stream Byte. Array. Output. Stream File. Input. Stream File. Output. Stream Filter. Input. Stream Filter. Output. Stream Buffered. Input. Stream Buffered. Output. Stream Data. Input. Stream Data. Output. Stream Pushback. Input. Stream Print. Stream Object. Input. Stream Object. Output. Stream Piped. Input. Stream Piped. Output. Stream Sequence. Input. Stream 12

Иерархия символьных потоков Reader Writer Buffered. Reader Buffered. Writer Line. Number. Reader Char. Array. Иерархия символьных потоков Reader Writer Buffered. Reader Buffered. Writer Line. Number. Reader Char. Array. Writer Char. Array. Reader Filter. Writer Filter. Reader Output. Stream. Writer Pushback. Reader File. Writer Input. Stream. Reader File. Reader Piped. Writer Piped. Input. Stream Print. Writer String. Reader String. Writer 13

Классы-трансляторы n Позволяют читать из байтового как из символьного и записывать в байтовый поток Классы-трансляторы n Позволяют читать из байтового как из символьного и записывать в байтовый поток как в символьный (с учетом кодировки) n Input. Stream. Reader l l n Input. Stream. Reader(Input. Stream in) Input. Stream. Reader(Input. Stream in, String encoding) throws Unsupported. Encoding. Exception Output. Stream. Writer l l Output. Stream. Writer(Output. Stream out) Output. Stream. Writer(Output. Stream out, String encoding) throws Unsupported. Encoding. Exception 14

Группа потоков Filter. Input. Stream, Filter. Reader Filter. Output. Stream, Filtrer. Writer n Обертки, Группа потоков Filter. Input. Stream, Filter. Reader Filter. Output. Stream, Filtrer. Writer n Обертки, позволяют объединять потоки в цепочки для получения сложных потоков n Обладают дополнительными защищенными конструкторами protected Filter. Input. Stream(Input. Stream in) n В наследниках можно переопределять методы чтения/записи 15

Группа потоков Buffered. Input. Stream, Buffered. Reader Buffered. Output. Stream, Buffered. Writer n Обертки, Группа потоков Buffered. Input. Stream, Buffered. Reader Buffered. Output. Stream, Buffered. Writer n Обертки, осуществляют буферизацию данных на программном уровне n Размер буфера можно задать в конструкторе n Символьные версии имеют методы чтения и записи строк 16

Группа потоков Piped. Input. Stream, Piped. Reader Piped. Output. Stream, Piped. Writer n Используются Группа потоков Piped. Input. Stream, Piped. Reader Piped. Output. Stream, Piped. Writer n Используются в виде пар ввода-вывода n Данные, переданные в поток вывода, служат источником для потока ввода n Например, реализуют механизм обмена данными между нитями n Поток-пара задается параметром конструктора либо с помощью метода connect() 17

Группа байтовых потоков Byte. Array. Input. Stream, Byte. Array. Output. Stream n В качестве Группа байтовых потоков Byte. Array. Input. Stream, Byte. Array. Output. Stream n В качестве источника и получателя данных используются массивы байт n В потоке вывода размер буфера может меняться динамически n В потоке вывода существуют методы преобразования: к массиву байт byte[] to. Byte. Array() l к строке String to. String() l вывода в другой поток void write. To(Output. Stream out) l 18

Группы символьных потоков Char. Array и String n Char. Array. Reader и Char. Array. Группы символьных потоков Char. Array и String n Char. Array. Reader и Char. Array. Writer аналогичны Byte. Array. Input. Stream и Byte. Array. Output. Stream, но оперируют с массивом символов n String. Reader и String. Writer имеют аналогичную функциональность, позволяют считывать символы из строки и записывать данные в строковый буфер 19

Группа потоков Print n Обертки Print. Stream и Print. Writer содержат методы, упрощающие задачу Группа потоков Print n Обертки Print. Stream и Print. Writer содержат методы, упрощающие задачу вывода данных простых типов в текстовом виде n Методы print() и println() не выбрасывают исключений n System. out и System. err – единственные потоки Print. Stream 20

Группа байтовых потоков Data n Интерфейсы Data. Input и Data. Output содержат объявления методов Группа байтовых потоков Data n Интерфейсы Data. Input и Data. Output содержат объявления методов ввода и вывода значений простых типов void write. Long(long v), void write. Float(float v) boolean read. Boolean(), String read. UTF() n Обертки Data. Input. Stream и Data. Output. Stream, соответственно, реализуют эти интерфейсы n Класс Random. Access. File реализует оба интерфейса Data и позволяет работать с файлами в режиме произвольного доступа 21

Класс File n Инкапсулирует платформенно-независимые методы работы с файлами и директориями: l l n Класс File n Инкапсулирует платформенно-независимые методы работы с файлами и директориями: l l n создание проверка атрибутов удаление переименование Позволяет создавать временные файлы, удаляемые при завершении работы программы Public static File create. Temp. File(String prefix, String suffix, File directory) throws IOException - создает новый пустой файл в заданном каталоге directory; при выборе имени файла учитываются указанные значения префикса (prefix) и расширения имени, или суффикса, (suffix). При успешном завершении метод возвращает сгенерированное имя файла и гарантирует его уникальность на протяжении текущего сеанса работы 22

Группа потоков File. Input. Stream, File. Reader File. Output. Stream, File. Writer n Позволяют Группа потоков File. Input. Stream, File. Reader File. Output. Stream, File. Writer n Позволяют трактовать файл как поток, предназначенный для ввода и вывода данных n n n Связаны с исключениями File. Not. Found. Exception - при попытке открыть несуществующий файл и Security. Exception - указывает на состояния ошибки, связанные n Конструкторы могут получать параметры: с контрактом безопасности l l l Строку String, задающую имя файла Объект класса File Объект File. Descriptor (возвращается методом get. FD() байтовых потоков) 23

Пример записи текстовый файл import java. io. *; public class Text. Write { public Пример записи текстовый файл import java. io. *; public class Text. Write { public static void main(String[] args) { int[] values = {1, 2, 3, 4, 5}; try { Print. Writer out = new Print. Writer(new Buffered. Writer(new File. Writer("out. txt"))); for (int i = 0; i < values. length; i++) { out. println(values[i]); } out. close(); } catch(IOException e) { System. out. println("Some error occurred!"); } } } out. txt Текстовая форма 1 2 3 4 5 out. txt Байтовая форма 31 0 D 0 A 32 0 D 0 A 33 0 D 0 A 34 0 D 0 A 35 0 D 0 A 24

Пример чтения из текстового файла и из консоли import java. io. *; public class Пример чтения из текстового файла и из консоли import java. io. *; public class Text. Read { public static void main(String[] args) { int[] values = new int[5]; try { Buffered. Reader in = new Buffered. Reader(new File. Reader("in. txt")); //Input. Stream. Reader(System. in)); for (int i = 0; i < values. length; i++) { values[i] = Integer. parse. Int(in. read. Line()); } in. close(); } catch(IOException e) { System. out. println("Some error occurred!"); } } } 25

Пример записи в байтовый файл import java. io. *; public class Byte. Write { Пример записи в байтовый файл import java. io. *; public class Byte. Write { public static void main(String[] args) { int[] values = {1, 2, 3, 4, 5}; try { Data. Output. Stream out = new Data. Output. Stream(new File. Output. Stream("out. bin")); for (int i = 0; i < values. length; i++) { out. write. Int(values[i]); } out. close(); } catch(IOException e) { System. out. println("Some error occurred!"); } } } out. bin Текстовая форма ☺ ☻ ♥ ♦ ♣ out. bin Байтовая форма 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 26

Пример чтения из байтового файла import java. io. *; public class Byte. Read { Пример чтения из байтового файла import java. io. *; public class Byte. Read { public static void main(String[] args) { int[] values = new int[5]; try { Data. Input. Stream in = new Data. Input. Stream(new File. Input. Stream("out. bin")); for (int i = 0; i < values. length; i++) { values[i] = in. read. Int(); } in. close(); } catch(IOException e) { System. out. println("Some error occurred!"); } } } 27

Сериализация объектов Сериализация – процесс преобразования состояния объекта в поток байтов n Процесс сериализации Сериализация объектов Сериализация – процесс преобразования состояния объекта в поток байтов n Процесс сериализации заключается в сериализации каждого поля объекта n Десериализация – восстановление состояния объекта из данных потока n Не все объекты могут быть сериализованы n Класс должен быть подготовлен к сериализации n 28

Группа байтовых потоков Object n Класс Object. Output. Stream реализует сериализацию n Класс Object. Группа байтовых потоков Object n Класс Object. Output. Stream реализует сериализацию n Класс Object. Input. Stream реализует десериализацию n Классы позволяют выводить и вводить графы объектов (включающий в себя все участвующие объекты и ссылки между ними с сохранением структуры). Здесь важно: что если несколько ссылок указывают на один и тот же объект, то этот объект должен быть сериализован лишь однажды, а при восстановлении все ссылки должны вновь указывать на него одного) n Результатом десериализации является объект, равнозначный исходному 29

Пример сериализации в файл import java. io. *; public class Serialization. Write { public Пример сериализации в файл import java. io. *; public class Serialization. Write { public static void main(String[] args) { int[] values = {1, 2, 3, 4, 5}; try { Object. Output. Stream out = new Object. Output. Stream(new File. Output. Stream("out. bin")); out. write. Object(values); out. close(); } catch(IOException e) { System. out. println("Some error occurred!"); } } } out. bin Текстовая форма ┐н ☻[IМє`&vк ♣ur __☻ xp ♣ ☺ ☻ ♥ ♦ ♣ out. bin Байтовая форма AC ED 00 05 75 72 00 02 5 B 49 4 D BA 60 26 76 EA B 2 A 5 02 00 00 78 70 00 05 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 30

Пример десериализации из файла import java. io. *; public class Serialization. Read { public Пример десериализации из файла import java. io. *; public class Serialization. Read { public static void main(String[] args) { int[] values; try { Object. Input. Stream in = new Object. Input. Stream(new File. Input. Stream("out. bin")); values = (int[])in. read. Object(); in. close(); } catch(IOException e) { System. out. println("Some error occurred!"); } catch(Class. Not. Found. Exception e) { System. out. println("Wrong object type"); } } } 31

Подготовка классов к сериализации n Должен реализовываться интерфейс-маркер java. io. Serializable n Все сериализуемые Подготовка классов к сериализации n Должен реализовываться интерфейс-маркер java. io. Serializable n Все сериализуемые поля должны иметь сериализуемый тип n Родительский класс должен иметь конструктор по умолчанию (без параметров) (чтобы его можно было вызвать в процессе десериализации ) l обеспечивать реализацию интерфейса Serializable l n Сериализуются поля объекта, не обозначенные как transient или static 32

Порядок сериализации и десериализации n В нисходящем порядке по древовидной иерархии типов: от первого Порядок сериализации и десериализации n В нисходящем порядке по древовидной иерархии типов: от первого сериализуемого класса до частного типа n Объекты, на которые ссылаются поля, сериализуются в порядке обнаружения n Перед десериализацией выполняется загрузка участвующих классов (возможен выброс исключения Class. Not. Found. Exception) 33

Пример иерархии классов class Class 1 extends Object { private int state 1 = Пример иерархии классов class Class 1 extends Object { private int state 1 = 1; } class Class 2 extends Class 1 implements java. io. Serializable { protected int state 21; private int state 22; public Class 2(int s 1, int s 2) { state 21 = s 1 + 15; state 22 = s 2 - 1; } } class Class 3 extends Class 2 { public int state 3 = 3; } 34

Порядок сериализации Class 3 Object state 3 Class 2 Class 1 Serializable Class 1 Порядок сериализации Class 3 Object state 3 Class 2 Class 1 Serializable Class 1 Class 2 state 21 state 22 state 1 Object Class 3 Сериализованное состояние объекта класса Class 3: (Class 2) state 21 state 22 (Class 3) state 3 35

Порядок десериализации Class 3 Object state 3 Class 2 Class 1 Serializable Class 1 Порядок десериализации Class 3 Object state 3 Class 2 Class 1 Serializable Class 1 Class 2 state 21 state 22 state 1 Object Class 3 Сериализованное состояние объекта класса Class 3: (Class 2) state 21 state 22 (Class 3) state 3 36

Настройка сериализации n Для изменения работы механизма сериализации на уровне вашего класса в самом Настройка сериализации n Для изменения работы механизма сериализации на уровне вашего класса в самом классе надо описать методы: l l n реализация сериализации реализация десериализации private void write. Object(Object. Output. Stream out) throws IOException private void read. Object(Object. Input. Stream in) throws IOException, Class. Not. Found. Exception Виртуальная машина автоматически проверит, объявлены ли эти методы в течении вызова соответствующего метода. Виртуальная машина может вызывать private методы вашего класса когда ей нужно, но другие объекты нет. Целостность класса сохраняется и протокол сериализации может продолжить работу, как обычно. 37

Контроль версий n Каждый класс имеет уникальный идентификатор номера версии – 64 битовое значение Контроль версий n Каждый класс имеет уникальный идентификатор номера версии – 64 битовое значение long n По умолчанию значение рассчитывается как функция от кода класса (включая методы) Несовпадение версий при десериализации объекта выбрасывает исключение Invalid. Class. Exception n n Проблему можно обойти, явно введя в класс поле private static final long serial. Version. UID =. . . ; 38

Спасибо за внимание! Спасибо за внимание!