2010-07-27 35 views
15

Tengo el siguiente HashMap:¿Cómo leer y escribir un HashMap en un archivo?

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

lo escribo en un archivo de la siguiente manera:

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

Ahora quiero leer este archivo de nuevo a un HashMap, donde el objeto es una Lista de arreglo. Si yo simplemente:

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

Esto no me da el objeto en el formato que he guardado en Se devuelve una tabla con 15 elementos nulos y la < milista, [a, b, c]. > par en el 3er elemento. Quiero que devuelva solo un elemento con los valores que le di en primer lugar.
// ¿Cómo puedo volver a leer el mismo objeto en un HashMap?

OK Así que basado en la nota de Cem: Esto es lo que parece ser la explicación correcta:

ObjectOutputStream serializa los objetos (HashMap en este caso) en cualquier formato que ObjectInputStream entenderá deserializar y lo hace de forma genérica para cualquier objeto serializable Si desea que se serialice en el formato que desea, debe escribir su propio serializador/deserializador.

En mi caso: simplemente repito cada uno de esos elementos en el HashMap cuando leo el Objeto desde el archivo y obtengo los datos y hago lo que quiera con él. (ingresa al ciclo solo en el punto donde hay datos).

Gracias,

+1

¿Qué quiere decir con "no me da el objeto en el formato en que lo guardé"? Proporcione algunos ejemplos de lo que está viendo y de lo que espera. –

+3

¿Por qué no se declara su HashMap como 'HashMap >'? –

+0

+1 para HashMap > – Hbas

Respuesta

3

creo que estás cometiendo un error común. ¡Olvidaste cerrar la transmisión después de usarla!

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

No. He cerrado la transmisión. Simplemente no lo mencioné en el código. He hecho las ediciones ahora. – lisam

+1

Independientemente, 'f.close()' no cerrará apropiadamente el 'ObjectOutputStream'. Siempre debe llamar cerca de la secuencia decorada más alta, es decir 's.close()'. – BalusC

1

Su primera línea:

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

me dio que pensar, ya que los valores no se garantiza que sea Serializable y por lo tanto no pueden ser escritas correctamente. Realmente debe definir el objeto como HashMap<String, Serializable> (o si lo prefiere, simpy Map<String, Serializable>).

También consideraría serializar el Mapa en un formato de texto simple como JSON ya que está haciendo una asignación simple de String -> List<String>.

+0

La clase en sí misma dentro de la cual aparecen estas líneas es Serializable. – lisam

1

Creo que está obteniendo lo que está ahorrando. ¿Has inspeccionado el mapa antes de guardarlo? En HashMap:

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

por ejemplo el valor predeterminado HashMap comenzará con 16 null s. Utiliza uno de los cubos, por lo que solo tiene 15 null s cuando lo guarda, que es lo que obtiene cuando carga. Intente inspeccionar fileObj.keySet(), .entrySet() o .values() para ver lo que espera.

HashMap s están diseñadas para ser rápidas mientras intercambia memoria. Ver entrada Wikipedia's Hash table para más detalles.

11

Parece que está confundiendo la respresentación interna de un HashMap con el comportamiento de HashMap. Las colecciones son iguales. Aquí hay una prueba simple para demostrarlo.

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

también puede usar el archivo JSON para leer y escribir objetos MAP.

Para escribir objeto de mapa en un archivo 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); 

Para leer objeto de mapa de archivo 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")); 

y ObjectMapper importación de com.fasterxml.jackson y poner el código en el bloque try catch

+0

consultar este enlace: https://www.mkyong.com/java/how-to-convert-java-map-to-from-json-jackson/ –

Cuestiones relacionadas