Está en la página 1de 52

Departamento de

Matemticas y
Computacin Grado en Informtica Programacin de Bases de Datos
OutputStream os = new OutputStream();
Java IO - Streams

JDBC por Francisco J. Garca Izquierdo. Universidad de la Rioja.
Departamento de Matemticas y Computacin. se encuentra bajo una
Licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual
3.0 Unported.
Grado en Informtica Programacin de Bases de datos 2 Francisco J. Garca Izquierdo
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Agenda
Grado en Informtica Programacin de Bases de datos 3 Francisco J. Garca Izquierdo
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Agenda
Grado en Informtica Programacin de Bases de datos 4 Francisco J. Garca Izquierdo
Vamos a utilizar Java como lenguaje de programacin de la
asignatura
Una de las caractersticas intrnsecas de los sistemas distribuidos:
computadores conectados que se intercambian mensajes
Las conexiones de red en Java son tratadas como streams (como si
fuesen ficheros)
A travs de esos streams se envan y reciben los mensajes (como
si grabsemos o leysemos ficheros)
Adems la informacin intercambiada entre los nodos estar, en
muchas ocasiones, almacenada en ficheros.
Es imprescindible un dominio de los APIs de entrada/salida de Java
Justificacin
Grado en Informtica Programacin de Bases de datos 5 Francisco J. Garca Izquierdo
La E/S de Java se realiza a travs de flujos (streams).
Secuencia ordenada de bytes
Estos pueden ser de entrada (InputStream) o de
salida (OutputStream).
Independizan a los objetos de origen/destino de los
datos.
Las clases de E/S se encuentran en el paquete
java.io.
Los mtodos de OutputStream (y tambin de
InputStream) lanzan la excepcin IOException ante
cualquier fallo relacionado con el intento de escritura o
lectura
Streams
Grado en Informtica Programacin de Bases de datos 6 Francisco J. Garca Izquierdo
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Agenda
Grado en Informtica Programacin de Bases de datos 7 Francisco J. Garca Izquierdo
Clase abstracta de la que derivan los dems flujos de salida.
Fundamentalmente ofrece los siguientes servicios:

public abstract void write(int b) throws IOException
public void write(byte b[]) throws IOException
public void write(byte b[], int off, int len) throws IOException
public void flush() throws IOException
public void close() throws IOException

Como OutputStream es una clase abstracta.
Dnde se enva un byte que se escribe a travs de un OutputStream?
Depender del tipo del stream.
Hay varias clases que derivan de OutputStream y redefinen el mtodo write
para darle una implementacin distinta:
FileOutputStream
ByteArrayOutputStream
PipedOutputStream
sun.net.TelnetOutputStream

La clase OutputStream
Grado en Informtica Programacin de Bases de datos 8 Francisco J. Garca Izquierdo

Grado en Informtica Programacin de Bases de datos 9 Francisco J. Garca Izquierdo
El FileOutputStream redefine el
mtodo write para enviar el byte a un
fichero.



Vanse los constructores disponibles en la
ayuda de Java.
FileOutputStream
FileOutputStream f;
f = new FileOutputStream(Datos.dat);
for (int i = 0; i < 100; i++)
f.write(i);
f.close();
Grado en Informtica Programacin de Bases de datos 10 Francisco J. Garca Izquierdo
El ByteArrayOutputStream redefine el mtodo write para enviar
el byte a un array dinmico (en memoria).
Aade los mtodos:
public byte[] toByteArray()
public int size()
Ejemplo
ByteArrayOutputStream
ByteArrayOutputStream ba;
ba = new ByteArrayOutputStream();
for (int i = 0; i < 100; i++)
ba.write(i);
ba.close();

// Con ba.toByteArray() accedemos al array
// con los bytes escritos
Grado en Informtica Programacin de Bases de datos 11 Francisco J. Garca Izquierdo
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Agenda
Grado en Informtica Programacin de Bases de datos 12 Francisco J. Garca Izquierdo
Un filtro de salida es un OutputStream al cual se le
asocia en su constructor otro OutputStream (patrn
Decorator)
Los filtros reenvan toda la informacin que reciben a su
OutputStream asociado, previa realizacin de algn
tipo de transformacin en la misma.
De esta manera cada filtro aade una funcionalidad
adicional al OutputStream que encapsula.
Se pueden encadenar varios filtros para obtener varias
funcionalidades combinadas.
FilterOutputStream
Grado en Informtica Programacin de Bases de datos 13 Francisco J. Garca Izquierdo

