Міністерство освіти і науки України Національний авіаційний університет Навчально-науковий інститут комп’ютерних інформаційних технологій Домашня робота з дисципліни «Майстерня розробки програмного забезпечення» Виконав студент: групи ПІ-227 Федючук Тимофій Віталійович Перевірив викладач: Київ 2022 ДОСЛІДЖЕННЯ МЕХАНІЗМУ СЕРІАЛІЗАЦІЇ В JAVA Мета роботи: вивчити механізм серіалізації об’єктів при використанні потоків введення/виведення даних у мові Java та навчитися використовувати потоки введення/виведення даних у багатопоточному застосуванні. Завдання: Напишіть консольне застосування на мові Java, яке: 1) створює потік для запису об’єктів класу до деякого файлу згідно з варіантом завдання; 2) створює потік для читання з файлу об’єктів та виведення їх у табличному вигляді; 3) передбачає синхронізацію між потоками (тобто запис або читання є атомарними операціями) та реалізує її двома способами: - за допомогою механізму wait/notify; - за допомогою класів та інтерфейсів пакету java.util.concurrent.locks; import java.io.*; import java.util.Scanner; import java.util.concurrent.locks.Lock; public class Main { private static final Object lock = new Object(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Введіть шлях до файлу, будь-ласка"); String path = scanner.nextLine(); while (true) { System.out.println("1 - Додати автобус"); System.out.println("2 - Прочитати автобус з бази"); int choose; try { choose = scanner.nextInt(); } catch (Exception ex) { System.out.println("Тільки 1 чи 2!"); return; } switch (choose) { case (1): synchronized (lock) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(path, true))) { scanner = new Scanner(System.in); Bus b = null; while (b == null) { System.out.println("Введіть прізвище водія"); String LastName = scanner.nextLine(); System.out.println("Введіть ім'я водія"); String Name = scanner.nextLine(); System.out.println("Введіть номер маршуту"); String routeNumber = scanner.nextLine(); System.out.println("Введіть номер астобусу"); String BusNumber = scanner.nextLine(); System.out.println("Введіть марку автобусу"); String BusBrand = scanner.nextLine(); System.out.println("Введіть час експлуатації автобусу"); int BusUsage = scanner.nextInt(); System.out.println("//////////////"); b = new Bus(Name, LastName, routeNumber, BusNumber, BusBrand, BusUsage); writer.newLine(); writer.write(b.toString()); writer.flush(); } } catch (IOException e) { System.out.println("Проблеми з файлом..."); } } break; case (2): synchronized (lock) { String line; int n = 0; try (BufferedReader reader = new BufferedReader(new FileReader(path))) { while (n == 0) { System.out.println("Введіть номер автобусу якого треба знайти"); try { n = scanner.nextInt(); } catch (Exception ex) { System.out.println("Номер!!!"); } } for (int i = 0; i < n - 1; i++) { reader.readLine(); } System.out.println(reader.readLine()); } catch (IOException e) { System.out.println("Проблеми з файлом..."); } } break; default: System.out.println(choose + "Тільки 1 або 2!"); break; } } } } public class Bus { String firstName, lastName, numberRoute, numberBus, brand, run; int startOfUsage; public Bus(String _firstName, String _lastName, String _numberRoute , String _numberBus, String _brand, int _startOfUsage) { firstName = _firstName; lastName = _lastName; numberRoute = _numberRoute; numberBus = _numberBus; brand = _brand; startOfUsage = _startOfUsage; } public String toString() { int i = 0; return i++ + '.' + " Ім'я водія: " + firstName + " " + lastName + ". Номер маршуту: " + numberRoute + ". Номер автобусу: " + numberBus + ". Марка автобусу: " + brand + ". Час експлуатації: " + startOfUsage + " років. Пробіг: " + run; } } Висновок: під час виконання роботи було досліджено механізм сериалізації при використані потоків. |