How to read and write a HashMap to a file?

前端 未结 5 413
南笙
南笙 2020-12-09 04:13

I have the following HashMap:

HashMap fileObj = new HashMap();

ArrayList cols         


        
相关标签:
5条回答
  • 2020-12-09 04:26

    I believe you're getting what you're saving. Have you inspected the map before you save it? In HashMap:

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

    e.g. the default HashMap will start off with 16 nulls. You use one of the buckets, so you only have 15 nulls left when you save, which is what you get when you load. Try inspecting fileObj.keySet(), .entrySet() or .values() to see what you expect.

    HashMaps are designed to be fast while trading off memory. See Wikipedia's Hash table entry for more details.

    0 讨论(0)
  • 2020-12-09 04:36

    You appear to be confusing the internal resprentation of a HashMap with how the HashMap behaves. The collections are the same. Here is a simple test to prove it to you.

    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));
    }
    
    0 讨论(0)
  • 2020-12-09 04:37

    I believe you´re making a common mistake. You forgot to close the stream after using it!

     File file = new File("temp");  
     FileOutputStream f = new FileOutputStream(file);  
     ObjectOutputStream s = new ObjectOutputStream(f);          
     s.writeObject(fileObj);
     s.close();
    
    0 讨论(0)
  • 2020-12-09 04:37

    you can also use JSON file to read and write MAP object.

    To write map object into JSON file

        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);
    

    To read map object from JSON file

        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"));
    

    and import ObjectMapper from com.fasterxml.jackson and put code in try catch block

    0 讨论(0)
  • 2020-12-09 04:38

    Your first line:

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

    gave me pause, as the values are not guaranteed to be Serializable and thus may not be written out correctly. You should really define the object as a HashMap<String, Serializable> (or if you prefer, simpy Map<String, Serializable>).

    I would also consider serializing the Map in a simple text format such as JSON since you are doing a simple String -> List<String> mapping.

    0 讨论(0)
提交回复
热议问题