Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СТП / lec / java2014-lec-10

.pdf
Скачиваний:
8
Добавлен:
03.03.2016
Размер:
1.29 Mб
Скачать

Необходимость оператора try-with-resources

...

java.nio.charset.Charset

InputStream in = new FilelnputStream(src); try {

OutputStream out = new FileOutputStream(dest); try {

byte[] buf = new byte[8192]; int n;

while ((n = in.read(buf)) >= 0)

// Какое исключение может здесь возникнуть? out.write(buf, 0, n);

}

finally {

out.close(); // А здесь?

}

}

finally {

in.close(); // Или здесь?

}

...

21

Оператор try-with-resources

Таким образом, возникла необходимость в операторе

try с объявлением оного или нескольких ресурсов:

try (BufferedReader br =

new BufferedReader(new FineReader('C:/File.txt' )))

{

// код для извлечения информации из файла

}

Автоматический менеджер ресурсов устраняет

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

для потоков ввода вывода, сокетов и других ресурсов

22

Оператор try-with-resources

Компилятор приводит операторы try-with-resources к

вложенным блокам try-finally c переменными для отслеживания состояния исключения.

Подавленные исключения передаются потомкам с помощью интерфейса Throwable.

Поддержка со стороны API для операторов try-with-resources

заключается в:

новом интерфейсе java.lang.AutoCloseable

новых API, реализующих интерфейс AutoCloseable в

зависимости от особенностей источников данных

(например, JDBC 4.1)

23

Оператор try-with-resources

Код без try-with-resources (JDK 6)

FileReader fileRead = null; BufferedReader bufferRead = null; try {

String fileContent;

fileRead = new FileReader('C:/File.txt') ; bufferRead = new BufferedReader(fileRead);

while ((fileContent = bufferRead.readLine()) != null) { System.out.println(fileContent);}

}

catch (FileNotFoundException e) { // обработка исключения

}

catch (IOException e){ // обработка исключения

}

finally {

if (bufferRead != null){ bufferRead.close(); if (fileRead != null){

fileRead.close(); }

}

}

24

Оператор try-with-resources

Код c оператором try-with-resources

public void readFile() throws IOException { String fileContent = null;

try (BufferedReader bufferRead = new BufferedReader(

new FileReader("C:/File.txt"))) {

while ((fileContent = br.readLine()) != null){ System.out.println(fileContent);

}

}

catch (IOException x) { System.err.format("IOException: %s%n", x);

}

25

Перманентные объекты (персистентность)

Сохранение данных на какое-либо устройство постоянного типа

хранения, называется персистентностью (сохраняемостью).

Объекты, являющиеся сохраняемыми, могут быть сохранены на диске (или на любом другом устройстве хранения), или отправлены для хранения на другую машину.

Несохраняемый объект существует только пока запущена виртуальная машина Java.

Сериализация является стандартным механизмом для сохранения объекта в виде последовательности байтов, которые в дальнейшем могут быть восстановлены в полноценную копию объекта.

Для сериализации объекта определенного класса, класс обязательно должен реализовывать интерфейс java.io.Serializable.

26

Сериализация и объектные графы

При выполнении операции сериализации сохраняются только значения атрибутов объекта.

Если один из атрибутов представляет собой объект, то все атрибуты этого связанного объекта также сохраняются

(если класс объекта является сериализируемым, конечно).

• Дерево всех атрибутов объекта со всеми вложенными

объектами называется объектным графом.

27

Переменные (transient) атрибуты и объекты

Объекты некоторых классов являются несериализируемыми,

потому что они содержат некоторую переменную информацию,

зависящую от разных факторов.

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

сериализация аварийно завершается.

Атрибуты, которые на должны быть сериализируемы или не требуют сериализации, могут быть отмечены ключевым словом transient.

28

Переменные (transient) атрибуты и объекты

public class Portfolio implements Serializable { public transient FilelnputStream inputFile;

//статические поля не сериализируются public static int BASE = 100;

private transient int totalValue = 10;

//сериализация будет включать все элементы protected Stock[] stocks;

}

Модификатор уровня доступа никак не влияет на сериализируемость атрибута.

Значения статических полей не сериализируются.

При десереализации объекта значения статических полей устанавливаются в соответствии со значением в классе.

Значения нестатически несериилизируемых полей сбрасываются в значения по умолчанию для заданного типа.

29

Серийная версия UID

В процессе сериализации номер версии, serialVersionUID,

используется для задания соответствия сериализированных объектов и класса, который был использован в процессе.

При десериализации serialVersionUID проверяется для контроля того,

чтобы загруженные классы соответствовали объектам, которые подлежат десериализации.

Если загруженные классы получателя сериализированных объектов и сами объекты имеют разные значения serialVersionUID, то процесс десериализации выбрасывает исключение InvalidClassException.

Сериализируемый класс может объявлять свой собственный serialVersionUID путем декларации статического неизменяемого атрибута типа long с таким названием:

private static long serialVersionUID = 42L

30

Соседние файлы в папке lec