2011-01-19 33 views
10

Soy nuevo en Java, así que no estoy seguro de la mejor manera de hacerlo. Tengo una estructura de datos que me gustaría poder escribir en un archivo antes de cerrar el programa, y ​​luego leer desde el archivo para volver a llenar la estructura la próxima vez que se inicie la aplicación.Java: Escribir/Leer un mapa desde el disco

Mi estructura es HashMap<String, Object>. El objeto es bastante simple; Para las variables miembro, tiene una Cadena y dos pequeñas matrices nativas de tipo Booleano. Esta es una aplicación realmente simple, y no esperaría más de 10-15 <key,value> pares a la vez.

He estado experimentando (sin éxito) con entradas/salidas de objetos. ¿Debo hacer que la clase Object sea serializable?

¿Puede darme alguna sugerencia sobre la mejor manera de hacerlo? Solo necesito un empuje en la dirección correcta. ¡Gracias!

EDIT: Bueno, todavía me siento bobo, estaba escribiendo desde un mapa y leyendo en otro mapa, y luego comparándolos para verificar mis resultados. Aparentemente los estaba comparando mal. Suspiro.

+1

HashMap es ya Serializable. ¿Qué salió mal cuando trataste de escribirlo en un ObjectOutputStream? – finnw

+0

Las transmisiones de entrada/salida de los objetos no son el único camino a seguir. ¿Desea específicamente consejos sobre su uso? O en I/O en general? – Raedwald

+0

@Raedwald - Realmente solo estoy buscando la mejor manera de una simple aplicación. Google me dirigió las transmisiones de objetos. – jazz99

Respuesta

26

Si no está preocupado por Objeto en particular, solo necesita par de valor clave de Cadena, Cadena, entonces le sugiero que vaya por java.util.Properties. de lo contrario, aquí va

 Map map = new HashMap(); 
     map.put("1",new Integer(1)); 
     map.put("2",new Integer(2)); 
     map.put("3",new Integer(3)); 
     FileOutputStream fos = new FileOutputStream("map.ser"); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(map); 
     oos.close(); 

     FileInputStream fis = new FileInputStream("map.ser"); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     Map anotherMap = (Map) ois.readObject(); 
     ois.close(); 

     System.out.println(anotherMap); 
+1

Definitivamente no estaba usando la extensión .ser, lo intentaré. Gracias – jazz99

+1

He probado este código, funciona, y debe :) –

+0

La extensión .ser parece haber solucionado mi problema. Ahora tendré que leer acerca de por qué es eso. Usted obtiene la victoria. – jazz99

0

Sí, si desea escribir un objeto en el sistema de archivos, ese objeto debe implementar Serializeable. Here es un tutorial que debería ayudarte.

+0

No es necesario implementar 'Serializable '. Solo si desea hacer el formato de serialización de Java como su formato de archivo es ese el caso. – Raedwald

+2

¿No es eso lo que quería el asker? Estaba jugando con flujos de entrada/salida de Object ... – Davidann

+0

Gracias por el tutorial. ¡Leyendo ahora! – jazz99

1

Sí, sus objetos necesitarán implementar Serializable para ser serializados por el mecanismo predeterminado de Java. HashMap y String ya implementan esta interfaz y, por lo tanto, se pueden serializar con éxito.

Eche un vistazo a Sun Serialization tutorial - es bastante corto y creo que debería cubrir todo lo que necesita para su caso simple. (Solo debe poder serializar el objeto Map en la transmisión y luego volver a leerlo en ejecuciones posteriores).

Si tiene problemas, intente serializar un simple HashMap<String, String> con algunos valores ficticios. Si esto tiene éxito, sabrá que el problema radica (de alguna manera) en la serializabilidad de su propia clase; alternativamente, si esto no funciona, puede enfocarse en la estructura básica antes de incluir su propia clase en la mezcla.

Publique de nuevo si tiene problemas más específicos que no puede resolver por su cuenta.

0

No se moleste en hacer que sea serializable hasta que comprenda más acerca de para qué se utiliza. Desea ver FileWriter y google "java file io" Una buena forma de escribir esta información es como CSV.

por ejemplo.

key1, clave2, key3 valuea1, valuea2, valuea3 valueb1, valueb2, valueb3

Espero que esto ayude.

+0

¿por qué csv es una solución mejor que la serialización? la serialización no implica un código adicional, mientras que usted debería obtener/escribir el código de formato/análisis csv usted mismo. – jtahlborn

+0

Tendemos a evitar objetos serializables a menos que tengamos que usarlos absolutamente. Hay más para ellos de lo que la gente piensa. Al igual que Raedwald, estoy influenciado por la "Java efectiva" de Bloch. – Speck

+2

csv tiene sus propias trampas. ¿cómo escapas del delimitador? ¿cómo escapas del escape? etc ... todavía no lo compre como una mejor alternativa para algo tan simple. – jtahlborn

2
Map m = new HashMap(); 
// let's use untyped and autoboxing just for example 
m.put("One",1); 
m.put("Two",2); 

ObjectOutputStream oos = new ObjectOutputStream(
     new FileOutputStream("foo.ser") 
); 
oos.writeObject(m); 
oos.flush(); 
oos.close(); 
0

Recomendaría no utilizar Serializable; es mucho más difícil de hacer correctamente de lo que parece al principio. Parecería que simplemente agregar implements Serializable es todo lo que necesita hacer.Pero, de hecho, esto agrega muchas restricciones en su código que son difíciles de tratar en el desarrollo de software práctico (en lugar de en la escuela). Para ver cuán horribles son estas restricciones, consulte el libro Effective Java (second edition) de Bloch.

+1

Acepto que Serializable no es efectivo para datos extremadamente duraderos, pero para la durabilidad temporal sin la necesidad de consulta o administración de datos, creo que funciona bien. – Xailor

-1

ESTABLECIMIENTO DE UNA PÁGINA DE DATOS: Este código funciona bien, lo he implementado y lo he usado en mi aplicación. Por favor haga sus funciones en consecuencia para guardar el mapa y recuperar el mapa.

La cosa de Imp es, debe confirmar que los objetos que está poniendo como valor en el mapa deben ser serializables, significa que deben implementar la interfaz de SERAILIZBELE. ex. Map < .String, String> hashmap = new HashMap < .String, String>() .. aquí en esta línea ... map y string son implícitamente serializables, por lo que no es necesario implementar serializables para estos explícitamente, pero si pon tu propio objeto que debe ser serializable.


public static void main(String arr[]) 
{ 
    Map<String,String> hashmap=new HashMap<String,String>(); 
hashmap.put("key1","value1"); 
    hashmap.put("key2","value2"); 
    hashmap.put("key3","value3"); 
    hashmap.put("key4","value4"); 

    FileOutputStream fos; 
    try { 
     fos = new FileOutputStream("c://list.ser"); 

    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(hashmap); 
    oos.close(); 

    FileInputStream fis = new FileInputStream("c://list.ser"); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    Map<String,String> anotherList = (Map<String,String>) ois.readObject(); 

    ois.close(); 

    System.out.println(anotherList); 

} catch (FileNotFoundException e) {e.printStackTrace(); 
} catch (IOException e) {e.printStackTrace(); 
    } catch (ClassNotFoundException e) {e.printStackTrace(); 
    } 

} 
Cuestiones relacionadas