Foros del Web » Programación para mayores de 30 ;) » Java »

Leer todos los objetos guardados en un fichero

Estas en el tema de Leer todos los objetos guardados en un fichero en el foro de Java en Foros del Web. Buenas. Estoy intentado leer todos los objetos que tengo en un fichero, el problema es que cuando voy a leer, solo me lee el primer ...
  #1 (permalink)  
Antiguo 05/01/2016, 09:45
 
Fecha de Ingreso: marzo-2013
Mensajes: 51
Antigüedad: 11 años, 1 mes
Puntos: 2
Leer todos los objetos guardados en un fichero

Buenas. Estoy intentado leer todos los objetos que tengo en un fichero, el problema es que cuando voy a leer, solo me lee el primer objeto. Dejo los métodos que utilizo para la escritura y la lectura.

Escritura
Código Java:
Ver original
  1. public static void guardarCamiones(...) throws IOException {
  2.         Camiones camion = new Camiones(...);
  3.         camiones.add(camion); //camiones es un arraylist (no puedo prescindir de el)
  4.         File fichero = new File("camiones.obj");
  5.         FileOutputStream fos = new FileOutputStream(fichero, true);
  6.         ObjectOutputStream oos = new ObjectOutputStream(fos);
  7.         for (int i = 0; i < camiones.size(); i++) {
  8.             Camiones cam = camiones.get(i);
  9.             oos.writeObject(cam);
  10.         }
  11.         oos.close();
  12.  
  13.         System.out.println("Se ha escrito en el fichero");
  14.  
  15.     }

Lectura
Código Java:
Ver original
  1. public static void verCamiones() throws ClassNotFoundException, IOException {
  2.         ObjectInputStream ois = null;
  3.         try {
  4.             File fichero = new File("camiones.obj");
  5.             FileInputStream fis = new FileInputStream(fichero);
  6.             ois = new ObjectInputStream(fis);
  7.             while (true) {
  8.                 Camiones camion = (Camiones) ois.readObject();
  9.                 //Mostrar cosas por pantalla
  10.             }
  11.         } catch (IOException io) {
  12.             //io.printStackTrace();
  13.             System.out.println(" ");
  14.         } finally {
  15.             ois.close();
  16.         }
  17.  
  18.     }

Encontré este hilo: http://www.forosdelweb.com/f45/quisi...o-bin-1112682/ pero no me ha dado resultado.

Ayuda por favor, y gracias.
  #2 (permalink)  
Antiguo 05/01/2016, 10:12
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Leer todos los objetos guardados en un fichero

Hola:

Según el código del primer trozo, sólo guardas un camion: Haces un solo "new Caminoes", lo metes en el arraylist que tendra por tanto tamaño 1, y te metes en un bucle de 1 elemento para escribirlo.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 05/01/2016, 10:27
 
Fecha de Ingreso: marzo-2013
Mensajes: 51
Antigüedad: 11 años, 1 mes
Puntos: 2
Respuesta: Leer todos los objetos guardados en un fichero

Lo se, a ver la aplicacion tiene un menú, cuando guardo un camion, luego puedo volver a guardar otro, por tanto el arraylist ya tendra dos camiones.

El problema viene con el append, ya que si yo pongo en el metodo de guardar:
Código Java:
Ver original 
en lugar de:
Código Java:
Ver original
  1. FileOutputStream fos = new FileOutputStream(fichero, true);
A la hora de leer el fichero si que me muestra todos los objetos, pero claro al cerrar la aplicacion y volverla a abrir para añadir un nuevo camion me sobreescribiría el archivo lo cual no me interesa...
  #4 (permalink)  
Antiguo 05/01/2016, 16:55
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 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

Etiquetas: escritura, ficheros, lectura, serializable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:09.