Problema de persistencia serializable en Java

Estado
Cerrado para nuevas respuestas.
V

Vera

Guest
Hola!!

Estoy ya terminando el curso, y tenemos que hacer un proyecto en Java sobre una gestión de biblioteca, y una de las condiciones es que nos guarde las publicaciones que le hemos dado de alta en un archivo .dat. (que los serialize).

Bueno, pues teniendo ya una clase de publicaciones, y una aplicación gráfica tipo Swing, donde le estoy programando cada botón, hice un módulo de guardar fichero (write.Object) y en el main las leo (read.Object). Tengo también ArrayList donde guardo todas las publicaciones.

El problema que tengo es que no me guarda las publicaciones, así al cerrar el programa, se me pierden, y mientras se está ejecutando, al abrir el fichero "publicaciones.dat", que lo tengo situado en el mismo paquete donde todas las clases del programa, tampoco aparece nada. Así que no se cómo ponerlo correctamente para que los datos no se pierdan y queden grabados. Os dejo esa parte del código para ver si me podéis echar una mano. Y esta vez voy a notificar los avisos vía email para poder ver las respuestas lo más rápido posible

Código:
    public static ArrayList<Publicaciones> arraypublicaciones = new ArrayList<Publicaciones>();

/* AHORA AQUÍ VIENEN LAS VENTANITAS SWING PARA QUE EL USUARIO PUEDA AÑADIR LAS PUBLICACIONES Y LUEGO LO GUARDA EN EL ARRAY. */

private void guardarFichero(java.awt.event.WindowEvent evt) {                                
        try {
            Publicaciones publicacionesGuardado;
            try (FileOutputStream fosPublicaciones1 = new FileOutputStream("publicaciones.dat")) {
                ObjectOutputStream oosPublicaciones1 = new ObjectOutputStream(fosPublicaciones1);
                for (int y = 0; y < arraypublicaciones.size(); i++) {
                    publicacionesGuardado = arraypublicaciones.get(i);
                    oosPublicaciones1.writeObject(arraypublicaciones);
                }
                fosPublicaciones1.close();
            }
        } catch (IOException ioe) {
            System.out.println(ioe);
        } catch (Exception e) {
            System.out.println(e);
        }
    } 

public static void main(String args[]) {
        
        try {
            Publicaciones publicacionesCargado;
            try (FileInputStream fisPublicaciones1 = new FileInputStream("publicaciones.dat")) {
                ObjectInputStream oisPublicaciones1 = new ObjectInputStream(fisPublicaciones1);
                while(!((publicacionesCargado = (Publicaciones) oisPublicaciones1.readObject()) == null)) {
                   arraypublicaciones.add(publicacionesCargado);
                }
                fisPublicaciones1.close();
            }
        } catch (IOException ioe) {
            System.out.println(ioe);
        } catch (Exception e) {
            System.out.println(e);
        }
}

EDITO: Perdon, se me olvidó poner que también me capta este error la excepción:

java.io.FileNotFoundException: publicaciones.dat (El sistema no puede hallar el archivo especificado)

Bueno, muchas gracias, y estaré muy pendiente.

Un saludo,
Vera.
 
C

calvoClarkson

Guest
En el método de guardarFichero() estás escribiendo en el fichero el arrayPublicaciones cuando deberías escribir publicacionGuardado. Te falta cerrar los ObjectOutputStream y supongo que la clase Publicaciones implementará la interfaz Serializable no?

Un saludo! ;)
 
V

Vera

Guest
Hola calvoClarkson, agradezco tu respuesta!

Ya he modificado el método de guardarFichero tal y como me lo has dicho. Pero no entiendo a qué te refieres con cerrar los ObjectOutputStream, porque en el código tengo esto:

fosPublicaciones1.close();

y según entiendo, es esta línea la que los cierra, o estoy equivocada?

Y sí, la clase Publicaciones y todas las demás clases que tiene el programa llevan el "implements Serializable".

Gracias,

