Está en la página 1de 52

Java IO - Streams

OutputStream os = new OutputStream();

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.

Departamento de
Matemticas y
Computacin

Grado en Informtica

Programacin de Bases de Datos

Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos

Francisco J. Garca Izquierdo

Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos

Francisco J. Garca Izquierdo

Justificacin
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

Grado en Informtica Programacin de Bases de datos

Francisco J. Garca Izquierdo

Streams
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
Grado en Informtica Programacin de Bases de datos

Francisco J. Garca Izquierdo

Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos

Francisco J. Garca Izquierdo

La clase OutputStream
Clase abstracta de la que derivan los dems flujos de salida.
Fundamentalmente ofrece los siguientes servicios:
public
public
public
public
public

abstract void write(int b) throws IOException


void write(byte b[]) throws IOException
void write(byte b[], int off, int len) throws IOException
void flush() throws IOException
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

Grado en Informtica Programacin de Bases de datos

Francisco J. Garca Izquierdo

Grado en Informtica Programacin de Bases de datos

Francisco J. Garca Izquierdo

FileOutputStream
El FileOutputStream redefine el
mtodo write para enviar el byte a un
fichero.
FileOutputStream f;
f = new FileOutputStream(Datos.dat);
for (int i = 0; i < 100; i++)
f.write(i);
f.close();

Vanse los constructores disponibles en la


ayuda de Java.
Grado en Informtica Programacin de Bases de datos

Francisco J. Garca Izquierdo

ByteArrayOutputStream
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 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

10

Francisco J. Garca Izquierdo

Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos

11

Francisco J. Garca Izquierdo

FilterOutputStream
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.

Grado en Informtica Programacin de Bases de datos

12

Francisco J. Garca Izquierdo

OutputStream

+f lush:v oid
+write:v oid
+close:v oid

FileOutputStream

ByteArrayOutputS tream

PipedOutputStream

GZIPOutputStream

Grado en Informtica Programacin de Bases de datos

TelnetOutputS tream

DataOutputStream

13

FilterOutputStream

PrintStream

BufferedOutputS tream

Francisco J. Garca Izquierdo

Composicin de filtros
OutputStream out =

GZIPOutputStream

BufferedOutputStream
CipherOutputStream

FileOutputStream

new GZIPOutputStream(

new CipherOutputStream(

new FileOutputStream(

f.txt))) ;
Grado en Informtica Programacin de Bases de datos

14

Francisco J. Garca Izquierdo

Filtro DataOutputStream
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
int i;
out.write((i >>>
out.write((i >>>
out.write((i >>>
out.write((i >>>

out = new FileOutputStream(datos.dat);


24) & 0xFF);
16) & 0xFF);
8) & 0xFF);
0) & 0xFF);

// Idem para String, float, etc.

Grado en Informtica Programacin de Bases de datos

15

Francisco J. Garca Izquierdo

Filtro DataOutputStream
La clase DataOutputStream aade la funcionalidad de poder
enviar todos los tipos primitivos directamente.

void
void
void
void
void
void
void
void
void

writeBytes(String s) throws IOException


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

Grado en Informtica Programacin de Bases de datos

16

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

17

Francisco J. Garca Izquierdo

Filtro PrintStream
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
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

18

Francisco J. Garca Izquierdo

Combinacin
La forma ms habitual de usar un OutputStream ser combinando varios
filtros.
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

19

Francisco J. Garca Izquierdo

Uso de OutputStreams
Qu se puede comentar sobre la siguiente clase?
class
Persona
{ {
class
Persona
private
String
nombre;
private
String
nombre;
private
intint
edad;
private
edad;
Persona
(String
nombre,
intint
edad)
{ {
Persona
(String
nombre,
edad)
this.nombre
= nombre;
this.nombre
= nombre;
this.edad
=
edad;
this.edad = edad;
} }
public
void
escribe(FileOutputStream
public
void
write(FileOutputStream f)
f) throws
throws IOExcepcion
IOExcepcion {
{
DataOutputStream
dos;
DataOutputStream
dos;
dos
=
new
DataOutputStream(f);
dos = new DataOutputStream(f);
dos.writeChars(nombre);
dos.writeUTF(nombre);
dos.writeInt(edad);
dos.writeInt(edad);
} }

} }