FileOutputStream ByteArrayOutputStream TelnetOutputStream PipedOutputStream
FilterOutputStream
BufferedOutputStream PrintStream DataOutputStream GZIPOutputStream
OutputStream
+f lush:void
+write:void
+close:void
Grado en Informtica Programacin de Bases de datos 14 Francisco J. Garca Izquierdo
BufferedOutputStream
FileOutputStream FileOutputStream
GZIPOutputStream
BufferedOutputStream
FileOutputStream
Composicin de filtros
OutputStream out =








new FileOutputStream(



f.txt) ;






new CipherOutputStream(






)



new GZIPOutputStream(









)
CipherOutputStream CipherOutputStream
Grado en Informtica Programacin de Bases de datos 15 Francisco J. Garca Izquierdo
Los mtodos de la clase OutputStream solo permiten enviar
bytes.
Cualquier otro tipo debern descomponerse en una secuencia de
bytes antes de poder escribirse.

FileOutputStream out = new FileOutputStream(datos.dat);
int i;
out.write((i >>> 24) & 0xFF);
out.write((i >>> 16) & 0xFF);
out.write((i >>> 8) & 0xFF);
out.write((i >>> 0) & 0xFF);

// Idem para String, float, etc.

Filtro DataOutputStream
Grado en Informtica Programacin de Bases de datos 16 Francisco J. Garca Izquierdo
La clase DataOutputStream aade la funcionalidad de poder
enviar todos los tipos primitivos directamente.

void writeBytes(String s) throws IOException
void writeBoolean(boolean v) throws IOException
void writeShort(int v) throws IOException
void writeChar(int v) throws IOException
void writeInt(int v) throws IOException
void writeLong(long v) throws IOException
void writeFloat(float v) throws IOException
void writeDouble(double v) throws IOException
void writeChars(String s) throws IOException

Filtro DataOutputStream
Grado en Informtica Programacin de Bases de datos 17 Francisco J. Garca Izquierdo

Filtro DataOutputStream
DataOutputStream dos;
dos = new DataOutputStream(new FileOutputStream(A));

dos.writeInt(i);
dos.writeDouble(3.14);
dos.writeChars(Hola);

dos.close(); // Se cierra tambin el socio
Grado en Informtica Programacin de Bases de datos 18 Francisco J. Garca Izquierdo
La clase PrintStream aade la funcionalidad de poder enviar
todos los tipos primitivos en formato texto.
Ofrece los mtodos print y println sobrecargados para todos
los tipos primitivos.
System.out es de tipo PrintStream


Filtro PrintStream
PrintStream ps;
ps = new PrintStream(new FileOutputStream(A));
ps.println(1);
ps.println(3.14);
ps.println(Hola);
ps.close(); // Se cierra tambin el socio
Grado en Informtica Programacin de Bases de datos 19 Francisco J. Garca Izquierdo
La forma ms habitual de usar un OutputStream ser combinando varios
filtros.
Combinacin
DataOutputStream dos;
dos = new DataOutputStream(
new FileOutputStream(A)
);

// Se transforma: DataOutput
dos.writeInt(i);
dos.writeDouble(3.14);
dos.writeChars(Hola);

// Se vuelca: File
dos.close(); // Se cierran todos
Grado en Informtica Programacin de Bases de datos 20 Francisco J. Garca Izquierdo
Qu se puede comentar sobre la siguiente clase?

class Persona {
private String nombre;
private int edad;

Persona (String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}

public void write(FileOutputStream f) throws IOExcepcion {
DataOutputStream dos;
dos = new DataOutputStream(f);
dos.writeUTF(nombre);
dos.writeInt(edad);
}
}

