Сохраните свойства HashMap в файл свойств и загрузите эти свойства обратно в HashMap.

Итак, я столкнулся с проблемой приведения с сохранением свойств HashMap в файл Properties, потому что ключ HashMap — это объект, который нельзя преобразовать в java.lang.String, потому что свойства должны быть (String, String), а мои HashMap — это (Object, Long).

Я просто хочу сохранить содержимое HashMap в файл, чтобы я мог загрузить это содержимое обратно в HashMap при следующем запуске программы.

Я предпринял огромное количество бесполезных попыток пополнить HashMaps объектами, которые они содержали до того, как они были сохранены. Я попытался придумать простой способ преобразовать объект в строку, что я могу сделать, но поскольку Properties и HashMaps не индексируются, я не могу изменить эти строки обратно в объект, которым они должны быть. Как этого добиться?

Вот что я пытаюсь сделать:

    public File savedHashMaps = new File("SavedHashMaps.list");
// in my case, the object is 'Location' from an implemented API
public Map<Location, Long> map = new HashMap<Location, Long>();

public void saveMaps() {
    Properties prop = new Properties();
    try {
        if (!map.isEmpty()) {
            prop.load(new FileInputStream(savedHashMaps));
            prop.putAll(map);
            prop.store(new FileOutputStream(savedHashMaps), null);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void loadMaps() {
    Properties prop = new Properties();
    try {
        prop.load(new FileInputStream(savedHashMaps));
        if (!prop.isEmpty()) {
            map.putAll((Map)prop);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

person Jon McPherson    schedule 28.11.2012    source источник
comment
Файл свойств не является правильным способом сохранения ваших данных (Map<Location, Long>). Вы должны придумать свой собственный формат файла данных, который подходит для сохранения/восстановления данных.   -  person Bhesh Gurung    schedule 28.11.2012
comment
Возможно, вам лучше использовать для этой цели формат ObjectInputStream и ObjectOutputStream, а не формат свойств, если вы не ожидаете, что другая программа будет читать/записывать его.   -  person Opal    schedule 28.11.2012


Ответы (1)


Использование ObjectInput/OutputStream

public File savedHashMaps = new File("SavedHashMaps.list");
public Map<Location, Long> map = new HashMap<Location, Long>();

public void saveMaps() {
    try {
        ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream(savedHashMaps));
        oos.writeObject(map);
        oos.close();
    } catch (Exception e) {
        // Catch exceptions
    }
}

public void loadMaps() {
    try {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(savedHashMaps));
        Object readMap = ois.readObject();
        if(readMap != null && readMap instanceof HashMap) {
            map.putAll((HashMap) readMap);
        }
        ois.close();
    } catch (Exception e) {
        // Catch exceptions
    }
}

Это из памяти, извините за ошибки, однако это сохранит и перезагрузит все ваши местоположения, длинные сопоставления. Также в качестве примечания класс Location должен реализовывать Serializable (или иметь суперкласс, который его реализует) (это интерфейс маркера (см. java.dzone.com/articles/marker-interfaces-java), поэтому вы просто добавляете implements Serializable).

person Opal    schedule 28.11.2012
comment
что бы вы сделали, если бы объект не был сериализуем? - person Jon McPherson; 28.11.2012
comment
Вам нужно будет реализовать свой собственный метод сохранения/извлечения объектов. Например, в XML. Что касается реализации, это будет зависеть от содержимого файла. Можно было бы реализовать тот, который использует документацию [Reflection API][. oracle.com/javase/tutorial/reflect/index.html], чтобы вы могли сохранить любой объект, однако это не будет работать в апплетах. - person Opal; 29.11.2012
comment
В итоге я создал класс serializedLocation, который только что реализовал сериализуемость и обрабатывал переходы к стандартному объекту Location и сериализованному объекту Location и обратно. У меня нормально работает! Спасибо за вашу помощь! - person Jon McPherson; 29.11.2012