Grado en Informtica Programacin de Bases de datos

20

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

21

Francisco J. Garca Izquierdo

Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos

22

Francisco J. Garca Izquierdo

Clase InputStream
Clase abstracta de la que derivan los dems flujos de entrada.
Fundamentalmente ofrece los siguientes servicios:
public
public
public
public
public

abstract int read() throws IOException


int read(byte b[]) throws IOException
int read(byte b[], int off, int len) ) throws IOException
int available() throws IOException
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

Grado en Informtica Programacin de Bases de datos

23

Francisco J. Garca Izquierdo

FileInputStream
El FileInputStream redefine el mtodo
read para leer el byte de un fichero.
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

24

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);
InputStream is = ...;
leidos = is.read(buff);
OutputStream os = ...;
}
os.close();
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

25

Francisco J. Garca Izquierdo

ByteArrayInputStream
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];

byte[] v = new byte[1024];


i =i 0;
i < v.length;
i++)
forfor
(int(int
i = 0;
< v.length;
i++)
i * 2;
v[i]v[i]
= i =
* 2;

ByteArrayInputStream
ba;
ByteArrayInputStream
ba;
ba =
ByteArrayInputStream(v);
banew
= new
ByteArrayInputStream(v);
intint
dato;
dato;
while ((dato = ba.read()) != -1)
while ((dato = ba.read()) != -1)
System.out.println(dato);

System.out.println(dato);

ba.close();

ba.close();

Grado en Informtica Programacin de Bases de datos

26

Francisco J. Garca Izquierdo

StringInputStream
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
StringInputStream
ba; ba;
= new
StringInputStream(Hola);
baba
= new
StringInputStream(Hola);
int
dato;
int
dato;
while
((dato
= ba.read())
!= -1)
while
((dato
= ba.read())
!= -1)
System.out.println(dato);

System.out.println(dato);

ba.close();

ba.close();

Grado en Informtica Programacin de Bases de datos

27

Francisco J. Garca Izquierdo

SequenceInputStream
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;
FileInputStream
f1, f2;
f1 =
FileInputStream(Datos1.dat);
f1new
= new
FileInputStream(Datos1.dat);
f2 =
FileInputStream(Datos2.dat);
f2new
= new
FileInputStream(Datos2.dat);
SequenceInputStream sis;
SequenceInputStream sis;
sis = new SequenceInputStream(f1, f2);

sis = new SequenceInputStream(f1, f2);

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

System.out.println(dato);
sis.close();

sis.close();

Grado en Informtica Programacin de Bases de datos

28

Francisco J. Garca Izquierdo

Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos

29

Francisco J. Garca Izquierdo

FilterInputStream
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.

Grado en Informtica Programacin de Bases de datos

30

Francisco J. Garca Izquierdo

Filtro DataInputStream
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
= new
FileInputStream(datos.dat);
FileInputStream
in =innew
FileInputStream(datos.dat);
= in.read();
int int
ch1 ch1
= in.read();
= in.read();
int int
ch2 ch2
= in.read();
= in.read();
int int
ch3 ch3
= in.read();
= in.read();
int int
ch4 ch4
= in.read();
if ((ch1
| ch2
| ch3
| ch4)
if ((ch1
| ch2
| ch3
| ch4)
< 0)< 0)
throw
EOFException();
throw
new new
EOFException();
= ((ch1
<< 24)
+ (ch2
<< 16)
+ (ch3
<< +8)(ch4
+ (ch4
<< 0));
int int
i = i((ch1
<< 24)
+ (ch2
<< 16)
+ (ch3
<< 8)
<< 0));
// Idem
String,
float,
// Idem
parapara
String,
float,
etc.etc.

Grado en Informtica Programacin de Bases de datos

31

Francisco J. Garca Izquierdo

Filtro DataInputStream
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)

Grado en Informtica Programacin de Bases de datos

32

