Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Готовые отчеты (2020) / Java. Лабораторная работа 4

.pdf
Скачиваний:
58
Добавлен:
29.01.2021
Размер:
540.96 Кб
Скачать

public double get(int i) throws VectorIndexOutOfBoundsException { if (i >= 0 && i < data.length) {

return data[i];

}

throw new VectorIndexOutOfBoundsException("VectorIndexOutOfBoundsException", i);

}

// Установка значения элемента по индексу public void set(int i, double value) throws

VectorIndexOutOfBoundsException {

if (i >= 0 && i < data.length) { data[i] = value;

return;

}

throw new VectorIndexOutOfBoundsException("VectorIndexOutOfBoundsException", i);

}

//Получение размера вектора public int size() {

return data.length;

}

//Нахождение нормы Евклида public double normEuclidean() {

double r = 0;

for (double x : data) { r += x * x;

}

return Math.sqrt(r);

}

//Вывод вектора на экран public void print() {

if (data.length > 0) { System.out.print(data[0]);

}

for (int i = 1; i < data.length; ++i) { System.out.print(" " + data[i]);

}

System.out.println();

}

//Данные

private final double[] data;

}

Таблица 6 — Фрагмент измененного кода vectors/CircularLinkedList.java

package vectors;

import java.io.Serializable;

public class CircularLinkedList implements IVector, Serializable {

//...

//Класс "Узел"

public static class Node implements Serializable { public Node(double value, Node prev, Node next) {

this.value = value; this.prev = prev; this.next = next;

}

public double value; public Node prev, next;

11

}

// ...

}

Продемонстрируем возможности сериализации в файле Task4.java (табл. 7).

Таблица 7 — Код Task4.java

import vectors.Array;

import vectors.CircularLinkedList; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class Task4 {

// Точка входа

public static void main(String[] args) throws Exception { Array a = new Array(3);

CircularLinkedList b = new CircularLinkedList(5); a.set(0, 2);

a.set(1, 1); a.set(2, 0); b.set(0, 5); b.set(1, 4); b.set(2, 3); b.set(3, 2); b.set(4, 1);

System.out.println("[Array] Work with byte streams"); System.out.print("1. Source array: ");

a.print();

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);

objectOutputStream.writeObject(a);

objectOutputStream.flush();

System.out.println("2. Internal data (in bytes):"); System.out.println(byteArrayOutputStream.toString()); ByteArrayInputStream byteArrayInputStream = new

ByteArrayInputStream(byteArrayOutputStream.toByteArray()); ObjectInputStream objectInputStream = new

ObjectInputStream(byteArrayInputStream); System.out.print("3. Received array: "); ((Array) objectInputStream.readObject()).print();

System.out.println("[CircularLinkedList] Work with byte streams"); System.out.print("1. Source list: ");

b.print();

byteArrayOutputStream = new ByteArrayOutputStream(); objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(b);

objectOutputStream.flush();

System.out.println("2. Internal data (in bytes):"); System.out.println(byteArrayOutputStream.toString()); byteArrayInputStream = new

ByteArrayInputStream(byteArrayOutputStream.toByteArray()); objectInputStream = new ObjectInputStream(byteArrayInputStream); System.out.print("3. Received list: ");

((CircularLinkedList) objectInputStream.readObject()).print();

}

}

12

Результат компиляции и запуска приведен на рис. 3.

Рисунок 3 — Компиляция и запуск Task4.java

Сериализация — это преобразование объекта или дерева объектов в какой-либо формат для того, чтобы потом эти объекты можно было восстановить из этого формата. Сериализация в Java подразумевает хранение типа объекта, типов его полей (и их названий), а также их значений.

Если размер сериализованных данных получился большим и есть смысл его уменьшить (например, типы некоторых/всех объектов известны и нет смысла их хранить), то вместо стандартного механизма сериализации можно реализовать методы наподобие Vectors.outputVector и

Vectors.inputVector.

Заключение В результате выполнения лабораторной работы мы ознакомились с

механизмом систем ввода и вывода данных.

13