Ver Mensaje Individual
  #4 (permalink)  
Antiguo 03/11/2014, 08:18
yafuslae
 
Fecha de Ingreso: octubre-2012
Mensajes: 45
Antigüedad: 11 años, 6 meses
Puntos: 2
Respuesta: Quisiera leer todos los objetos guardados en un archivo .bin

Hola chuidiang.

Cita:
Para leer, debes leer igual, crear un ObjectInputStream para cada objeto que quieras leer, de forma que leas cabecera de bytes, objeto, cabecera de bytes, objeto, ... No lo estás haciendo así, en el metodo main() estás creando un único ObjectInputStream e intentando leer todos los objetos, es decir, estás intentando leer cabecera de bytes, objeto, objeto, objeto, ... El resultado es el StreamCorruptedException.
Haciendo ese cambio casi sale.

Código:
...
		 FileInputStream fis = new FileInputStream("fichero.bin");

		 try {
			 
			  while (true) {
			    ObjectInputStream in = new ObjectInputStream(fis);
			    vehiculo vehiculo;
			    try {
			      vehiculo = (vehiculo) in.readObject();
			    } catch (EOFException e) {
			    	System.out.println(e);
			      break;
			    }
			    System.out.println(vehiculo.getMarca());
			  }
			} finally {
				fis.close();
			}
Obtengo por respuesta:

Código:
FordException in thread "main" 
Seat
java.io.EOFException
	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2328)
	at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2797)
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
	at main.main(main.java:101)
Como se ve, me saca el Ford y el Seat, pero con errores.
Debe haber algo más...

Profesor_Falken: Los objetos que escribo no son para escribirlos todos de una, si no para hacerlo en distintas ejecuciones del código.
Al hacer xxd fichero.bin en el terminal me da a entender que existen dos objetos, o eso creo, pues aumenta al grabar nuevos objetos.
Código:
0000000: aced 0005 7372 0008 7665 6869 6375 6c6f  ....sr..vehiculo
0000010: 3a86 0bf8 279f 6677 0200 0549 0008 706f  :...'.fw...I..po
0000020: 7465 6e63 6961 4c00 0563 6f6c 6f72 7400  tenciaL..colort.
0000030: 124c 6a61 7661 2f6c 616e 672f 5374 7269  .Ljava/lang/Stri
0000040: 6e67 3b4c 0005 6d61 7263 6171 007e 0001  ng;L..marcaq.~..
0000050: 4c00 096d 6174 7269 6375 6c61 7100 7e00  L..matriculaq.~.
0000060: 014c 0006 6d6f 6465 6c6f 7100 7e00 0178  .L..modeloq.~..x
0000070: 7000 0001 f474 0004 526f 6a6f 7400 0346  p....t..Rojot..F
0000080: 6f72 7400 0952 2d33 3433 342d 6c66 7400  ort..R-3434-lft.
0000090: 0546 6f63 7573 aced 0005 7372 0008 7665  .Focus....sr..ve
00000a0: 6869 6375 6c6f 3a86 0bf8 279f 6677 0200  hiculo:...'.fw..
00000b0: 0549 0008 706f 7465 6e63 6961 4c00 0563  .I..potenciaL..c
00000c0: 6f6c 6f72 7400 124c 6a61 7661 2f6c 616e  olort..Ljava/lan
00000d0: 672f 5374 7269 6e67 3b4c 0005 6d61 7263  g/String;L..marc
00000e0: 6171 007e 0001 4c00 096d 6174 7269 6375  aq.~..L..matricu
00000f0: 6c61 7100 7e00 014c 0006 6d6f 6465 6c6f  laq.~..L..modelo
0000100: 7100 7e00 0178 7000 0000 3c74 0008 416d  q.~..xp...<t..Am
0000110: 6172 696c 6c6f 7400 0453 6561 7474 0009  arillot..Seatt..
0000120: 522d 3334 3335 2d70 6f74 0006 4d69 6269  R-3435-pot..Mibi
0000130: 7a61                                     za
Edito: chuidiang, he probado con el asunto de
Código:
protected void writeStreamHeader() throws IOException
{
// No hacer nada.
}
pero el resultado no cambia.

Última edición por yafuslae; 03/11/2014 a las 08:29 Razón: Más info.