Problema con un array de ojetos obtenidos con ObjectInputStream

alex
27 de Noviembre del 2005
Hola Amigos:

Estoy haciendo un sencillo programa que almacena una serie de campos con un ObjectOutputStream, hasta aki todo va bien. Pero llegado el momento de leer estos objetos del fichero no consigo almacenarlos en un array para luego representar los atributos de dichos objetos.

Necesito ayuda estoy blokeado, a continuacion os muestro el codigo. Gracias

public void actionPerformed(ActionEvent e)
{
try
{
ObjectInputStream entrada=new ObjectInputStream(new BufferedInputStream(new FileInputStream(\"c:\\\\DatosPersonales.txt\")));


while(entrada.readObject()!=null)
{
cont=cont+1;
}
Empleado[] em1=new Empleado[cont];

for(int i=0;i<em1.length;i++)
{
em1[i]=(Empleado)entrada.readObject();
}
t11.setText(em1[cont2].getNombre());
t12.setText(em1[cont2].getApellido());
t13.setText(em1[cont2].getDireccion());
t14.setText(em1[cont2].getDni());
t15.setText(em1[cont2].getEstadoCivil());

cont2=cont2+1;
entrada.close();
}
catch (Exception ex)
{
OptionPane.showMessageDialog(Formulario.this,\"ERROR DE ACCESO\");
}
}

chuidiang
27 de Noviembre del 2005
Hola:

Un posible problema es que para saber cuántos objetos hay, los vas leyendo en el while(entrada.readObject[]) y no te los vas guardando en ningún sitio. Luego construyes el array y cada vez que lees, como ya no quedan más, te devuelve null y no te guarda nada en el array.

Puedes probar a resetear la entrada después de haber construido el array, para hacer que el fichero vuelva a leer desde el principio. Echa un ojo a los métodos mark() y reset() del InputStream.

Otra opción es abrir el fichero nuevamente con otro FileInputStream nuevo.

Y otra opción es no contar cuantos objetos hay. Leelos y metelos en una lista (por ejemplo LinkedList) y luego convertirlo a array con toArray();

LinkedList lista = new LinkedList();
Object elemento = entrada.readObject();
while (elemento != null)
{
lista.add (elemento);
elemento = entrada.readObject();
}
Object [] array = lista.toArray();

Si quieres que el array sea de Elemento en vez de Object, tendras que construirlo tu a partir de la lista con un bucle.

Se bueno

alex
27 de Noviembre del 2005
Muchas gracias chuidiang, pero no se lo que hago mal.
El problema debe estar en el while porque despues de ejecutarlo me salta la excepcion. Si quieres echarle un vistazo te muestro lo ultimo que he hecho.

Respecto al codigo que me has facilitado, me ha gustado la idea (no conocia el LinkedList) pero mi intencion es guardar esos Object como objetos Empleado que hace referencia a una clase del programa para ello empleo casting pero no se si esta bien aplicado.

Estoy hecho un lio...

b3.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
try
{
ObjectInputStream entrada=new ObjectInputStream(new BufferedInputStream(new FileInputStream(\"c:\\\\DatosPersonales.txt\")));

Object elemento=entrada.readObject();

LinkedList lista = new LinkedList();

if(cont==0)//Solo hara esto la primera vez que se pulse el boton
{
while (elemento != null)
{
lista.add (elemento);
elemento = entrada.readObject();
}
System.out.println(cont);//este print ya no lo ejecuta
}

Object[] array= lista.toArray();
Empleado[] emp1 = new Empleado[array.length];

for(int i=0;i<array.length;i++)//cada vez que se pulse el boton se volveran a crear estos arrays, pero tambien se volveran a rellenar
{
emp1[i]=(Empleado)array[i];
}
cont=cont+1;
entrada.close();
}
catch (Exception ex)
{
JOptionPane.showMessageDialog(Formulario.this,\"ERROR DE ACCESO\");
}
}
});

Gracias por la ayuda

[email protected]
27 de Noviembre del 2005
estas leyendo del ObjectInputStream entrada mientras sea distinto de null, esto puede generar una ioexception trata de saber exactamente cuantas veces vas a leer, para leer exactamente la cantidad de objetos que estan almacenados en el archivo. trata de tener un entero como primer objeto del archivo que te indique cuantas veces tenes que leer del mismo. y lo guardes mas objetos dentro del archivo lo incrementas en uno:
mira esto.

public void actionPerformed(ActionEvent e)
{
try
{
ObjectInputStream entrada=new ObjectInputStream(new BufferedInputStream(new FileInputStream(\\\"c:\\\\\\\\DatosPersonales.txt\\\")));

int CantidadALeer = entrada.readObject();

Empleado[] em1=new Empleado[CantidadALeer ];

for(int i=0;i<em1.length;i++)
{
em1[i]=(Empleado)entrada.readObject();
}
t11.setText(em1[cont2].getNombre());
t12.setText(em1[cont2].getApellido());
t13.setText(em1[cont2].getDireccion());
t14.setText(em1[cont2].getDni());
t15.setText(em1[cont2].getEstadoCivil());

cont2=cont2+1;
entrada.close();
}
catch (Exception ex)
{
OptionPane.showMessageDialog(Formulario.this,\\\"ERROR DE ACCESO\\\");
}
}


alexo
27 de Noviembre del 2005
Gracias [email protected] pero me da un error en :

int CantidadALeer = entrada.readObject();

Error: cannot convert from Object to Int

De todas formas he estado probando un monton de cosas y he llegado a la conclusion de que solo puedes hacer un entrada.readObject(). En cuanto intentas lleer otra vez del fichero, salta la excepcion.

Sabria alguien decirme que hace exactamente el readObject(). porque yo cada vez estoy mas confundido.
Solo he conseguido recuperar el primer objeto que tengo guardado en el fichero.