Java - Ejercicio sobre listar,buscar,guardar datos en un fichero SERIALIZADO .dat

 
Vista:

Ejercicio sobre listar,buscar,guardar datos en un fichero SERIALIZADO .dat

Publicado por Iván (3 intervenciones) el 19/01/2019 17:20:08
Buenas, resulta que tengo entre manos un ejercicio de un curso que estoy realizando, este tema va sobre el almacenamiento de datos entonces como acabo de empezar me encuentro muy perdido, les voy a poner lo que se pide en el ejercicio y lo que tengo hecho hasta ahora para ver si alguien puede guiarme en continuar porque llevo ya atascado varios días y no encuentro ninguna solución por internet, allá voy:
El enunciado es el siguiente:
Se trata de hacer una aplicación en Java que gestione los menús de los pacientes que se encuentran ingresados en un hospital. Esos datos, se almacenarán en un fichero serializado, denominado pacientes.dat.

(Recuerda que la serialización es un proceso por el cual un objeto se convierte en una secuencia de bytes con la que más tarde se podrá reconstruir el valor de sus variables. Esto permite guardar un objeto en un fichero. )

Los datos que se van a utilizar son:

Habitación-Cama.
Nombre.
Apellidos
Dieta.


Mediante un menú se podrán realizar determinadas operaciones:

1.Añadir paciente. Esta opción pedirá los datos del paciente y añadirá el registro correspondiente en el fichero. Se debe comprobar que la habitación-cama no este ocupada, es decir no exista en el fichero. Antes verificaremos que el fichero paciente.dat existe en caso contrario se debe crear. Ejemplo:


Escribe la habitación-cama: 100-1
Escribe nombre del paciente: Jorge
Escribe los apellidos del paciente: Alba Ramos
Escribe la dieta del paciente: Sin Sal



2. Listar pacientes. Recorrerá el fichero mostrando los pacientes almacenados en el mismo.

3. Buscar paciente. Pedirá al usuario la habitación y cama que ocupa el paciente a buscar, y comprobará si existe en el fichero. Ejemplo:


Escribe habitación-cama del paciente a buscar: 100-1

Cliente encontrado.
Habitación-Cama: 100-1
Paciente: Jorge Alba Ramos
Tipo de dieta: Sin Sal


4. Borrar el fichero de datos. Elimina del disco el fichero paciente.dat.


5. Salir de la aplicación.


De todo esto ya tengo hecho lo básico, la clase con los constructores, getters y setters, el menú y demás, de los 5 puntos que hay solo he podido realizar el 1,4, y 5, aunque a decir verdad en el 1 tampoco soy capaz de comprobar si la "habitacion-cama" ya está ocupada, pero bueno lo que llevo ya tiempo intentando es el punto 2 y 3, no consigo listar el archivo por mucho que haya cosas dentro, de hecho tengo algo intentando pero que da un error Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 70737200
y el punto 3 igual no se como hacer para buscar ese dato en concreto y mostrar los datos.
Les enseño ahora el código de mis archivos:

pacientes.java
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
package tarea06pacientes;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
 
public class pacientes implements Serializable{
    private static final long serialVersionUID = -2873344211410398459L;
    //atributos
    private String habitacionCama;
    private String nombre;
    private String apellidos;
    private String dieta;
 
 
//Constructor
public pacientes (String habitacionCama, String nombre, String apellidos, String dieta){
    this.habitacionCama = habitacionCama;
    this.nombre = nombre;
    this.apellidos = apellidos;
    this.dieta = dieta;
}
//getters y setters
public String gethabitacionCama()
{
    return habitacionCama;
}
public void sethabitacionCama(String habitacionCama)
{
    this.habitacionCama= habitacionCama;
}
public String getnombre()
{
    return nombre;
}
public void setnombre(String nombre)
{
    this.nombre= nombre;
}
public String getapellidos()
{
    return apellidos;
}
public void setapellidos(String apellidos)
{
    this.apellidos= apellidos;
}
public String getdieta()
{
    return dieta;
}
public void setdieta(String dieta)
{
    this.dieta= dieta;
}
@Override
public String toString()
{
    return "Datos de paciente: Habitacion-cama: " + habitacionCama + "Nombre: " + nombre + "Apellidos: " + apellidos + "Dieta: " + dieta;
}

el principal tarea06pacientes.java:

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
package tarea06pacientes;
 
import java.io.*;
import java.util.InputMismatchException;
import java.util.Scanner;
 
/**
 * @author Iván
 */
 
public class Tarea06Pacientes {
 
