Java - Serialización de objetos en java

   
Vista:
Imágen de perfil de Javier

Serialización de objetos en java

Publicado por Javier (14 intervenciones) el 24/02/2016 18:40:31
Hola, tengo que crear un archivo en java y en él guardar objetos. La aplicación te pide que saques por consola un menú para crear fichero, añadir clientes, listar clientes, borrar fichero y salir de la aplicación, es decir, (si pulsas 1 crea el archivo, si pulsas 2 se añade un nuevo cliente.... etc) En la parte dónde estoy atascado es a la hora de guardar objetos en el fichero. Yo creo un objeto persona de la clase que he creado Clientes y se guardan los datos de esa persona (instancia de la clase Clientes) sin problema(nombre, nif, teléfono, dirección...). El problema es que cuando quiero volver a crear otra instancia de la clase Clientes y guardar la información, ésta se guarda pero la instancia anterior es borrada y sólo guarda los datos de la última instancia de la clase Clientes.
He visto por internet que muchos guardan los objetos un un ArrayList pero el temario de ese ejercicio no habla nada de los ArrayList por lo que intuyo que se tiene que hacer sin seguir esta manera. ¿Qué es lo que estoy haciendo mal?
Supongo que el problema tiene que ser que no creo una instancia nueva del objeto cada vez que quiero introducir un nuevo cliente, sino que cambio los valores a la misma instancia pero no sé cómo podría hacer un nuevo objeto cada vez que quiera introducir un nuevo cliente.
Os dejo el código para que lo podáis ver y decirme en dónde estoy fallando.

Clase Clientes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.Serializable;
 
public class Clientes implements Serializable{
 
    private String nif;
    private String nombre;
    private String telefono;
    private String direccion;
    private float deuda;
 
 
    public String getNif(){
        return nif;
    }
    public void setNif(String nif){
        this.nif = nif;
    }
    public String getNombre(){
        return nombre;
    }
    public void setNombre(String nombre){
        this.nombre = nombre;
    }
    public String getTelefono(){
        return telefono;
    }
    public void setTelefono(String telefono){
        this.telefono = telefono;
    }
    public String getDireccion(){
        return direccion;
    }
    public void setDireccion(String direccion){
        this.direccion = direccion;
    }
    public float getDeuda(){
        return deuda;
    }
    public void setDeuda(float deuda){
        this.deuda = deuda;
    }
    @Override
    public String toString(){
        return "Nombre: "+getNombre()+", NIF: "+getNif()+", Dirección: "+getDireccion()+", Teléfono: "+getTelefono()+", Deuda: "+getDeuda();
 
    }
}

Clase principal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import java.io.*;
 
public class Tarea6 {
    static BufferedReader dato = new BufferedReader(new InputStreamReader(System.in));
    private static File archivo =new File("clientes.dat");
 
 
   public static void main (String [] args) throws ClassNotFoundException {
       int opcion=1;
        do{
            if(opcion <1 || opcion >5)
                System.err.println("Introduzca únicamente un valor entre 1 y 5");
            try{
                System.out.println("Menú principal");
                System.out.println("1 - Crear fichero");
                System.out.println("2 - Añadir cliente");
                System.out.println("3 - Listar clientes");
                System.out.println("4 - Borrar fichero");
                System.out.println("5 - Salir de la aplicación");
 
                System.out.println("Introduzca la opción deseada (1-6)");
                opcion=Integer.parseInt(dato.readLine());
                switch(opcion){
                    case 1:
                        crearArchivo();
                        break;
                    case 2:
                        introducirCliente();
                        break;
                    case 3:
                        mostrarClientes();
                        break;
                    case 4:
 
                        break;
                    case 5:
                        System.out.println("GRACIAS POR UTILIZAR LA APLICACIÓN");
                        break;
 
                }
            }catch (NumberFormatException nfe){
                System.err.println("Sólo son válidos valores enteros entre 1 y 6");
            }catch(IOException ioe){
                System.err.println("Error de entrada de datos: "+ioe.getMessage());
            }
        }while(opcion !=5);
 
 
 
 
   }
 
