Как читать и записывать HashMap в файл? - PullRequest
17 голосов
/ 28 июля 2010

У меня есть следующее HashMap :

HashMap<String,Object> fileObj = new HashMap<String,Object>();

ArrayList<String> cols = new ArrayList<String>();  
cols.add("a");  
cols.add("b");  
cols.add("c");  
fileObj.put("mylist",cols);  

Я записываю его в файл следующим образом:

File file = new File("temp");  
FileOutputStream f = new FileOutputStream(file);  
ObjectOutputStream s = new ObjectOutputStream(f);          
s.writeObject(fileObj);
s.flush();

Теперь я хочу прочитать этот файл обратно в HashMap, где Object является ArrayList. Если я просто сделаю:

File file = new File("temp");  
FileInputStream f = new FileInputStream(file);  
ObjectInputStream s = new ObjectInputStream(f);  
fileObj = (HashMap<String,Object>)s.readObject();         
s.close();

Это не дает мне объект в том формате, в котором я его сохранил. Он возвращает таблицу с 15 нулевыми элементами и парой в третьем элементе. Я хочу, чтобы он возвращал только один элемент со значениями, которые я ему предоставил.
// Как я могу прочитать тот же объект обратно в HashMap?

ОК. Итак, основываясь на примечании Джема: это то, что кажется правильным объяснением:

ObjectOutputStream сериализует объекты (в данном случае HashMap) в любом формате, который ObjectInputStream поймет для десериализации, и делает это в общем для любого объекта Serializable. Если вы хотите, чтобы он сериализовался в нужном вам формате, вам следует написать свой собственный сериализатор / десериализатор.

В моем случае: я просто перебираю каждый из этих элементов в HashMap, когда читаю объект обратно из файла, получаю данные и делаю с ним все, что захочу. (он входит в цикл только в той точке, где есть данные).

Спасибо,

Ответы [ 5 ]

12 голосов
/ 28 июля 2010

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

public static void main(String... args)
                            throws IOException, ClassNotFoundException {
    HashMap<String, Object> fileObj = new HashMap<String, Object>();

    ArrayList<String> cols = new ArrayList<String>();
    cols.add("a");
    cols.add("b");
    cols.add("c");
    fileObj.put("mylist", cols);
    {
        File file = new File("temp");
        FileOutputStream f = new FileOutputStream(file);
        ObjectOutputStream s = new ObjectOutputStream(f);
        s.writeObject(fileObj);
        s.close();
    }
    File file = new File("temp");
    FileInputStream f = new FileInputStream(file);
    ObjectInputStream s = new ObjectInputStream(f);
    HashMap<String, Object> fileObj2 = (HashMap<String, Object>) s.readObject();
    s.close();

    Assert.assertEquals(fileObj.hashCode(), fileObj2.hashCode());
    Assert.assertEquals(fileObj.toString(), fileObj2.toString());
    Assert.assertTrue(fileObj.equals(fileObj2));
}
3 голосов
/ 28 июля 2010

Я полагаю, вы совершаете распространенную ошибку.Вы забыли закрыть поток после его использования!

 File file = new File("temp");  
 FileOutputStream f = new FileOutputStream(file);  
 ObjectOutputStream s = new ObjectOutputStream(f);          
 s.writeObject(fileObj);
 s.close();
2 голосов
/ 25 октября 2017

Вы также можете использовать файл JSON для чтения и записи объекта MAP.

Для записи объекта карты в файл JSON

    ObjectMapper mapper = new ObjectMapper();

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("name", "Suson");
    map.put("age", 26);

    // write JSON to a file
    mapper.writeValue(new File("c:\\myData.json"), map);

Для чтения объекта карты из файла JSON

    ObjectMapper mapper = new ObjectMapper();

        // read JSON from a file
        Map<String, Object> map = mapper.readValue(
                new File("c:\\myData.json"),
                new TypeReference<Map<String, Object>>() {
        });

        System.out.println(map.get("name"));
        System.out.println(map.get("age"));

и импортируйте ObjectMapper из com.fasterxml.jackson и поместите код в блок try catch

1 голос
/ 28 июля 2010

Я верю, что вы получаете то, что экономите.Вы проверяли карту, прежде чем сохранить ее?В HashMap:

/**
 * The default initial capacity - MUST be a power of two.
 */
static final int DEFAULT_INITIAL_CAPACITY = 16;

, например, значение по умолчанию HashMap начнется с 16 null с.Вы используете одну из групп, поэтому у вас остается только 15 null с при сохранении, что вы получаете при загрузке.Попробуйте проверить fileObj.keySet(), .entrySet() или .values(), чтобы увидеть, что вы ожидаете.

HashMap с предназначены для быстрой работы при обмене памяти.См. Хеш-таблицу Википедии для более подробной информации.

1 голос
/ 28 июля 2010

Ваша первая строка:

HashMap<String,Object> fileObj = new HashMap<String,Object>();

дала мне паузу, поскольку значения не гарантированно равны Serializable и, следовательно, могут быть неправильно записаны.Вы действительно должны определить объект как HashMap<String, Serializable> (или, если хотите, просто: Map<String, Serializable>).

Я бы также подумал о сериализации Карты в простом текстовом формате, таком как JSON, поскольку вы делаете простойString -> List<String> отображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...