No es un bug, es una característica no documentada

13/10/15

Acceso a datos. Ejercicios (III). Persistencia

23:05 Posted by Inazio , No comments
1. Lectura y escritura de objetos con serialización. Crea una aplicación que almacene los datos básicos de un vehículo como la matricula (String), marca (String), tamaño de depósito (double) y modelo (String).
Los datos anteriores se pedirán por teclado y se irán añadiendo al fichero (no se sobrescriben los datos) cada vez que ejecutemos la aplicación.
El fichero siempre será el mismo, en todos los casos. El atributo tamaño de depósito no se incluirá en el fichero (aun así debe pedirse por teclado).
La aplicación deberá también poder visualizar los datos del fichero.

ARCHIVO VEHICULO.JAVA

import java.io.Serializable;

public class Vehiculo implements Serializable{

     // Propiedades
     private String matricula;
     private String marca;
     private transient double deposito;
     private String modelo;
    
     // Constructor
     public Vehiculo(){}
    
     // Métodos
     public void setMatricula(String matricula){
          this.matricula = matricula;
     }
    
     public void setMarca(String marca){
          this.marca = marca;
     }
    
     public void setDeposito(double deposito){
          this.deposito = deposito;
     }
    
     public void setModelo(String modelo){
          this.modelo = modelo;
     }
    
     public String toString(){
          return  "Matricula: " + matricula + ". Marca: " + marca + ". Modelo: " + modelo;
     }
}

ARCHIVO ESCRIBIRSINCABECERA.JAVA

import java.io.*;

public class EscribirSinCabecera extends ObjectOutputStream{

     // Constructor
     public EscribirSinCabecera(OutputStream out) throws IOException{
          super(out);
     }
    
     public EscribirSinCabecera() throws IOException, SecurityException{
          super();
     }
    
     // Métodos
     /*
      * (non-Javadoc)
      * @see java.io.ObjectOutputStream#writeStreamHeader()
      *
      * Redefino el método de escribir la cabecera para que no haga nada
      */
     protected void writeStreamHeader() throws IOException{}
    
}

ARCHIVO MAIN.JAVA

import java.io.*;
import java.util.Scanner;

public class Main {

     public static void main(String[] args) {

          // Propiedades
          String marca;
          String modelo;
          String matricula;
          double deposito;
          Vehiculo v = new Vehiculo();
          Scanner sc = new Scanner(System.in);
          String nuevoVehiculo = "Datos del vehículo:";
          String finVehiculo = "\n";
         
          System.out.println("Escribe marca del coche");
          v.setMarca(sc.nextLine());
          System.out.println("Escribe modelo del coche");
          v.setModelo(sc.nextLine());
          System.out.println("Escribe matricula del coche");
          v.setMatricula(sc.nextLine());
          System.out.println("Escribe capacidad del deposito");
          v.setDeposito(Double.parseDouble(sc.nextLine()));
          boolean finFichero = false;
          File ve = new File("vehiculos.dat");
         
          try{
                if (ve.exists()){
                     // Escritura de datos
                     /* EscribirSinCabecera = ObjectOutputStream editado para que no escriba nada en la cabecera del fichero
                      * y poder leer correctamente los datos
                      */
                     EscribirSinCabecera salida = new EscribirSinCabecera(new FileOutputStream("vehiculos.dat", true));
                     salida.writeObject(v);
                     salida.close();
                }
                else{
                     ObjectOutputStream salida = new ObjectOutputStream(new FileOutputStream("vehiculos.dat", true));
                     salida.writeObject(v);
                     salida.close();
                    
                }
                // Lectura de datos
                ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("vehiculos.dat"));
               
                // Mientras haya objetos dentro del fichero leído
                do{
                     try{
                          Vehiculo vLeidos= (Vehiculo)entrada.readObject();
                          System.out.println(nuevoVehiculo);
                          System.out.println(vLeidos);
                          System.out.println(finVehiculo);
                     }
                    catch(EOFException e){
                          finFichero = true; // Controlo la salida del bucle para dejar de leer
                     }
                }while(!finFichero);
               
                entrada.close();
          }
          catch(IOException e){
                e.printStackTrace();
          }
          catch(ClassNotFoundException e){
                e.printStackTrace();
          }
     }

}


2. Lectura y escritura de objetos. Externalización. Realizar el mismo ejercicio anterior pero utilizando la interfaz EXTERNALIZABLE.

ARCHIVO VEHICULOS.JAVA

import java.io.*;
import java.util.*;

public class Vehiculos implements Externalizable{

     // Propiedades
     private String matricula;
     private String marca;
     private double deposito;
     private String modelo;
    
     // Constructor
     public Vehiculos(){}
    
     // Métodos
     public void setMatricula(String matricula){
          this.matricula = matricula;
     }
    
     public void setMarca(String marca){
          this.marca = marca;
     }
    
     public void setDeposito(double deposito){
          this.deposito = deposito;
     }
    
     public void setModelo(String modelo){
          this.modelo = modelo;
     }
    
     public void writeExternal(ObjectOutput out) throws IOException{
          out.writeObject(matricula);
          out.writeObject(marca);
          out.writeObject(modelo);
     }
    
     public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException{
          matricula = (String)in.readObject();
          marca = (String)in.readObject();
          modelo = (String)in.readObject();
     }
    
     public void muestraInfo(){
          System.out.println("Marca: " + marca + ". Modelo: " + modelo + ". Matricula: " + matricula);
     }
}

ARCHIVO ESCRIBIRSINCABECERA.JAVA

import java.io.*;

public class EscribirSinCabecera extends ObjectOutputStream{

     // Constructor
     public EscribirSinCabecera(OutputStream out) throws IOException{
          super(out);
     }
    
     public EscribirSinCabecera() throws IOException, SecurityException{
          super();
     }
    
     // Métodos
     /*
      * (non-Javadoc)
      * @see java.io.ObjectOutputStream#writeStreamHeader()
      *
      * Redefino el método de escribir la cabecera para que no haga nada
      */
     protected void writeStreamHeader() throws IOException{}
    
}

ARCHIVO MAIN.JAVA

import java.io.*;
import java.util.Scanner;

public class Main {

     public static void main(String[] args) throws IOException, ClassNotFoundException{
          // Propiedades
          Vehiculos v = new Vehiculos();
          Scanner sc = new Scanner(System.in);
          boolean finFichero = false;
          File ve = new File("vehiculos.dat");
          // Código
          System.out.println("Escribe marca del coche");
          v.setMarca(sc.nextLine());
          System.out.println("Escribe modelo del coche");
          v.setModelo(sc.nextLine());
          System.out.println("Escribe matricula del coche");
          v.setMatricula(sc.nextLine());
          System.out.println("Escribe capacidad del deposito");
          v.setDeposito(Double.parseDouble(sc.nextLine()));
          sc.close(); // Cierro el scanner
         
          // Escribo en fichero
          if (ve.exists()){
                EscribirSinCabecera salida = new EscribirSinCabecera(new FileOutputStream("vehiculos.dat", true));
                v.writeExternal(salida);
                salida.close();
          }
          else{
                ObjectOutputStream salida = new ObjectOutputStream(new FileOutputStream("vehiculos.dat", true));
                v.writeExternal(salida);
               salida.close();
          }
         
          // Leo en fichero
          ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("vehiculos.dat"));
          do{
                try{
                     v.readExternal(entrada);
                     v.muestraInfo();
                }
                catch(EOFException e){
                     finFichero = true;
               }
          }while(!finFichero);
    
          entrada.close();    
     }

}

0 comments:

Publicar un comentario