Ver Mensaje Individual
  #4 (permalink)  
Antiguo 05/01/2016, 16:55
Avatar de chuidiang
chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Leer todos los objetos guardados en un fichero

Hola:

Un ObjectOutputStream es mala idea para guardar cosas y añadir luego más. Te comento el motivo.

Cuando haces un "new ObjectOutputStream()", se escriben automáticamente en el fichero unos bytes de cabecera, propios de java y sobre los que no tienes control. Cuando haces un "new ObjectInputStream()", se leen automáticamente esos bytes de cabecera, y si por el motivo que sea no se encuentran, la creación falla.

Imagina que arrancas el programa por primera vez y escribes tres camiones. En el fichero tendras los bytes de cabecera y los tres camiones. Ahora arrancas por segunda vez y escribes dos camiones más. Tendrás ahora en el fichero los bytes de cabecera, los tres camiones de antes, otra vez otros bytes de cabecera y dos camiones más.

Y ahora arrancas para leer. El new ObjectInputStream() lee los primeros bytes de cabecera, luego empiezas a leer camiones y leeras sólo tres camiones y cuando quieras leer el cuarto fallará, porque en el fichero hay un segundo grupo de bytes de cabecera que no esperas.

La solución es o bien no usar ObjectInputStream ni ObjectOutputStream y usar en su lugar algo quizás más manual, pero que te permita controlar exactamente cómo escribes y lees de fichero. O bien, crear un nuevo ObjectOuputStream por cada camion que se quieras escribir, y crear un ObjectInputStream para cada camion que se quiera leer. De esta forma siempre habrá bytes de cabecera entre camión y camión.

Es decir, para escribir

Código Java:
Ver original
  1. para cada camion en el array list {
  2.     oos =  new ObjectOuputStream();
  3.     oos.writeObject(un camion);
  4. }

y para leer

Código Java:
Ver original
  1. mientras se pueda seguir leyendo {
  2.         ois = new ObjectInputStream();
  3.         Camion camion = (Camion)ois.readObject();
  4. }

Se bueno.
__________________
Apuntes Java
Wiki de Programación