2. Objetivo
Analizar la serialización de objetos en java mediante la
investigación en la web para conocer la utilidad de las
clases ObjectOutputStream y ObjectInputStream.
3. Introducción
Para que un objeto pueda ser almacenado en el disco,
es necesario que la clase a la que pertenece sea
serializable. Esta característica la poseen todas
aquellas clases que implementen la interfaz
java.io.Serializable.
La interfaz Serializable no contiene ningún método,
basta que una clase la implemente para que sus
objetos puedan ser serializados por la máquina virtual
y por tanto ser almacenados en el disco.
4. Flujos de Datos
•Existen dos tipos de flujos de
datos: los binarios o de bytes, y
los de texto.
•En los flujos de datos de bytes
la información que fluye está en
formato binario.
•Los flujos de datos de bytes se
subdividen en flujos de datos de
entrada y flujos de datos de
salida.
•Los primeros serían flujos que nos
proporcionan datos, es decir,
entradas de nuestro programa.
•Los segundos serían flujos en los
cuales nuestro programa escribe
datos, es decir, salidas de nuestro
programa.
5. Flujos de Salida de Bytes
•En la figura podemos ver la
jerarquía de los flujos de salida
de bytes de Java.
•La clase padre de todos los
flujos de salida de Java es
OutputStream . Se trata de una
clase abstracta (por tanto no
vamos a poder crear objetos de
ella porque su funcionalidad está
"incompleta") que representa
un flujo de datos de salida
binario cualquiera.
Sus métodos son los siguientes:
close(): cierra el flujo de datos.
flush(): sincroniza este flujo de datos con el dispositivo al cual
se están escribiendo los datos.
write(byte[] b): escribe el array b de bytes que se le pasa como
argumento al flujo de salida.
write(byte[] b, int off, int len): escribe len bytes del array b al
flujo de salida, empezando a escribirlos en el offset indicado
por off .
abstract void write(int b): escribe 1 byte al flujo de salida.
6. Subclases de OutputStream
ByteArrayOutputStream
FileOutputStream: flujo de salida para la escritura de
datos a un objeto de tipo File .
FilterOutputStream
ObjectOutputStream: encapsula otro objeto de tipo
OutputStream y permite escribir objetos Java
completos al flujo de datos de salida representado
por el OutputStream correspondiente.
PipedOutputStream
7. Flujos de Entrada de Bytes
En la figura podemos ver la
jerarquía de los flujos de entrada
de bytes de Java.
La clase padre de todos los flujos
de entrada de Java es
InputStream. Se trata de una
clase abstracta que representa
un flujo binario de datos de
salida.
Sus métodos son los siguientes:
close(): cierra el flujo de datos.
int available(): devuelve una estimación del
número de bytes que se pueden leer de este flujo
de datos de entrada sin producirse un bloqueo.
int read(): lee un único byte.
abstract int write(byte[] b, int off, int len): lee
hasta len bytes del flujo de entrada y los almacena
en el array b , empezando a leer los datos en el
offset indicado por off .
skip(long n): ignora los próximos n bytes del flujo
de entrada.
8. Subclases de InputStream
Las clases hijas más comunes son
ByteArrayInputStream , FileInputStream ,
FilterInputStream , InputStream , ObjectInputStream
y PipedInputStream . Las más empleadas son
ObjectInputStream y DataInputStream.
ObjectInputStream se emplea para leer objetos de un
flujo de entrada.
9. ObjectOutputStream
Serializa al objeto, para esto es necesario disponer de
FileOutputStream asociado al fichero donde se va a
realizar la escritura.
Una vez hecho esto, para poder escribir en el archivo
el objeto, se usa el comando writeObject(Object b).
11. ObjectInputStream
Realiza la reconstrucción del objeto almacenado en el
fichero, se debe tener un objeto FileInputStream para
asociado al fichero de donde vamos a sacar la
información.
Mediante el método readObject(), se puede obtener
el objeto que tiene ese fichero
12. Uso del ObjectInputStream
Object x;
try {
des= new ObjectInputStream(new FileInputStream("Registro.txt"));
x = des.readObject();
if(x!=null)
{
alumnos=(ArrayList<Alumno>)x;
}
des.close();
} catch (IOException ex) {
//Logger.getLogger(Serializar.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
//Logger.getLogger(Serializar.class.getName()).log(Level.SEVERE, null, ex);
}
13. Conclusiones
En esta presentación se observa la importancia del
almacenamiento de datos de modo persistente en los
programas Java. También puede usarse para obtener
entrada del usuario usando la consola, aunque en la
actualidad es mucho más común emplear interfaces
gráficas para interactuar con el usuario .