   private static void crearArchivo(){
       try{
           if(!archivo.exists()){
               archivo.createNewFile();
               System.out.println("Archivo creado");
           }else System.out.println("El fichero ya existe");
       }catch(Exception e){
           System.err.println("Error al crear archivo " + e.getMessage());
       }
   }
 
   private static void introducirCliente(){
       try{
       ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(archivo));
       Clientes persona = new Clientes();
 
 
       System.out.println("Introduzca el NIF del cliente: ");
       persona.setNif(dato.readLine());
       System.out.println("Introduzca el nombre del cliente: ");
       persona.setNombre(dato.readLine());
       System.out.println("Introduzca el telefono del cliente: ");
       persona.setTelefono(dato.readLine());
       System.out.println("Introduzca la dirección del cliente: ");
       persona.setDireccion(dato.readLine());
       System.out.println("Introduzca la deuda del cliente: ");
       persona.setDeuda(Float.parseFloat(dato.readLine()));
 
       oos.writeObject(persona);
       oos.close();
       }catch(Exception e){
           System.err.println("ERROR");
       }
   }
 
   private static void mostrarClientes() throws IOException, ClassNotFoundException{
 
           ObjectInputStream ois = new ObjectInputStream(new FileInputStream(archivo));
           Object aux = ois.readObject();
      System.out.println(aux);
   }
 
   }


Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Serialización de objetos en java

Publicado por Jorge (9 intervenciones) el 25/02/2016 03:25:40
ObjectInputStream te llena de datos el inicio del fichero, así que debes saltarte esos datos. Prueba a usar un editor hexadecimal para sortear el problema. Es que recuerdo que había que hacer malabares para trabajar con esa clase. Yo que tú, usaría el acceso directo con RandomAccessFile y no me complicaría la vida; tu programa es tan simple, que no merece la pena calentarse la cabeza.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Serialización de objetos en java

Publicado por arck (145 intervenciones) el 25/02/2016 11:34:01
A ver, tenes un problema, la clase ObjectOutputStream lo que hace es generar un buffer intermedio, por ello cuando insertas un cliente y lo guardas al inicio del fichero.

¿Te obligan a usar esta clase?
Si lo que haces es generar un arraylist con todos los clientes y después lo guardas, pues te funcionará.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier

Serialización de objetos en java

Publicado por Javier (14 intervenciones) el 26/02/2016 01:14:28
El ejercicio en sí no dice cómo debe de crearse el programa por lo que no es totalmente obligatorio utilizar una forma u otra, pero en el tema de ese ejercicio no se ha hablado nada de los arraylist y por eso supongo que no habría que hacerlo utilizándolos. No se qué intentar ya porque la verdad es que el tema es bastante pobre y no explican para nada bien el tema de flujos y para alguien nuevo pues es bastante complejo al principio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier

Serialización de objetos en java

Publicado por Javier (14 intervenciones) el 26/02/2016 01:18:08
Me podrías poner un ejemplo de cómo podría escribir y leer un objeto utilizando RandomAccessFile? He buscado por internet pero la verdad es que no he visto cómo hacerlo y en los temarios que nos dan está muy mal explicado, apenas una página para hablar un poco de RandomAccessFile. Muchas gracias de antemano y perdona mi ignorancia pero soy bastante nuevo en esto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Serialización de objetos en java

Publicado por arck (145 intervenciones) el 26/02/2016 09:40:20
Creo que esto te servirá.
Fíjate que de tu fichero solo lees una vez, no lees mas.
A este le pasa mas o menos como a ti. Recuerda generar lista de array, aqui mas o menos te lo explican.

http://www.forosdelweb.com/f45/quisiera-leer-todos-objetos-guardados-archivo-bin-1112682/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar