Разделы презентаций


Механизмы ввода и вывода

Содержание

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

Слайды и текст этой презентации

Слайд 1Механизмы ввода и вывода
© Составление, Будаев Д.С., Гаврилов А.В., 2013
Лекция

5
УНЦ «Инфоком»
Самара
2013

Механизмы  ввода и вывода© Составление, Будаев Д.С., Гаврилов А.В., 2013Лекция 5УНЦ «Инфоком»Самара2013

Слайд 2План лекции
Потоки данных (streams)

Виды потоков и базовые классы

Разновидности потоков

Сериализация

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

Слайд 3Обмен данными
Разнообразие задач
Сетевые приложения
Обработка ввода с клавиатуры
Запись и считывание данных

из файлов
И еще множество других
Выделение системы ввода/вывода
Широкий спектр источников и

получателей
Различные форматы передачи данных
Обмен даннымиРазнообразие задачСетевые приложенияОбработка ввода с клавиатурыЗапись и считывание данных из файловИ еще множество другихВыделение системы ввода/выводаШирокий

Слайд 4Традиционно, проблемы!
Ввод/вывод не должен зависеть от платформы!
Отделение логики однотипных операций

ввода/вывода от низкоуровневых операций
Применяется модель потоков данных:
упорядоченная последовательность данных,
которой соответствует

определенный источник (потоки ввода) или получатель (потоки вывода)
Традиционно, проблемы!Ввод/вывод не должен зависеть от платформы!Отделение логики однотипных операций ввода/вывода от низкоуровневых операцийПрименяется модель потоков данных:упорядоченная

Слайд 5Потоки данных
Представляют собой объекты
Описываются специальными классами
Решают большинство типичных задач ввода/вывода
Базовые

классы работают
с байтовым представлением данных
с символьным представлением данных

Потоки данныхПредставляют собой объектыОписываются специальными классамиРешают большинство типичных задач ввода/выводаБазовые классы работают с байтовым представлением данныхс символьным

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

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

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

для ввода и вывода значений простых типов
Классы и интерфейсы работы

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

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

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

Слайд 9Класс InputStream
abstract int read() throws IOException
int read(byte[] b, int off, int len) throws IOException
int read(byte[] b) throws

IOException
long skip(long n) throws IOException
int available() throws IOException
void close() throws

IOException
Класс InputStreamabstract int read() 			throws IOExceptionint read(byte[] b, int off, int len) 			throws IOExceptionint read(byte[] b) 			throws IOException long skip(long n) 			throws

Слайд 10Класс OutputStream
abstract void write(int b) throws IOException
void write(byte[] b, int off, int len) throws IOException
void

write(byte[] b) throws IOException
void flush() throws IOException
void

close() throws IOException
Класс OutputStreamabstract void write(int b)  			throws IOExceptionvoid write(byte[] b, int off, int len) 			throws IOExceptionvoid write(byte[] b)   			throws IOException

Слайд 11Класс Reader
int read() throws IOException
abstract int read(char[] b, int off, int len) throws

IOException
int read(char[] b) throws IOException
long skip(long n) throws IOException
boolean ready()

throws IOException
abstract void close() throws IOException
Класс Readerint read()  			throws IOExceptionabstract int read(char[] b, int off, int len)  			throws IOExceptionint read(char[] b)  			throws IOException

Слайд 12Класс Writer
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
Класс Writervoid write(int ch)  			throws IOExceptionabstract void write(char[] b, int off, int len)  			throws IOExceptionvoid write(char[] b)   			throws

Слайд 13Классы потоков ввода и вывода
Образуют 4 иерархии, в основе которых

лежат базовые абстрактные классы

Имя любого дочернего класса в иерархии имеет

суффикс, совпадающий с именем корневого класса

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

Слайд 14Иерархия байтовых потоков

Иерархия байтовых потоков

Слайд 15Иерархия символьных потоков

Иерархия символьных потоков

Слайд 16Забавная особенность
Уже знакомые потоки:
System.out
System.in
System.err

Какого они типа?

Байтового!!! (для совместимости с версиями

Java 1.0 и 1.1)
PrintStream
InputStream
PrintStream

Забавная особенностьУже знакомые потоки:		System.out		System.in		System.errКакого они типа?Байтового!!! (для совместимости  с версиями Java 1.0 и 1.1)PrintStreamInputStreamPrintStream