Un saludo.
 
C

calvoClarkson

Guest
Ahí estás cerrando el fichero fosPublicaciones pero no el ObjectOutputStream. Para hacerlo, después de cerrar el fichero, añade la linea:

oosPublicaciones1.close();

Puede que no resuelva tu problema, pero tengo entendido que se ha de hacer así.

Saludos!
 
V

Vera

Guest
Hola de nuevo, calvoClarkson, y agradezco tu respuesta! :coolioju:

Añadí en el código lo que me has dicho, pero aún así no logro resolver mi problema y no se cómo se pone correctamente, así que si se te ocurre otra idea a ti o algún otro miembro, muy bienvenido sea. :coolioju: . Pongo el código de nuevo modificado:

Código:
private void guardarFichero(java.awt.event.WindowEvent evt) {                                
        try {
            Publicaciones publicacionesGuardado = null;
            try (FileOutputStream fosPublicaciones1 = new FileOutputStream("./src/publicaciones.dat")) {
                ObjectOutputStream oosPublicaciones1 = new ObjectOutputStream(fosPublicaciones1);
                for (int y = 0; y < arraypublicaciones.size(); i++) {
                    //publicacionesGuardado=new Publicaciones
                    //publicacionesGuardado = arraypublicaciones.get(i);
                    oosPublicaciones1.writeObject(publicacionesGuardado);
                }
                fosPublicaciones1.close();
                oosPublicaciones1.close();
            }
        } catch (IOException ioe) {
            System.out.println(ioe);
        } catch (Exception e) {
            System.out.println(e);
        }
    } 

public static void main(String args[]) {
        
        try {
            Publicaciones publicacionesCargado;
            try (FileInputStream fisPublicaciones1 = new FileInputStream("./src/publicaciones.dat")) {
                ObjectInputStream oisPublicaciones1 = new ObjectInputStream(fisPublicaciones1);
                while(!((publicacionesCargado = (Publicaciones) oisPublicaciones1.readObject()) == null)) {
                   arraypublicaciones.add(publicacionesCargado);
                }
                fisPublicaciones1.close();
                oisPublicaciones1.close();
            }
        } catch (IOException ioe) {
            System.out.println(ioe);
        } catch (Exception e) {
            System.out.println(e);
        }

Y me sigue saliendo el error:

java.io.FileNotFoundException: .\src\publicaciones.dat (El sistema no puede encontrar el archivo especificado)

Gracias,

Un saludo!
 
C

calvoClarkson

Guest
En el método de guardarFichero() tienes la linea "//publicacionesGuardado = arraypublicaciones.get(i);" comentada (//). Tienes que descomentarla ya que, sino, no estás dando ningún valor a publicacionesGuardado, por tanto esta escribiendo null todo el tiempo en el fichero.

Por otra parte, el FileNotFoundException donde te lo lanza? En qué método de los dos? Supongo que en el main no? ya que si el fichero es FileOutputStream lo crea si no existe...

Poco a poco lo solucionaremos, no te quepa duda!! ;)
 
V

Vera

Guest
Hola!! Gracias por responder!!

Ya he descomentado la línea, es que estaba probando cosillas y se me olvido quitarlo jeje. La excepción no tengo ni idea de donde me la lanza, si es el método o el main :(.

Por lo demás, sigue igual, sin guardarme las Publicaciones que doy de alta.

Un saludo!
 
V

Vera

Guest
Hola!!

Pues deciros que al final me echaron una mano y ya pude poner bien las serializaciones.

Si a alguien le interesa el código o cómo lo he solucionado, que postee y lo pongo.

Un saludo y gracias de todas formas!
 
R

roman30

Guest
Hola!!

Pues deciros que al final me echaron una mano y ya pude poner bien las serializaciones.

Si a alguien le interesa el código o cómo lo he solucionado, que postee y lo pongo.

Un saludo y gracias de todas formas!

naeem
 
Estado
Cerrado para nuevas respuestas.
Arriba Pie