Francisco J. Garca Izquierdo

Filtro DataInputStream
DataInputStreamdis;
dis;
DataInputStream
dis= =new
newDataInputStream(new
DataInputStream(newFileInputStream(A));
FileInputStream(A));
dis
inti i= =dis.readInt();
dis.readInt();
int
doubled d= =dis.readDouble();
dis.readDouble();
double
Strings s= =dis.readLine();
dis.readLine();
String
dis.close();////SeSecierra
cierratambin
tambinelelsocio
socio
dis.close();

El final del stream se detecta:


readLine() devuelve null
El resto de mtodos lanza EOFException
Grado en Informtica Programacin de Bases de datos

33

Francisco J. Garca Izquierdo

Lectura de ficheros de texto


Esquema tpico usando un DataInputStream
DataInputStream dis = new DataInputStream(...);
String linea;
while ( (linea = dis.readLine()) != null) {
// Hacer algo con linea
}

O con BufferedReader (luego hablaremos de la


diferencia)
BufferedReader br = new BufferedReader (...);
String linea;
while ( (linea = br.readLine()) != null) {
// Hacer algo con linea
}
Grado en Informtica Programacin de Bases de datos

34

Francisco J. Garca Izquierdo

Combinacin
La forma ms habitual de usar un InputStream ser combinando
varios filtros.
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

35

Francisco J. Garca Izquierdo

Uso de InputStreams
Qu se puede comentar sobre la siguiente clase?
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

36

Francisco J. Garca Izquierdo

Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos

37

Francisco J. Garca Izquierdo

Readers y Writers
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.
Grado en Informtica Programacin de Bases de datos

38

Francisco J. Garca Izquierdo

Sobre codificacin de caracteres


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

Grado en Informtica Programacin de Bases de datos

39

Francisco J. Garca Izquierdo

Lectura de ficheros de texto


Esquema tpico usando un DataInputStream
DataInputStream dis = new DataInputStream(...);
En Windows no dar
String linea;
problemas, pero s en
while ( (linea = dis.readLine())
!= null) {
Linux
// Hacer algo con linea
}

O con BufferedReader
BufferedReader br = new BufferedReader (...);
String linea;
while ( (linea = br.readLine()) != null) {
// Hacer algo con linea
}
Grado en Informtica Programacin de Bases de datos

40

Francisco J. Garca Izquierdo

Agenda
Introduccin
Salida (Out)
Filtros de salida
Entrada (Input)
Filtros de entrada
Readers y Writers
Clase File
Grado en Informtica Programacin de Bases de datos

41

Francisco J. Garca Izquierdo

Clase File
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()

Grado en Informtica Programacin de Bases de datos

42

Francisco J. Garca Izquierdo

Serializacin de objetos

Departamento de
Matemticas y
Computacin

Grado en Informtica

Programacin de Bases de Datos

Introduccin
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
Grado en Informtica Programacin de Bases de datos

44

Francisco J. Garca Izquierdo

Introduccin
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.

Grado en Informtica Programacin de Bases de datos

45

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();
Ver formato
ois.close();
Grado en Informtica Programacin de Bases de datos

46

Francisco J. Garca Izquierdo

Introduccin
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.

Grado en Informtica Programacin de Bases de datos

47

Francisco J. Garca Izquierdo

Introduccin
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.
Grado en Informtica Programacin de Bases de datos

48

Francisco J. Garca Izquierdo

Atributos transient
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...)
class A implements Serializable{
public transient int i;
}

Grado en Informtica Programacin de Bases de datos

49

Francisco J. Garca Izquierdo

Escritura de instancias
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
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

50

Francisco J. Garca Izquierdo

Lectura de instancias
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
class A implements Serializable{
public transient int i;
private void readObject(ObjectIntputStream stream)
throws IOException, ClassNotFoundException {
// Escribir lo que se quiera
}
}
Grado en Informtica Programacin de Bases de datos

52

Francisco J. Garca Izquierdo

os.close()

Departamento de
Matemticas y
Computacin

Grado en Informtica

Programacin de Bases de Datos

También podría gustarte