Foro de elhacker.net

Programación => Java => Mensaje iniciado por: panaka en 20 Febrero 2010, 15:40 pm



Título: Problema escritura objetos en archivo
Publicado por: panaka en 20 Febrero 2010, 15:40 pm
Buenas, tengo un problema a la hora de escribir objetos en archivo, me explico, escribo una serie de objetos, para ello abro los stream y sus fileOutput correspondientes y todo bien, o eso parece, ya que al intentar leer del archivo solo me lee los que han sido escritos por el primero stream, cuando en el archivo si figuran los demas objetos, es como si la estructura del archivo al escribir el 2º stream se alterara para los sucesivos.

Os pongo un fragmento del codigo.
Código:
public class AdministracionElementos {
public static int numPeliculas = 0;

public static void main(String[] args){
Pelicula p1 = new Pelicula("Expediente XXXXXXXXX","Señor X",1000.0,"Cihhhhhencia-Ficcion");
Pelicula p2 = new Pelicula("Expediente X","Señor X",100.0,"Ciencia-Ficcion");
Pelicula p3 = new Pelicula("Avatar","Señor Y",222.0,"Ciencia-Ficcion");




try{
//Añadimos pelicula
añadirPeliculaArchivo(p2);
añadirPeliculaArchivo(p3);
//Leemos peliculas
//for(int i = 1;i <= numPeliculas;i++){
leerPeliculasArchivo();
//}

}catch(IOException excIO){
System.out.println("No se ha podido realizar la operacion de escritura");
}catch(ClassNotFoundException excNF){

}
}


public static void añadirPeliculaArchivo(Pelicula pelGrabar) throws IOException{
//Creo Stream de escritura
FileOutputStream fileOut = new FileOutputStream("datosPeliculas",true);
//Creo el escritor de objetos
ObjectOutputStream salidaObj = new ObjectOutputStream(fileOut);
salidaObj.writeObject(pelGrabar);

numPeliculas =numPeliculas + 1;

salidaObj.flush();
salidaObj.close();
fileOut.close();
}

public static void leerPeliculasArchivo() throws IOException, ClassNotFoundException{
Pelicula auxiliar;
//Extraccion de archivo
FileInputStream fileInp = new FileInputStream("datosPeliculas");
ObjectInputStream entradaObj = new ObjectInputStream(fileInp);
System.out.println(numPeliculas);
for(int i = 1;i <= numPeliculas;i++){
auxiliar = (Pelicula) entradaObj.readObject();
auxiliar.mostrarPelicula();
}



entradaObj.close();
fileInp.close();
}

Nota: lo del numero de peliculas deberia ir en otro archivo para mantener memoria pero aun "adaptandolo" para que funcione no va, este no es el error.
Todas las clases que lo necesitan implementan Serializable.

Saludos y gracias


Título: Re: Problema escritura objetos en archivo
Publicado por: Leyer en 20 Febrero 2010, 18:36 pm
este problema es muy comun el asunto parece ser que cuando haces la segunda pasada para agregar este agrega datos "desconocidos" al archivo evitando asi la lectura correcta la forma de solucionarlo seria agregando todos los objetos que quieres agregar al archivo de una sola vez y asi se evitaria el error.

Un Saludo.


Título: Re: Problema escritura objetos en archivo
Publicado por: panaka en 20 Febrero 2010, 18:41 pm
Leyer ya improvise una solucion y tiene miga, me explico, la solucion que planteas aunque es valida es del todo inviable para grandes volumenes de datos por al carga que supone en la redundancia de informacion.

El problema venia en que al escribir por primera vez un stream tambien se escribe el header, he ahi la razon de porque erraba al intentar extraer el error del 2º stream, se toapaba con la cabecera y chascaba, solucion que no me convence pero es la unica que tengo ha sido meter mano a la zona protegida de ObjectInputStream para cargarme el metodo writeStreamHeader()  que me agrega la cabecera que escribe y asi no tener problemas, no es muy elegante pero funciona.

Saludos


Título: Re: Problema escritura objetos en archivo
Publicado por: Leyer en 20 Febrero 2010, 19:02 pm
si es cierto! y Exapto por eso es el problema tu solucion me parece ser factible, es una forma de solucionar el problema  para grandes volumenes.

Saludos!