Доброго времени суток. Такая проблема. Имеется двухуровневый кеш, реализованный с помощью LinkedHashMap. Когда кол-во пар ключ-значение превышает указанное, с момощью переопределенного метода removeEldestEntry сериализую самыу старую пару ключ-значение, записывая в файл:
| Код |
protected boolean removeEldestEntry(Map.Entry eldest) { if (size() > maxCache){ ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("E:/cacheBox.cach")); oos.writeObject(eldest.getValue()); oos.writeObject(eldest.getKey()); oos.flush(); oos.close(); } catch (IOException ex) { Logger.getLogger(MyCache.class.getName()).log(Level.SEVERE, null, ex); } return true; } else return false; |
Далее в ступоре. При обращении к записям сначала проверяю имеются ли они в мапе. Если нет, нужно десериализовать искомую пару ключ-значение. Честно сказал, вообще не представляю как это сделать. Нашел такое обобщенное решение:
| Цитата | берем стандартный LinkedHashMap - создаем с параметром accessOrder=true переопределяем метод removeEldestEntry(Map.Entry) - сериализуем объект, возвращаем true переопределяем метод get(Object o) - чтоб в случае, когда объект не найден (get, containsKey) лез в сериализацию (и засовывал объект в map)
|
Только не могу представить как это сделать. Не могу понять как он найдет нужную пару из всех сериализованных обхектов. Есть ли методы, алгоритмы? И вообще при сериализации эти две операции сохранят связь между ключом и значением?
| Код | oos.writeObject(eldest.getValue()); oos.writeObject(eldest.getKey());
|
Переваривал примеры с сериализацией. В них просто создавались два класса. В одном устанавливались поля в определенные значение. Второй класс реализовывал интерфейс Serializable и проводил саму сериализацию. При этом явно создавался объект класса еще в исходнике. Не могу понять как перенсести это на мой случай, когда строки создаются во время работы приложения. Простите, я еще только учусь, многого просто в голове уложить не могу, часто не понимаю сути. Заранее извиняюсь, если выражаюсь топорно. Все не со зла. И заранее очень благодарен всем тем, кто поможет. Спасибо )))
Добавлено через 11 минут и 6 секунд В пределах мапы провожу проверку таким образом (проверка проводится в теле метода actionPerformed обработчика событий):
| Код | String s = getName.getText(); s = s.toUpperCase(); //специально перевожу, чтобы при поиске по ключу избежать расходимости при введении имени с прописной и строчной буквы if (box.containsKey(s)) getPhone.setText(s + " number of phone is: " + (String)box.get(s));
|
|