Uso de OutputStreams
class Persona {
private String nombre;
private int edad;

Persona (String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}

public void escribe(FileOutputStream f) throws IOExcepcion {
DataOutputStream dos;
dos = new DataOutputStream(f);
dos.writeChars(nombre);
dos.writeInt(edad);
}
}
Grado en Informtica Programacin de Bases de datos 21 Francisco J. Garca Izquierdo
Uso de OutputStreams
public static void main(String args[]) {
Persona[] v = new Persona[100];
for (int i = 0; i < v.length; i++)
v[i] = new Persona(Pepe + i, i);

FileOutputStream f =
new FileOutputStream(Personas.dat);

for (int i = 0; i < v.length; i++)
v[i].escribe(f);

f.close();
}
Grado en Informtica Programacin de Bases de datos 22 Francisco J. Garca Izquierdo
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Agenda
Grado en Informtica Programacin de Bases de datos 23 Francisco J. Garca Izquierdo
Clase abstracta de la que derivan los dems flujos de entrada.
Fundamentalmente ofrece los siguientes servicios:

public abstract int read() throws IOException
public int read(byte b[]) throws IOException
public int read(byte b[], int off, int len) ) throws IOException
public int available() throws IOException
public void close() throws IOException

InputStream es una clase abstracta.
De dnde se recibe el byte que se lee a travs de un InputStream?
Depender del tipo del stream.
Hay varias clases que derivan de InputStream y redefinen el mtodo read para
darle una implementacin distinta:
FileInputStream.
ByteArrayInputStream.
StringInputStream.
SequenceInputStream.
PipedInputStream.
TelnetInputStream
Clase InputStream
Grado en Informtica Programacin de Bases de datos 24 Francisco J. Garca Izquierdo
El FileInputStream redefine el mtodo
read para leer el byte de un fichero.



FileInputStream
FileInputStream f;
f = new FileInputStream(Datos.dat);

int dato;
while ((dato = f.read()) != -1)
System.out.println(dato);

f.close();
Grado en Informtica Programacin de Bases de datos 25 Francisco J. Garca Izquierdo
Lectura por bloques
InputStream is = ...;
OutputStream os = ...;

byte buff[] = new byte[buffSize];
int leidos = is.read(buff);
while (leidos != -1) {
os.write(buff);
leidos = is.read(buff);
}
os.close();
InputStream is = ...;
OutputStream os = ...;

byte buff[] = new byte[buffSize];
int leidos = is.read(buff);
while (leidos != -1) {
os.write(buff, 0, leidos);
leidos = is.read(buff);
}
os.close();


Grado en Informtica Programacin de Bases de datos 26 Francisco J. Garca Izquierdo
El ByteArrayInputStream redefine el mtodo read para leer el byte de
un array que se le pase en el constructor.
Ejemplo

byte[] v = new byte[1024];
for (int i = 0; i < v.length; i++)
v[i] = i * 2;

ByteArrayInputStream ba;
ba = new ByteArrayInputStream(v);

int dato;
while ((dato = ba.read()) != -1)
System.out.println(dato);

ba.close();

ByteArrayInputStream
byte[] v = new byte[1024];
for (int i = 0; i < v.length; i++)
v[i] = i * 2;

ByteArrayInputStream ba;
ba = new ByteArrayInputStream(v);

int dato;
while ((dato = ba.read()) != -1)
System.out.println(dato);

ba.close();
Grado en Informtica Programacin de Bases de datos 27 Francisco J. Garca Izquierdo
El StringInputStream redefine el mtodo read para leer el
siguiente carcter de una cadena que se le pase en el constructor.
Sirve para tratar un String como si fuese un stream
Ejemplo

StringInputStream ba;
ba = new StringInputStream(Hola);

int dato;
while ((dato = ba.read()) != -1)
System.out.println(dato);

ba.close();
StringInputStream
StringInputStream ba;
ba = new StringInputStream(Hola);

int dato;
while ((dato = ba.read()) != -1)
System.out.println(dato);

ba.close();
Grado en Informtica Programacin de Bases de datos 28 Francisco J. Garca Izquierdo
Cuando se tienen varios InputStreams que se desean procesar seguidos se
pueden concatenar mediante un SequenceInputStream.
De esta manera aparecen como un nico InputStream continuo.

FileInputStream f1, f2;
f1 = new FileInputStream(Datos1.dat);
f2 = new FileInputStream(Datos2.dat);
SequenceInputStream sis;
sis = new SequenceInputStream(f1, f2);

int dato;
while ((dato = sis.read()) != -1)
System.out.println(dato);

sis.close();

SequenceInputStream
FileInputStream f1, f2;
f1 = new FileInputStream(Datos1.dat);
f2 = new FileInputStream(Datos2.dat);
SequenceInputStream sis;
sis = new SequenceInputStream(f1, f2);