    public static void main(String[] args) throws IOException, ClassNotFoundException, EOFException {
        BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
        Scanner linea = new Scanner (System.in);
        boolean bandera = false;
        int opc = 0;
        File fichero = new File("pacientes.dat");
        pacientes obj_p = null;
        while (!bandera)
        {
            try{
            System.out.println("*=================Menú=================*");
            System.out.println("    1. Añadir paciente");
            System.out.println("    2. Listar pacientes");
            System.out.println("    3. Buscar paciente");
            System.out.println("    4.Borrar fichero de datos paciente.dat");
            System.out.println("    5.Salir");
            System.out.println("Que desea realizar: ");
            opc= linea.nextInt();
            }catch(InputMismatchException e)
                    {
                        //teclado.reset();
                        System.out.print("Debes introducir un número del menú");
                    }
            switch (opc) {
                case 1:
                    if (fichero.exists())
                    {
                System.out.println("---------------Introducir Datos del paciente--------------");
                System.out.println("Introduce la habitación-cama: ");
                String habitacionCama = teclado.readLine();
                System.out.println("Introduce el nombre del paciente: ");
                String nombre = teclado.readLine();
                System.out.println("Introduce los apellidos del paciente: ");
                String apellidos = teclado.readLine();
                System.out.println("Introuce la dieta: ");
                String dieta = teclado.readLine();
                obj_p = new pacientes(habitacionCama, nombre, apellidos, dieta);
                    }
                    else
                    {
                        File crear = new File("pacientes.dat");
                        crear.createNewFile();
                        System.out.println("El archivo pacientes.dat ha sido creado");
                    }
                try{
                MiObjectOutputStream oos= new MiObjectOutputStream(new FileOutputStream("pacientes.dat",true));
                oos.writeObject(obj_p);
                oos.close();
                }catch(IOException e){
 
                }
                break;
                case 2:
                        ObjectInputStream ois= new ObjectInputStream(new FileInputStream("pacientes.dat"));
           try{
                while(true){
                pacientes aux=(pacientes)ois.readObject();
                System.out.println(aux.gethabitacionCama());
                System.out.println(aux.getnombre());
                System.out.println(aux.getapellidos());
                System.out.println(aux.getdieta());
                System.out.println("");
            }
        }catch(ClassNotFoundException e){
        }catch(EOFException e){
        }catch(IOException e){
        }
                break;
                case 3:
                break;
                case 4:
                File borrar = new File("pacientes.dat");
                fichero.delete();
                case 5:
                bandera = true;
            }
        }
    }
    }

Y otro necesario para modificar el ObjectOutputStream, quitando la cabecera para poder escribir en el sin que se sobrescriba:
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
package tarea06pacientes;
 
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
 
public class MiObjectOutputStream extends ObjectOutputStream
{
    /** Constructor que recibe OutputStream */
    public MiObjectOutputStream(OutputStream out) throws IOException
    {
        super(out);
    }
 
    /** Constructor sin parámetros */
    protected MiObjectOutputStream() throws IOException, SecurityException
    {
        super();
    }
 
    /** Redefinición del método de escribir la cabecera para que no haga nada.
     * @throws java.io.IOException */
    @Override
    protected void writeStreamHeader() throws IOException
    {
    }
 
}

No sé si alguien podrá ayudarme a arreglar esto, pero gracias de antemano al que se preste a ello.
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

Ejercicio sobre listar,buscar,guardar datos en un fichero SERIALIZADO .dat

Publicado por Tom (1696 intervenciones) el 21/01/2019 21:15:47
Me parece que te estás metiendo en un lío de tres pares, sin saber cómo funciona ObjectOutputStream internamente.
Así que lo mejor qque puedes hacer, en mi opinión, es no tratar de hacer manipulaciones al fichero .dat.
Léelo entero, si existe, en algún momento al inicio del programa y reescríbelo entero antes de finalizar. Mientras, trabaja con los datos que has leído, en memoria.
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