Problema escritura objetos en archivo

Iniciado por panaka, 20 Febrero 2010, 15:40 PM

0 Miembros y 1 Visitante están viendo este tema.

panaka

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.
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



Chuck Norris es tan friki tan friki que ve la televisión en el osciloscopio

Leyer

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.

panaka

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



Chuck Norris es tan friki tan friki que ve la televisión en el osciloscopio

Leyer

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!