int dato;
while ((dato = sis.read()) != -1)
System.out.println(dato);

sis.close();
Grado en Informtica Programacin de Bases de datos 29 Francisco J. Garca Izquierdo
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Agenda
Grado en Informtica Programacin de Bases de datos 30 Francisco J. Garca Izquierdo
Un filtro de entrada es un InputStream al cual se le
asocia en su constructor otro InputStream.
Los filtros devuelven la informacin que a su vez han
ledo de su InputStream asociado, previa realizacin
de algn tipo de transformacin en la misma.
De esta manera cada filtro aade una funcionalidad
adicional al InputStream bsico.
Se pueden encadenar varios filtros para obtener varias
funcionalidades combinadas.

FilterInputStream
Grado en Informtica Programacin de Bases de datos 31 Francisco J. Garca Izquierdo
Los mtodos de la clase InputStream solo permiten leer bytes.
Cualquier otro tipo debern leerse como una secuencia de bytes y
recomponerse antes de poder utilizarse.

FileInputStream in = new FileInputStream(datos.dat);
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();

if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();

int i = ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));

// Idem para String, float, etc.

Filtro DataInputStream
FileInputStream in = new FileInputStream(datos.dat);
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();

if ((ch1 | ch2 | ch3 | ch4) < 0)
throw new EOFException();

int i = ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));

// Idem para String, float, etc.
Grado en Informtica Programacin de Bases de datos 32 Francisco J. Garca Izquierdo
La clase DataInputStream aade la funcionalidad de
poder leer todos los tipos primitivos directamente.
readBoolean()
readChar
readByte()
readShort()
readInt()
readLong()
readFloat()
readDouble()
readLine()
readFully(byte[] b)
Filtro DataInputStream
Grado en Informtica Programacin de Bases de datos 33 Francisco J. Garca Izquierdo
DataInputStream dis;
dis = new DataInputStream(new FileInputStream(A));

int i = dis.readInt();
double d = dis.readDouble();
String s = dis.readLine();

dis.close(); // Se cierra tambin el socio

El final del stream se detecta:
readLine() devuelve null
El resto de mtodos lanza EOFException
Filtro DataInputStream
DataInputStream dis;
dis = new DataInputStream(new FileInputStream(A));

int i = dis.readInt();
double d = dis.readDouble();
String s = dis.readLine();

dis.close(); // Se cierra tambin el socio

Grado en Informtica Programacin de Bases de datos 34 Francisco J. Garca Izquierdo
Esquema tpico usando un DataInputStream




O con BufferedReader (luego hablaremos de la
diferencia)
Lectura de ficheros de texto
DataInputStream dis = new DataInputStream(...);
String linea;
while ( (linea = dis.readLine()) != null) {
// Hacer algo con linea
}
BufferedReader br = new BufferedReader (...);
String linea;
while ( (linea = br.readLine()) != null) {
// Hacer algo con linea
}
Grado en Informtica Programacin de Bases de datos 35 Francisco J. Garca Izquierdo
La forma ms habitual de usar un InputStream ser combinando
varios filtros.
Combinacin
DataInputStream dis;
dis = new DataInputStream(
new FileInputStream(A)
);

int i = dis.readInt();
double d = dis.readDouble();
String s = dis.readLine();

dis.close(); // Se cierra tambin el socio
Grado en Informtica Programacin de Bases de datos 36 Francisco J. Garca Izquierdo
Qu se puede comentar sobre la siguiente clase?


