/*
Ejercicio: 2x3x01
Fecha: 04/10/2012
Enunciado:
A partir de la clase punto... implementar los siguientes apartados.
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
public class _2x3x01
{
/*
a) Se pide escribir una clase EjercicioSerial2 donde se defina un método
estático de nombre almacenarColPuntosEnArchivo que reciba una colección
de objetos de la clase Punto.
El método también recibirá por parámetro el nombre de un archivo para
volcar sobre él la INFORMACION de los objetos Punto contenidos en la
colección. El método no capturará ninguna excepción.
*/
public static void almacenarColPuntosEnArchivo(Punto[] pts, String file) throws IOException
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(file), false)); // Revisar: Al poner TRUE no funciona una vez creado el fichero.
for( Punto p : pts )
{
oos.writeObject(p.obtenerCoordX());
oos.writeObject(p.obtenerCoordY());
oos.writeObject(p.obtenerColor());
}
oos.close();
}
/*
b) Añadir a la clase anterior un método estático, de nombre
obtenerArrayListDeArchivo, que reciba por parámetro el nombre de un archivo
con los datos correspondientes a varios objetos de la clase Punto. El método
construirá y devolverá un objeto ArrayList<Punto> con los datos de los puntos
leídos del archivo especificado. El método no capturará ninguna excepción.
*/
public static ArrayList<Punto> obtenerArrayListDeArchivo(String file) throws IOException, ClassNotFoundException
{
FileInputStream fis = new FileInputStream(new File(file));
ObjectInputStream ois = new ObjectInputStream(fis);
ArrayList<Punto> arrayPunto = new ArrayList<>();
while( fis.available() > 0 )
arrayPunto.add(new Punto((Integer)ois.readObject(), (Integer)ois.readObject(), (String)ois.readObject()));
ois.close();
fis.close();
return arrayPunto;
}
/*
c) Añadir a la clase anterior un método main() para comprobar el funcionamiento de
los métodos estáticos de los dos apartados anteriores. Se crearán varios objetos
Punto que se almacenarán en un array. A partir del array se obtendrá una colección
para guardar sus elementos en un archivo. Para finalizar se obtendrá un objeto
ArrayList<Punto> con los objetos Punto creados a partir de los datos almacenados
en el archivo.
*/
public static void main(String[] args) throws IOException, ClassNotFoundException
{
// PRIMERA PARTE:
// Se crea una tabla con puntos:
Punto[] puntos = { new Punto(5, 10, "red"), new Punto(25, 120, "green"), new Punto(45, -10, "white") };
// Se almacena la tabla:
almacenarColPuntosEnArchivo(puntos, "puntos.dat");
// Se lee la informacion guardada y se mete en un ArrayList de Puntos
ArrayList<Punto> arrayPunto = obtenerArrayListDeArchivo("puntos.dat");
// Se imprimen los datos de los puntos:
for( Punto p : arrayPunto )
System.out.println(p.toString());
// SEGUNDA PARTE:
// Se guarda la coleccion de puntos en un fichero2, despues se lee y se recupera en un array2:
almacenarColPuntosComoObjetos(puntos, "puntos2.dat");
ArrayList<Punto> arrayPunto2 = obtenerArrayListDeArchivoComoObjeto("puntos2.dat");
// Se graba el array2 en fichero3, y despues se recupera:
escribirArrayListEnArchivo(arrayPunto2, "puntos3.dat");
ArrayList<Punto> arrayPunt3 = leerArrayListDeArchivo("puntos3.dat");
// Se imprime el array3:
System.out.println("\n" + arrayPunt3);
}
/*
d) Escribir un método de nombre almacenarColPuntosComoObjetos que reciba por parámetro
una colección de objetos Punto y el nombre del archivo donde se almacenarán.
El método escribirá directamente cada objeto Punto al archivo.
*/
public static void almacenarColPuntosComoObjetos(Punto[] pts, String file) throws IOException
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(file), false)); // Revisar: Al poner TRUE no funciona una vez creado el fichero.
for( Punto p : pts )
oos.writeObject(p);
oos.close();
}
/*
e) Escribir un método de nombre obtenerArrayListDeArchivoComoObjeto que reciba por
parámetro el nombre de un archivo donde se encuentran almacenados varios objetos de la
clase Punto. El método leerá los objetos del archivo y los almacenará en un ArrayList
que, finalmente será devuelto.
*/
public static ArrayList<Punto> obtenerArrayListDeArchivoComoObjeto(String file) throws IOException, ClassNotFoundException
{
FileInputStream fis = new FileInputStream(new File(file));
ObjectInputStream ois = new ObjectInputStream(fis);
ArrayList<Punto> arrayPunto = new ArrayList<>();
while( fis.available() > 0 )
arrayPunto.add((Punto)ois.readObject());
ois.close();
fis.close();
return arrayPunto;
}
/*
f) Escribir un método de nombre escribirArrayListEnArchivo, que reciba por parámetro
un objeto ArrayList de objetos Punto y el nombre del archivo donde se almacenará.
El método almacenará directamente el objeto ArrayList sobre el archivo recibido.
No se capturará ninguna excepción.
*/
public static void escribirArrayListEnArchivo(ArrayList<Punto> arrayPunto, String file) throws IOException
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(file), false)); // Revisar: Al poner TRUE no funciona una vez creado el fichero.
oos.writeObject(arrayPunto);
oos.close();
}
/*
g) Escribir un método de nombre leerArrayListDeArchivo que reciba por parámetro el nombre
de un archivo en el que se ha escrito previamente un objeto ArrayList que almacena objetos
de la clase Punto. El método leerá el objeto ArrayList del archivo y lo devolverá.
No se capturará ninguna excepción.
*/
public static ArrayList<Punto> leerArrayListDeArchivo(String file) throws IOException, ClassNotFoundException
{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(file)));
ArrayList<Punto> arrayPunto = (ArrayList<Punto>)ois.readObject(); // Revisar, marca conversion descontrolada
ois.close();
return arrayPunto;
}
}