02-Java-IO.pdf

52
Departamento de Matemáticas y Computación Grado en Informática Programación de Bases de Datos OutputStream os = new OutputStream(); Java IO - Streams JDBC por Francisco J. García Izquierdo. Universidad de la Rioja. Departamento de Matemáticas y Computación. se encuentra bajo una Licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported .

Transcript of 02-Java-IO.pdf

  • 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 TelnetOutputStreamPipedOutputStream FilterOutputStream

    BufferedOutputStreamPrintStreamDataOutputStreamGZIPOutputStream

    OutputStream

    +f lush:void

    +write:void

    +close:void

  • Grado en Informtica Programacin de Bases de datos 14 Francisco J. Garca Izquierdo

    BufferedOutputStream

    FileOutputStreamFileOutputStream

    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

  • 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()