Uso de InputStreams
public class Persona {
private String nombre;
private int edad;

public Persona (String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}

public void lee(FileInputStream f) throws IOException {
DataInputStream dis;
dis = new DataInputStream(f);
nombre = dis.readUTF();
edad = dis.readInt();
}
}
Grado en Informtica Programacin de Bases de datos 37 Francisco J. Garca Izquierdo
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Agenda
Grado en Informtica Programacin de Bases de datos 38 Francisco J. Garca Izquierdo
Los streams estn orientados a la E/S de bytes
Los Readers y los Writers estn orientados a la E/S de
caracteres.
Tenemos la mala costumbre de asumir que todo el texto es
ASCII (en este caso hay equivalencia entre byte y char)
Pero no en todas las partes del mundo pasa eso.
Su existencia se justifica por la necesidad de escribir caracteres
en distintos juegos de caracteres y as facilitar la
internacionalizacin
Existe una jerarqua paralela entre Readers e InputStreams (y
Writers y OutputStreams). Ej: FileInputStream
FileReader.
Para convertir un InputStream en un Reader existe
InputStreamReader (y para writers OutputStreamWriter)
La recomendacin es que siempre que se vaya a escribir texto
se escriba con Writer.
Readers y Writers
Grado en Informtica Programacin de Bases de datos 39 Francisco J. Garca Izquierdo
Internamente los caracteres en Java se codifican en Unicode (siempre 2 bytes por
carcter)
a es el carcter 97 (0x0061 \u0061), el 225 (0x00E1); el 8364 (0x20AC).
Cuando los caracteres se escriben en un writer se usa un determinado encoding
para ello
Encoding: correspondencia entre caracteres Unicode y bytes usados para representar ese
carcter xej. en un fichero.
El encoding depende de la regin del mundo
Nosotros usamos Latin1 (ISO-8859-1) o Windows 1252 (o Cp-1252)
Un byte por carcter (solo se puede escribir 256, menos que los caracteres Unicode)
Si un carcter no existe se escribe ?
Ejemplo: a es el byte 0x61, el es el 0xE1; el es el 0x80 (en Cp-1252)
Universalmente se puede usar UTF-8
Nmero variable de bytes por carcter
Ej.: a es el byte 0x61, un par de bytes 0xC3 0xA1; tres bytes 0xE2 0x82 0xAC
Al leer los bytes, para transformarlos en caracteres, hay que usar el mismo encoding.
Si no se puede leer basura
Si escribo en UTF-8 el , y leo en ISO-8859-1, leer
Si no se indica nada se escoge el encoding por defecto (en Windows el ISO-8859-1,
o Cp-1252; en Linux el UTF-8)
Cuando se escribe/lee un String en/a un Output/InputStream se est usando el encoding
por defecto
Sobre codificacin de caracteres
Grado en Informtica Programacin de Bases de datos 40 Francisco J. Garca Izquierdo
Esquema tpico usando un DataInputStream




O con BufferedReader
Lectura de ficheros de texto
DataInputStream dis = new DataInputStream(...);
String linea;
while ( (linea = dis.readLine()) != null) {
// Hacer algo con linea
}
BufferedReader br = new BufferedReader (...);
String linea;
while ( (linea = br.readLine()) != null) {
// Hacer algo con linea
}
En Windows no dar
problemas, pero s en
Linux
Grado en Informtica Programacin de Bases de datos 41 Francisco J. Garca Izquierdo
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Agenda
Grado en Informtica Programacin de Bases de datos 42 Francisco J. Garca Izquierdo
Los objetos de la clase File representan ficheros en un sistema de
ficheros
Slo los representan
No se escribe ni lee en los fichero a travs de un File
Puede que el fichero final ni siquiera exista (exists() )
Sirven tambin para directorios
Permite obtener el contenido del directorio (list())
Permiten crear directorios (mkDir(), mkDirs())
Permiten acceder a propiedades sobre el fichero: tamao
(length()), solo lectura (canWrite()), fecha de modificacin
(lastModified()), nombre completo (getAbsolutePath()),
Permiten realizar operaciones de destruccin y movimiento de
ficheros: renameTo(File dest), delete(), deleteOnExit()
Clase File
Departamento de
Matemticas y
Computacin Grado en Informtica Programacin de Bases de Datos
Serializacin de objetos
Grado en Informtica Programacin de Bases de datos 44 Francisco J. Garca Izquierdo
La serializacin es el proceso de transformar
un objeto en una secuencia de bytes y su
reconstruccin posterior a partir de la misma
La secuencia de bytes obtenida mediante la
serializacin podr ser almacenada en un
fichero, transmitida por la red, etc...
Posteriormente se podr recuperar una copia
del objeto en el mismo estado en el que
estaba cuando se serializ
Introduccin
Grado en Informtica Programacin de Bases de datos 45 Francisco J. Garca Izquierdo
Para poder leer y escribir objetos simplemente hay que
utilizar dos nuevos tipos de streams: el
ObjectOutputStream y el ObjectInputStream.
La nica condicin que debe cumplir una clase para ser
serializable es implementar el interface Serializable
Es un marker, no tiene ningn mtodo y simplemente sirve
para marcar la clase como serializable
Si no serializable java.io.NotSerializableException
Consecuencia: si una clase es serializable lo sern todas sus
derivadas.
Introduccin
Grado en Informtica Programacin de Bases de datos 46 Francisco J. Garca Izquierdo

