Готовые отчеты (2020) / Java. Лабораторная работа 4
.pdfpublic 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