Ejercicio 1: Serialización de vehículos
Aplicación que almacena datos de vehículos (matrícula, marca, tamaño de depósito y modelo) en un fichero mediante serialización. Los datos se añaden sin sobrescribir ejecuciones anteriores, el campo deposito se marca como transient para que no se persista, y la aplicación muestra los datos guardados.
Vehiculo.java:
import java.io.Serializable;
public class Vehiculo implements Serializable{
private String matricula;
private String marca;
private transient double deposito;
private String modelo;
public Vehiculo(){}
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;
}
}
EscribirSinCabecera.java:
Para poder añadir objetos a un fichero ya existente sin duplicar la cabecera de serialización, se extiende ObjectOutputStream sobreescribiendo writeStreamHeader() con un cuerpo vacío.
import java.io.*;
public class EscribirSinCabecera extends ObjectOutputStream{
public EscribirSinCabecera(OutputStream out) throws IOException{
super(out);
}
public EscribirSinCabecera() throws IOException, SecurityException{
super();
}
protected void writeStreamHeader() throws IOException{}
}
Main.java:
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
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()){
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();
}
ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("vehiculos.dat"));
do{
try{
Vehiculo vLeidos= (Vehiculo)entrada.readObject();
System.out.println(nuevoVehiculo);
System.out.println(vLeidos);
System.out.println(finVehiculo);
}
catch(EOFException e){
finFichero = true;
}
}while(!finFichero);
entrada.close();
}
catch(IOException e){
e.printStackTrace();
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
}
}
Ejercicio 2: Externalización de vehículos
Replica el ejercicio anterior usando la interfaz Externalizable, que permite controlar manualmente qué campos se serializan implementando writeExternal() y readExternal(). En este caso, el campo deposito no se serializa porque no se incluye en writeExternal().
Vehiculos.java:
import java.io.*;
import java.util.*;
public class Vehiculos implements Externalizable{
private String matricula;
private String marca;
private double deposito;
private String modelo;
public Vehiculos(){}
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);
}
}
EscribirSinCabecera.java:
import java.io.*;
public class EscribirSinCabecera extends ObjectOutputStream{
public EscribirSinCabecera(OutputStream out) throws IOException{
super(out);
}
public EscribirSinCabecera() throws IOException, SecurityException{
super();
}
protected void writeStreamHeader() throws IOException{}
}
Main.java:
import java.io.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException{
Vehiculos v = new Vehiculos();
Scanner sc = new Scanner(System.in);
boolean finFichero = false;
File ve = new File("vehiculos.dat");
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();
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();
}
ObjectInputStream entrada = new ObjectInputStream(new FileInputStream("vehiculos.dat"));
do{
try{
v.readExternal(entrada);
v.muestraInfo();
}
catch(EOFException e){
finFichero = true;
}
}while(!finFichero);
entrada.close();
}
}