Introduccin - Ejemplo
class A implements Serializable{
public int i;
}
. . .
// Escritura de una instancia de una clase serializable
A a = new A();
FileOutputStream f = new FileOutputStream(prueba.ser);
ObjectOutputStream oos = new ObjectOutputStream(f);
oos.writeObject(a);
oos.close();
. . .
// Lectura de una instancia de una clase serializable
FileInputStream f = new FileInputStream(prueba.ser);
ObjectInputStream ois = new ObjectInputStream(f);
A a = (A) ois.readObject();
ois.close();
Ver formato
Grado en Informtica Programacin de Bases de datos 47 Francisco J. Garca Izquierdo
En la serializacin se almacena el contenido de todos los atributos
de la instancia, incluidos los privados y los heredados. Por tanto
debern ser de tipos primitivos o de tipos Serializables.
Si tiene algn atributo no serializable, la clase no puede serializarse (a
no ser que se marque como transient)
No se almacenan
Campos transient
Campos static
Con la instancia se serializan todos los objetos alcanzables desde
l. Es decir, se serializa todo grafo de objetos alcanzable desde el
objeto inicial.
Si en el grafo hay varias referencias a una misma instancia esta slo
se almacena una vez.
Se almacena el estado del objeto, no el cdigo, que est en el
fichero .class. Para de-serializar un objeto es necesario disponer de
su fichero de clase.
Introduccin
Grado en Informtica Programacin de Bases de datos 48 Francisco J. Garca Izquierdo
Serializar un array implica serializar todos
sus elementos.
Los atributos estticos no se serializan
En el proceso de reconstruccin del objeto
no se llama al constructor de las clases
serializables
Sus atributos se inicializan a partir de la
informacin del stream.
Introduccin
Grado en Informtica Programacin de Bases de datos 49 Francisco J. Garca Izquierdo
Hay veces que no interesa guardar todos los atributos de una
instancia:
Informacin confidencial: ej. un string que guarde una password.
Informacin redundante: atributos derivados de otros que se tienen ya
calculados por eficiencia, pero que no es necesario guardarlos.
Atributos que no se pueden serializar, ya que son de un tipo no
serializable.
Los atributos marcados con el modificador transient no se
serializan. A la hora de la lectura se inicializan al valor por defecto
del tipo (enteros a cero, referencias a null, etc...)
Atributos transient
class A implements Serializable{
public transient int i;
}
Grado en Informtica Programacin de Bases de datos 50 Francisco J. Garca Izquierdo
Hay ocasiones en que interesa controlar el proceso de escritura:
Se desean guardar ciertos atributos en otro formato ms compacto que
el que mantienen en memoria
Si se desea escribir informacin adicional junto con los atributos de la
instancia
Si la clase define el mtodo writeObject este ser llamado en el
momento de la escritura.
private void writeObject(ObjectOutputStream oo) throws
IOException
Escritura de instancias
class A implements Serializable{
public transient int i;
private void writeObject(ObjectOutputStream oos) throws IOException {
// Escribir lo que se quiera
}
}
Grado en Informtica Programacin de Bases de datos 52 Francisco J. Garca Izquierdo
As mismo hay ocasiones en que interesa controlar el proceso de lectura:
Inicializar atributos que se guardaron en otro formato (por ejemplo volver a
obtener la imagen a partir del nombre del fichero).
Leer la informacin adicional que se escribi en writeObject.
Dar un valor adecuado a los atributos transient.
Si la clase define el mtodo readObject este ser llamado en el momento
de la lectura
private void readObject(ObjectIntputStream stream)
throws IOException, ClassNotFoundException
Lectura de instancias
class A implements Serializable{
public transient int i;
private void readObject(ObjectIntputStream stream)
throws IOException, ClassNotFoundException {
// Escribir lo que se quiera
}
}
Departamento de
Matemticas y
Computacin Grado en Informtica Programacin de Bases de Datos
os.close()

También podría gustarte