Слайд 17Группа потоков Print
Обертки PrintStream и PrintWriter содержат методы, упрощающие задачу

вывода данных простых типов в текстовом виде

Методы print() и println()

не выбрасывают исключений

System.out и System.err – единственные потоки PrintStream
Группа потоков PrintОбертки PrintStream и PrintWriter содержат методы, упрощающие задачу вывода данных простых типов в текстовом видеМетоды

Слайд 18Группа байтовых потоков ByteArray
ByteArrayInputStream, ByteArrayOutputStream

В качестве источника и получателя данных

используются массивы байт

В потоке вывода размер буфера может меняться динамически

В

потоке вывода существуют методы преобразования:
к массиву байт byte[] toByteArray()
к строке String toString()
вывода в другой поток void writeTo(OutputStream out)
Группа байтовых потоков ByteArrayByteArrayInputStream, ByteArrayOutputStreamВ качестве источника и получателя данных используются массивы байтВ потоке вывода размер буфера

Слайд 19Группа байтовых потоков ByteArray
byte[] bytes = {1, 0, -1};
ByteArrayInputStream in

= new ByteArrayInputStream(bytes);

System.out.println("first element: " + (byte) in.read());
System.out.println("second element: "

+ (byte) in.read());
System.out.println("third element: " + (byte) in.read());

first element: 1
second element: 0
third element: -1

ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(5);
out.write(10);
byte[] bytes = out.toByteArray();

Группа байтовых потоков ByteArraybyte[] bytes = {1, 0, -1};ByteArrayInputStream in = new ByteArrayInputStream(bytes);System.out.println(

Слайд 20Группы символьных потоков CharArray и String
CharArrayReader и CharArrayWriter аналогичны ByteArrayInputStream

и ByteArrayOutputStream, но оперируют с массивом символов

StringReader и StringWriter имеют

аналогичную функциональность, позволяют считывать символы из строки и записывать данные в строковый буфер
Группы символьных потоков CharArray и StringCharArrayReader и CharArrayWriter аналогичны ByteArrayInputStream и ByteArrayOutputStream, но оперируют с массивом символовStringReader

Слайд 21Группа потоков File
FileInputStream, FileReader
FileOutputStream, FileWriter

Позволяют трактовать файл как поток, предназначенный

для ввода и вывода данных

Связаны с исключениями FileNotFoundException и SecurityException

Конструкторы

могут получать параметры:
Строку String, задающую имя файла
Объект класса File
Объект FileDescriptor (возвращается методом getFD() байтовых потоков)
Группа потоков FileFileInputStream, FileReaderFileOutputStream, FileWriterПозволяют трактовать файл как поток, предназначенный для ввода и вывода данныхСвязаны с исключениями

Слайд 22Классы-трансляторы
Позволяют читать из байтового как из символьного и записывать в

байтовый поток как в символьный (с учетом кодировки)

InputStreamReader
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,

String encoding) throws UnsupportedEncodingException

