package laba1Loco; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class TrainsGenericStorage { /// /// Разделитель для записи ключа и значения элемента словаря /// private static String _separatorForKeyValueWR = "|"; private static String _separatorForKeyValue = "\\|"; /// /// Разделитель для записей коллекции данных в файл /// private String _separatorRecordsWR = ";"; private String _separatorRecords = "\\;"; /// /// Разделитель для записи информации по объекту в файл /// private static String _separatorForObjectWR = ":"; private static String _separatorForObject = "\\:"; public boolean SaveDataSingle(String filename, String key){ if (new File(filename).exists()) { new File(filename).delete(); } StringBuilder data = new StringBuilder(); data.append(key).append("\n"); for (DrawingTrain elem : _trainStorages.get(key).getTrains(100)) data.append(elem != null ? ExtentionDrawingTrain.GetDataForSave(elem, _separatorForObjectWR) + "\n" : ""); if (data.length() == 0) return false; try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { writer.write("TrainStorageSingle" + System.lineSeparator() + data.toString()); } catch (IOException e) { e.printStackTrace(); return false; } return true; } public boolean LoadDataSingle(String filename){ if (!new File(filename).exists()) { return false; } try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { String s = reader.readLine(); if (s == null || s.length() == 0) return false; if (!s.startsWith("TrainStorageSingle")) return false; String key = reader.readLine(); if (key == null || key.length() == 0) return false; TrainsGenericCollection collection; if (_trainStorages.containsKey(key)){ collection = _trainStorages.get(key); collection.clear(); } else collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight); List trainsStrings = new ArrayList(); s = reader.readLine(); while (s != null && s.length() != 0){ trainsStrings.add(s); s = reader.readLine(); } Collections.reverse(trainsStrings); for (String elem : trainsStrings) { DrawingTrain train = ExtentionDrawingTrain.CreateDrawingTrain(elem, _separatorForObject, _pictureWidth, _pictureHeight); if (train == null || collection.Add(train) == -1) return false; } _trainStorages.put(key, collection); } catch (IOException e) { e.printStackTrace(); return false; } return true; } /// /// Сохранение информации по поездам в хранилище в файл /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при cохранении данных public boolean SaveData(String filename) { if (new File(filename).exists()) { new File(filename).delete(); } StringBuilder data = new StringBuilder(); for (Map.Entry> record : _trainStorages.entrySet()) { StringBuilder records = new StringBuilder(); for (DrawingTrain elem : record.getValue().getTrains(100)) { records.append(elem != null ? ExtentionDrawingTrain.GetDataForSave(elem, _separatorForObjectWR) + _separatorRecordsWR : ""); } data.append(record.getKey()).append(_separatorForKeyValueWR).append(records).append("\n"); } if (data.length() == 0) return false; try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { writer.write("TrainStorage" + System.lineSeparator() + data.toString()); } catch (IOException e) { e.printStackTrace(); return false; } return true; } /// /// Загрузка информации по поездам в хранилище из файла /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка призагрузке данных public boolean LoadData(String filename) { if (!new File(filename).exists()) { return false; } try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { String s = reader.readLine(); if (s == null || s.length() == 0) return false; if (!s.startsWith("TrainStorage")) return false; _trainStorages.clear(); s = reader.readLine(); while (s != null && s.length() != 0) { String[] record = s.split(_separatorForKeyValue); s = reader.readLine(); if (record.length != 2) { continue; } TrainsGenericCollection collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight); String[] set = record[1].split(_separatorRecords); List reversedSet = Arrays.asList(set); Collections.reverse(reversedSet); for (String elem : reversedSet) { DrawingTrain train = ExtentionDrawingTrain.CreateDrawingTrain(elem, _separatorForObject, _pictureWidth, _pictureHeight); if (train == null || collection.Add(train) == -1) return false; } _trainStorages.put(record[0], collection); } } catch (IOException e) { e.printStackTrace(); return false; } return true; } /// /// Словарь (хранилище) /// HashMap> _trainStorages; /// /// Возвращение списка названий наборов /// public List Keys(){return _trainStorages.keySet().stream().collect(Collectors.toList());} /// /// Ширина окна отрисовки /// private int _pictureWidth; /// /// Высота окна отрисовки /// private int _pictureHeight; /// /// Конструктор /// /// /// public TrainsGenericStorage(int pictureWidth, int pictureHeight) { _trainStorages = new HashMap>(); _pictureWidth = pictureWidth; _pictureHeight = pictureHeight; } /// /// Добавление набора /// /// Название набора public void AddSet(String name) { if (_trainStorages.containsKey(name)) return; _trainStorages.put(name, new TrainsGenericCollection(_pictureWidth, _pictureHeight)); } /// /// Удаление набора /// /// Название набора public void DelSet(String name) { if (!_trainStorages.containsKey(name)) return; _trainStorages.remove(name); } /// /// Доступ к набору /// /// /// public TrainsGenericCollection get(String ind) { if (_trainStorages.containsKey(ind)) return _trainStorages.get(ind); return null; } public DrawningObjectTrain get(String ind1, int ind2){ if (!_trainStorages.containsKey(ind1)) return null; return _trainStorages.get(ind1).GetU(ind2); } }