q alguien responda pleaseeeee (alguno debe saber leer archivos)

matiasb
27 de Marzo del 2006
Hola, mi duda que es como deserializar muchos objetos, ya que con lo que hice siempre deserializa al primer objeto gurdado en el archivo.

//este es mi metodo para deserializar
public clientes deserializar(String archivo) throws IOException, ClassNotFoundException{
FileInputStream arch = new FileInputStream(archivo);
ObjectInputStream entrada = new ObjectInputStream(arch);
return ((clientes)entrada.readObject());
}

//... y lo llamo asi:
clientes cliente=new clientes(0,"",0);
cliente = cliente.deserializar(archivo);

//pasa q por mas que lo vuelva a llamar 5 veces para luego mostrarlo siempre me carga al primer objeto del archivo y estaria mostrando siempre al mismo objeto,
y yo quiero mostrar a todos... Como hago??


ya intente lo siguiente pero no dio resultado:

Re: please ayuda (es bastante basica un minutito)
Enviado por x el día 18 de marzo de 2006
para leer todos tienes que hacer un ciclo hasta q no puedas leer mas, algo asi:

Object obj = null;

while ( ( obj = entrada.readObject() ) != null )
{
clientes c = (clientes) obj;
// lo q quieras hacer luego...
}


Responder
Re: Re: please ayuda (es bastante basica un minutito)
Enviado por matiasb el día 18 de marzo de 2006
mira si hago eso me tira un StreamCorruptedException
y si capturo la exception de esta forma:
while ( sigo ){
try{
obj =entrada.readObject();
// lo que quiero hacer luego
}catch(StreamCorruptedException eo){sigo=false;}
}

igual sigo leyendo solo al primer objeto q serialize, ya que entra una sola vez al try...

Por favor sigo escuchando consejos, ya que lei libros donde dice q la clase a serializar debe tener los metodos para ello, bla, bla, bla y no me sale...
estoy desesperando con este tema
Gracias



chuidiang
27 de Marzo del 2006
Hola:

Hace poco me he tropezado con un problema similar al tuyo y he conseguido solucionarlo de una forma rara. Ando investigando el porqué.

Si al escribir en un ObjectOutputStream reaprovecho el dato (un solo new) cambiándole los valores asi

Dato d = new Dato(); // new fuera del for, un solo new.
for (....)
{
d.valor=nuevo valor;
objectOutputStream.writeObject();
}

Al leer resulta que siempre leo el primer dato muchas veces.

Lo he solucionando haciendo el new del Dato cada vez

for (...)
{
Dato d = new Dato(); // new dentro del for. Tantos new como datos
d.valor = nuevo valor
objectOutputStream.write (d);
}

Investigando, parece que también funciona si lo hacemos de la primera forma, pero llamamos a objectOutputStream.reset() despues de escribir cada dato.

Otra cosilla, el tipo de error que te da, tiene más pinta de que estás escribiendo mal.

Se bueno.

chuidiang
27 de Marzo del 2006
Hola:

Hace poco me he tropezado con un problema similar al tuyo y he conseguido solucionarlo de una forma rara. Ando investigando el porqué.

Si al escribir en un ObjectOutputStream reaprovecho el dato (un solo new) cambiándole los valores asi

Dato d = new Dato(); // new fuera del for, un solo new.
for (....)
{
d.valor=nuevo valor;
objectOutputStream.writeObject();
}

Al leer resulta que siempre leo el primer dato muchas veces.

Lo he solucionando haciendo el new del Dato cada vez

for (...)
{
Dato d = new Dato(); // new dentro del for. Tantos new como datos
d.valor = nuevo valor
objectOutputStream.write (d);
}

Investigando, parece que también funciona si lo hacemos de la primera forma, pero llamamos a objectOutputStream.reset() despues de escribir cada dato.

Otra cosilla, el tipo de error que te da, tiene más pinta de que estás escribiendo mal.

Se bueno.

chuidiang
27 de Marzo del 2006
Hola de nuevo:

He seguido jugando y me he tropezado con otra cosa.

Si escribes los datos de una sola vez va todo bien.
Si escribe primero, por ejemplo, 5 datos y cierras el fichero. Luego lo abres para añadir y añadres otros 5, al leer obtienes la excepcion esa de Corrupted.

Por lo visto el ObjectOutputStream, al crearlo, escribe una especide de "cabecera" en el fichero. El ObjectInputStream, al crearlo, la lee.

Si a medio escribir usas un nuevo ObjectoOutputStream, este escribe una cabecera en medio del fichero, que luego es la que da corrupted exception.

Se bueno.

matiasb
27 de Marzo del 2006
//mira lo que yo habia hecho es masomenos lo que vos decis pero no funciona, por mas que guarde a todos los objetos de una sola vez:
//cada vez que guardo un objeto lo llamo asi:
clientes cliente = new clientes(edad,nombre,tel);
cliente.serializar(archivo);
//donde el metodo serializar de la clase clientes es el siguiente:
public void serializar(String archivo) throws IOException{
FileOutputStream arch = new FileOutputStream(archivo,true);
ObjectOutputStream salida = new ObjectOutputStream(arch);
salida.writeObject(this);
}
//es mas si keres dejame tu mail y te envio el programa que cree justamente para aprender este tema, es un programa corto donde la unica intencion es aprender a serializar objetos complejos (es decir objetos que contengan otros objetos), y si tenes hotmail avisame y te doy el mio sino, y estamos mas en contacto con el msn para solucionar este tema.
//como quieras sino seguiremos por aca y esperamos alguna respuesta

chuidiang
27 de Marzo del 2006
Hola:

No puedes hacer new ObjectOutputStream() con cada dato. Al hacer el new, este ObjectOutput mete unos bytes de cabecera en el archivo. Si haces un nuevo new para añadir (el true del final), se mete otra cabecera.
Cuando vas a leer, leera el primero bien y despues te dara un StreamCorruptedException.

En http://www.geocities.com/chuidiang2/ficheros/ObjetosFichero.html hacia el final tienes comentado este problema y una posible solución.

Se bueno