OutputStreamWriter
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out, String encoding) throws UnsupportedEncodingException
Классы-трансляторыПозволяют читать из байтового как из символьного и записывать в байтовый поток как в символьный (с учетом

Слайд 23InputStreamReader и OutputStreamWriter
InputStream inputStream = new FileInputStream("c:\\input.txt");
Reader reader =

new InputStreamReader(inputStream, "UTF-8");

int data = reader.read();
while(data != -1){
char

с = (char) data;
data = reader.read();
}
reader.close();

OutputStream outputStream = new FileOutputStream("c:\\out.txt");
Writer writer = new OutputStreamWriter(outputStream, "UTF-8");

writer.write("The very first line");

writer.close();

InputStreamReader и OutputStreamWriter InputStream inputStream = new FileInputStream(

Слайд 24Группа потоков Filter
FilterInputStream, FilterReader
FilterOutputStream, FiltrerWriter

Обертки, позволяют объединять потоки в цепочки

для получения сложных потоков, обладающих расширенным набором функций

Обладают дополнительными защищенными

конструкторами protected FilterInputStream(InputStream in)

В наследниках обычно переопределяются методы чтения/записи с добавлением новой функциональности
Группа потоков FilterFilterInputStream, FilterReaderFilterOutputStream, FiltrerWriterОбертки, позволяют объединять потоки в цепочки для получения сложных потоков, обладающих расширенным набором

Слайд 25Группа потоков Buffered
BufferedInputStream, BufferedReader
BufferedOutputStream, BufferedWriter

Обертки, осуществляют буферизацию данных на программном

уровне

Размер буфера можно задать в конструкторе

Символьные версии имеют методы чтения

строк и вставки символа новой строки:
readLine(), newLine()
Группа потоков BufferedBufferedInputStream, BufferedReaderBufferedOutputStream, BufferedWriterОбертки, осуществляют буферизацию данных на программном уровнеРазмер буфера можно задать в конструктореСимвольные версии

Слайд 26Группа потоков Buffered
InputStream in = new BufferedInputStream(

new FileInputStream("c:\\in.bin"), 8 * 1024);
OutputStream out

= new BufferedOutputStream(
new FileOutputStream("c:\\out.bin"), 8 * 1024);

Reader input = new BufferedReader(
new FileReader("c:\\in.txt"), 8 * 1024);

Writer writer = new BufferedWriter(
new FileWriter("c:\\out.txt"), 8 * 1024);

BufferedReader input = new BufferedReader(
new InputStreamReader(System.in));
String s = input.readLine();
System.out.println("Input string is: " + s);

Группа потоков BufferedInputStream in = new BufferedInputStream(        new FileInputStream(

Слайд 27Группа потоков Piped
PipedInputStream, PipedReader
PipedOutputStream, PipedWriter

Используются в виде пар ввода-вывода

Данные, переданные

в поток вывода, служат источником для потока ввода

Например, реализуют механизм

обмена данными между нитями

Поток-пара задается параметром конструктора либо с помощью метода connect()
Группа потоков PipedPipedInputStream, PipedReaderPipedOutputStream, PipedWriterИспользуются в виде пар ввода-выводаДанные, переданные в поток вывода, служат источником для потока

Слайд 28Группа потоков Piped
InputStream input = new PipedInputStream(pipedOutputStream);

int data = input.read();
while(data

!= -1) {
doSomethingWithData(data);
data = input.read();
}
input.close();
OutputStream pipedOutputStream = new

PipedOutputStream();

while(moreData) {
int data = getMoreData();
pipedOutputStream.write(data);
}
output.close();
Группа потоков PipedInputStream input = new PipedInputStream(pipedOutputStream);int data = input.read();while(data != -1) { doSomethingWithData(data); data = input.read();}input.close();OutputStream

Слайд 29Класс StreamTokenizer
Не является потоком чтения, но позволяет обрабатывать информацию из

них

Содержит методы лексической обработки текста

Ряд методов предназначен для настройки работы

анализатора

Метод nextToken() производит обработку очередной лексемы, после чего:
Поле ttype содержит константу типа лексемы
Поля nval и sval содержат числовое и строковое представление лексемы
Класс StreamTokenizerНе является потоком чтения, но позволяет обрабатывать информацию из нихСодержит методы лексической обработки текстаРяд методов предназначен

Слайд 30Класс StreamTokenizer
StreamTokenizer tokenizer = new StreamTokenizer(
new StringReader("This is example string"));

while(tokenizer.nextToken()

!= StreamTokenizer.TT_EOF){

if(tokenizer.ttype == StreamTokenizer.TT_WORD) {
System.out.println(tokenizer.sval);
} else if(tokenizer.ttype

== StreamTokenizer.TT_NUMBER) {
System.out.println(tokenizer.nval);
} else if(tokenizer.ttype == StreamTokenizer.TT_EOL) {
System.out.println();
}
}

Слайд 31Группа байтовых потоков Data
Интерфейсы DataInput и DataOutput содержат объявления методов

ввода и вывода значений простых типов void writeLong(long v), void writeFloat(float

v) boolean readBoolean(), String readUTF()

Обертки DataInputStream и DataOutputStream, соответственно, реализуют эти интерфейсы

Класс RandomAccessFile реализует оба интерфейса Data и позволяет работать с файлами в режиме произвольного доступа
Группа байтовых потоков DataИнтерфейсы DataInput и DataOutput содержат объявления методов ввода и вывода значений простых типов void

Слайд 32Группа байтовых потоков Data
DataInputStream input = new DataInputStream(

new FileInputStream("binary.file"));
int byteVal

= input.read();
int intVal = input.readInt();
float floatVal = input.readFloat();
double doubleVal = input.readDouble();
input.close();

DataOutputStream output = new DataOutputStream(
new FileOutputStream("binary.file"));
output.write(10); //byte data
output.writeInt(1000); //int data
output.writeDouble(1000.123); //double data
output.close();

Группа байтовых потоков DataDataInputStream input = new DataInputStream(

Слайд 33Класс File
Инкапсулирует платформенно-независимые методы работы с файлами и директориями:
создание, переименование,

удаление
проверка типа пути: файл или каталог
проверка атрибутов файлов и каталогов
проверка

существования файлов и каталогов
Позволяет создавать временные файлы, удаляемые при завершении работы программы
Определяет доступ лишь к метаданным файловой системы
для чтения или записи используются потоки данных

Класс FileИнкапсулирует платформенно-независимые методы работы с файлами и директориями:создание, переименование, удалениепроверка типа пути: файл или каталогпроверка атрибутов

Слайд 34Класс File
File obj = new File("D:\\data");
if (obj.mkdir() && obj.exists()) {

obj = new File("D:\\data\\file.txt");

if (obj.createNewFile() && obj.exists()) {

File newObj = new File("D:\\data\\newfile.txt");
obj.renameTo(newObj);
System.out.println("Can write is " +
newObj.canWrite() + " for file " + newObj.getPath());
newObj.delete();
}

obj = obj.getParentFile();
obj.delete();
}
Класс FileFile obj = new File(

Слайд 35Пример записи в текстовый файл
import java.io.*;

public class TextWrite {
public

static void main(String[] args) {
int[] values = {1,

2, 3, 4, 5};
try {
PrintWriter out = new PrintWriter(new
BufferedWriter(new FileWriter("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!");
}
}
}

1
2
3
4
5

31 0D 0A
32 0D 0A
33 0D 0A
34 0D 0A
35 0D 0A

out.txt
Текстовая форма

out.txt
Байтовая форма

Пример записи  в текстовый файлimport java.io.*;public class TextWrite { public static void main(String[] args) {

Слайд 36Пример чтения из текстового файла и из консоли
import java.io.*;

public class TextRead

{
public static void main(String[] args) {
int[] values

= new int[5];
try {
BufferedReader in = new BufferedReader(new
FileReader("in.txt")); //InputStreamReader(System.in));
for (int i = 0; i < values.length; i++) {
values[i] = Integer.parseInt(in.readLine());
}
in.close();
}
catch(IOException e) {
System.out.println("Some error occurred!");
}
}
}
Пример чтения из текстового файла и из консолиimport java.io.*;public class TextRead { public static void main(String[] args)

Слайд 37Пример записи в байтовый файл
import java.io.*;

public class ByteWrite {
public

static void main(String[] args) {
int[] values = {1,

2, 3, 4, 5};
try {
DataOutputStream out = new DataOutputStream(new FileOutputStream("out.bin"));
for (int i = 0; i < values.length; i++) {
out.writeInt(values[i]);
}
out.close();
}
catch(IOException e) {
System.out.println("Some error occurred!");
}
}
}

☺ ☻ ♥
♦ ♣

00 00 00 01
00 00 00 02
00 00 00 03
00 00 00 04
00 00 00 05

out.bin
Текстовая форма

out.bin
Байтовая форма

Пример записи  в байтовый файлimport java.io.*;public class ByteWrite { public static void main(String[] args) {

Слайд 38Пример чтения из байтового файла
import java.io.*;

public class ByteRead {
public static

void main(String[] args) {
int[] values = new int[5];

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

Слайд 39Соответствие классов для байтовых и символьных потоков

Соответствие классов для байтовых и символьных потоков

Слайд 40Соответствие классов для байтовых и символьных потоков

Соответствие классов для байтовых и символьных потоков

Слайд 41Сериализация объектов
Сериализация – процесс преобразования состояния объекта в бинарный формат

(например, в файл или поток)
Десериализация – восстановление состояния объекта из

бинарных данных
Не все объекты могут быть сериализованы
Класс должен быть подготовлен к сериализации
Сериализация объектовСериализация – процесс преобразования состояния объекта в бинарный формат (например, в файл или поток)Десериализация – восстановление

Слайд 42Сериализация объектов
Сериализованный объект можно сохранить в файл или передать по

сети
После передачи объект можно восстановить, то есть десериализовать
Сериализацию и десериализацию

можно производить в разных JVM
Широкое применение сериализации при создании распределенных приложений
Сериализация объектовСериализованный объект можно сохранить в файл или передать по сетиПосле передачи объект можно восстановить, то есть

Слайд 43Группа байтовых потоков Object
Класс ObjectOutputStream реализует сериализацию

Класс ObjectInputStream реализует десериализацию

Классы

позволяют выводить и вводить графы объектов с сохранением структуры

Результатом десериализации

является объект, равнозначный исходному
Группа байтовых потоков ObjectКласс ObjectOutputStream реализует сериализациюКласс ObjectInputStream реализует десериализациюКлассы позволяют выводить и вводить графы объектов с

Слайд 44Пример сериализации в файл
import java.io.*;

public class SerializationWrite {
public static

void main(String[] args) {
int[] values = {1, 2,

3, 4, 5};
try {
ObjectOutputStream out = new
ObjectOutputStream(new
FileOutputStream("out.bin"));
out.writeObject(values);
out.close();
}
catch(IOException e) {
System.out.println("Some error occurred!");
}
}
}

AC ED 00 05 75 72 00 02 5B 49 4D BA 60 26 76 EA B2 A5 02 00 00 78 70 00 00 00 05 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05

┐н♣ur☻[IМє`&vк__☻ xp ♣ ☺ ☻ ♥ ♦ ♣

out.bin
Текстовая форма

out.bin
Байтовая форма

Пример сериализации в файлimport java.io.*;public class SerializationWrite { public static void main(String[] args) {  int[] values

Слайд 45Пример десериализации из файла
import java.io.*;
public class SerializationRead {
public static

void main(String[] args) {
int[] values;
try {

ObjectInputStream in = new ObjectInputStream(new
FileInputStream("out.bin"));
values = (int[])in.readObject();
in.close();
}
catch(IOException e) {
System.out.println("Some error occurred!");
}
catch(ClassNotFoundException e) {
System.out.println("Wrong object type");
}
}
}
Пример десериализации  из файлаimport java.io.*;public class SerializationRead { public static void main(String[] args) {  int[]

Слайд 46Сравнение исходного и восстановленного объектов
При сравнении методом equals состояний исходного

и десериализованного объектов ожидается значение true

System.out.println(objSave.equals(objRead));
System.out.println(objSave == objRead);
При непосредственном сравнении

ссылок объектов оператором == результат будет равен значению false
Сравнение исходного и восстановленного объектовПри сравнении методом equals состояний исходного и десериализованного объектов ожидается значение trueSystem.out.println(objSave.equals(objRead));System.out.println(objSave ==

Слайд 47Подготовка классов к сериализации
Должен реализовываться интерфейс-маркер java.io.Serializable

Все сериализуемые поля должны иметь

сериализуемый тип

Родительский класс должен иметь конструктор по умолчанию (без параметров)

или быть подготовленным к сериализации

Сериализуются поля объекта, не обозначенные как transient или static

Подготовка классов к сериализацииДолжен реализовываться интерфейс-маркер java.io.SerializableВсе сериализуемые поля должны иметь сериализуемый типРодительский класс должен иметь конструктор

Слайд 48Порядок сериализации и десериализации
В нисходящем порядке по древовидной иерархии типов:

от первого сериализуемого класса до частного типа

Объекты, на которые ссылаются

поля, сериализуются в порядке обнаружения

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

Слайд 49Пример иерархии классов
class Class1 extends Object {
private int state1

= 1;
public int getState1() { return state1; }
public

void setState1(int s1) { this.state1 = s1; }
}

class Class2 extends Class1 implements Serializable {
protected int state21 = 21;
private int state22 = -1;
public int getState22() { return state22; }
public void setState22(int s22) { this.state22 = s22; }
}

class Class3 extends Class2 {
public int state3 = 3;
}
Пример иерархии классовclass Class1 extends Object { private int state1 = 1; public int getState1() { return

Слайд 50Результаты десериализации
FileOutputStream fos = new FileOutputStream("output.bin");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Class3

c3 = new Class3();
c3.setState1(2); c3.setState22(22);
oos.writeObject(c3);
FileInputStream fis = new FileInputStream("output.bin");
ObjectInputStream ois

= new ObjectInputStream(fis);
Class3 c3Read = (Class3) ois.readObject();
System.out.println("state3: " + c3Read.state3);
System.out.println("state21: " + c3Read.state21);
System.out.println("state22: " + c3Read.getState22());
System.out.println("state1: " + c3Read.getState1());

state3: 3
state21: 21
state22: 22
state1: 1

Результаты десериализацииFileOutputStream fos = new FileOutputStream(

Слайд 51Порядок сериализации
Object
Class1
Class2
Class3
Serializable




Object
Class1
Class2
Class3
state1
state21
state22
state3

Сериализованное состояние объекта класса Class3
Class3:
(Class2)
state21
state22
(Class3)
state3

Порядок сериализацииObjectClass1Class2Class3SerializableObjectClass1Class2Class3state1state21state22state3Сериализованное состояние объекта класса Class3Class3:(Class2)state21state22(Class3)state3

Слайд 52Порядок десериализации
Object
Class1
Class2
Class3
Serializable




Object
Class1
Class2
Class3
state1
state21
state22
state3

Сериализованное состояние объекта класса Class3
Class3:
(Class2)
state21
state22
(Class3)
state3

Порядок десериализацииObjectClass1Class2Class3SerializableObjectClass1Class2Class3state1state21state22state3Сериализованное состояние объекта класса Class3Class3:(Class2)state21state22(Class3)state3

Слайд 53Сериализация связанных объектов
Если сериализуемый объект ссылается на другие объекты, их

необходимо сохранять
Строится граф сериализации, включающий все связанные объекты
Нескольким ссылкам на

один объект соответствует только один объект графа
Если встречен несериализуемый объект, генерируется NotSerializableException
Сериализация  связанных объектовЕсли сериализуемый объект ссылается на другие объекты, их необходимо сохранятьСтроится граф сериализации, включающий все

Слайд 54Настройка сериализации
Для изменения работы механизма сериализации на уровне вашего класса

в нем надо описать методы:
реализация сериализации private void writeObject(ObjectOutputStream out)
throws

IOException
реализация десериализации private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException
Уровень доступа методов позволяет им независимо работать в разных классах в иерархиях наследования
Можно не переписывать чтение/запись полностью, а лишь изменить порядок записи полей и их формат
(методы ObjectOutputStream.writeFields() и ObjectInputStream.readFields())
Настройка сериализацииДля изменения работы механизма сериализации на уровне вашего класса в нем надо описать методы:реализация сериализации 		private

Слайд 55Настройка сериализации
public class ExampleClass implements Serializable {
public transient

int var1 = 111;
private static final ObjectStreamField[] serialPersistentFields

= {
new ObjectStreamField("var1", Integer.TYPE)
};
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException {
ObjectInputStream.GetField fields = in.readFields(); //magic!!!
var1 = fields.get("var1", 0);
}
private void writeObject(ObjectOutputStream out) throws IOException {
ObjectOutputStream.PutField fields = out.putFields(); //magic!!!
fields.put("var1", var1);
out.writeFields();
}
}
Настройка сериализацииpublic class ExampleClass implements Serializable {  public transient int var1 = 111;  private static

Слайд 56Контроль версий
Каждый класс имеет уникальный идентификатор номера версии – 64

битовое значение long
По умолчанию значение рассчитывается как функция от

кода класса (включая методы)
Несовпадение версий при десериализации объекта выбрасывает исключение InvalidClassException
Схему можно обойти, явно введя в класс поле private static final long serialVersionUID = ...;
Контроль версийКаждый класс имеет уникальный идентификатор номера версии – 64 битовое значение long По умолчанию значение рассчитывается

Слайд 57
Спасибо за внимание!

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

Слайд 58Дополнительные источники
Арнолд, К. Язык программирования Java [Текст] / Кен Арнолд,

Джеймс Гослинг, Дэвид Холмс. – М. : Издательский дом «Вильямс»,

2001. – 624 с.
Вязовик, Н.А. Программирование на Java. Курс лекций [Текст] / Н.А. Вязовик. – М. : Интернет-университет информационных технологий, 2003. – 592 с.
Хорстманн, К. Java 2. Библиотека профессионала. Том 1. Основы [Текст] / Кей Хорстманн, Гари Корнелл. – М. : Издательский дом «Вильямс», 2010 г. – 816 с.
Эккель, Б. Философия Java [Текст] / Брюс Эккель. – СПб. : Питер, 2011. – 640 с.
JavaSE at a Glance [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/overview/index.html, дата доступа: 21.10.2011.
JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html, дата доступа: 21.10.2011.
Дополнительные источникиАрнолд, К. Язык программирования Java [Текст] / Кен Арнолд, Джеймс Гослинг, Дэвид Холмс. – М. :

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика