Java IO - Streams. OutputStream os = new OutputStream(); Departamento de Matemáticas y Computación Grado en Informática Programación de Bases de Datos

Documentos relacionados
Programación Orientada a Objetos. Tema 7: Persistencia

Tipos DataInputStream/DataOutputStream: L/E de datos de tipo simple y Cadenas (Strings) ObjectInputStream/ObjectOutputStream: para persistencia de obj

Entrada y Salida con Java

Tema 4. Entrada/Salida. Serialización de Objetos.

Ficheros y streams. Desde el punto de vista de Java, cada fichero no es más que una secuencia o flujo de bytes [stream].

Nota: en el directorio de prácticas y en PoliformaT puedes descargar los ficheros de código fuente de los ejemplos que aparecen en este anexo.

Prácticas de Programación

Práctica III: Streams, Readers y Writers

Práctica 4: Herencia. Objetivos:

fundamentos de programación (unidad 7) herencia y relaciones entre clases

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Excepciones y E/S Java y Servicios Web I Master en Ingeniería Matemática

Flujos (streams) Programación. Licenciatura Lingüística y Nuevas Tecnologias Nadjet Bouayad-Agha

Información de la lectura en un programa.

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

Sockets. Los sockets son un mecanismo de comunicación entre procesos que se utiliza en Internet.

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

EJEMPLOS PROGRAMACIÓN SOCKET - JAVA

PROGRAMACION DISTRIBUIDA

Streams y manejo de entrada y salida (Input & Output)

Tema 4. Excepciones en Java

Ejercicios de Programación Tema 7. Programación Orientada a Objetos

Arquitecturas cliente/servidor

1.- FUNDAMENTOS FUNCIONAMIENTO GENÉRICO JAVA SOCKETS Creación de Streams de Entrada...7

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

- Compilar y ejecutar programas en Java - Estructura básica de una clase - El comando javac - El comando java - Introducción al IDE de desarrollo

La clase Integer y sus métodos. Los Operadores (concepto). Operadores Lógicos y a nivel de Bits. Operadores de desplazamiento. Concatenaciones. La Con

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Cadenas y Entrada/Salida

Unidad IV Almacenamiento de datos

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Guía - Taller # 2 (JAVA)

Objetivos de la sesión. Aplicación de consola 7/30/11. Código con que se inicia un programa en Visual C# (aplicación de consola)

Laboratorio de Redes de Comunicaciones Programación con Sockets en Java

GUÍA USO MOTOR SCRIPTING SOFIA2

Capítulo 5. Programación de aplicaciones de red

Definición de Memoria

James Gosling, creador de Java

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

Desarrollar, usando Java, un cliente básico del protocolo web que permita enviar una solicitud HTTP a un servidor web y procesar la respuesta.

CÁTEDRA DE LENGUAJE DE PROGRAMACIÓN JAVA 2014

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Introduciendo datos desde el

2. Estructura de un programa en Java

Elementos léxicos del lenguaje de programación Java

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Tema 2. El lenguaje de programación Java (Parte 1)

Lo que necesitaremos para programar en Java, será un editor de texto o IDE y la JDK.

Introducción - por qué usarlas?(1)

Manejo de Archivos en Java. Índice

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Lenguaje de programación con JAVA

JAVA - Serializacíon / RMI. (C) Philippe Roose , 2005

1 SOCKETS EN JAVA. Sistemas Distribuidos::Sockets en Java EUI-SG/INFOR.UVA.ES 1

CAPÍTULO II - SERIALIZACIÓN: PERSISTENCIA DE DATOS EN JAVA

Ficheros de acceso aleatorio

Sensor de Temperatura utilizando el Starter Kit Javelin Stamp. Realizado por: Bertha Palomeque A. Rodrigo Barzola J.

Objetivo de aprendizaje del tema

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

C.I.F.: B Inscrita en el Registro Mercantil de Madrid, Tomo Libro 0, Folio 135, Sección 8. Hoja M Inscripción 1ª

IIC1103 Introducción a la Programación. Ayudantía: Archivos

Introducción a Java LSUB. 15 de enero de 2015 GSYC

Sockets. Introducción. Las redes de computadoras permiten al usuario. Curso Propedéutico Maestría en Ciencias de la Computación BUAP

Aprendizaje activo: flujos

Fundamentos de la programación

Los caracteres de Java pueden agruparse en letras, dígitos, espacios en blanco, caracteres especiales, signos de puntuación y secuencias de escape.

Manejo de Excepciones Para capturar y manejar las excepciones Java proporciona la sentencia try, catch y finalty. Entre un try y un catch se escribe

Un breve resumen del lenguaje Java

StringBuffer, Math y Wrapper

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INGENIERÍA TELEMÁTICA. Daniel Díaz Sánchez

Curso Introducción JAVA Pág.: 1

4. Operadores Operador asignación

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INGENIERÍA TELEMÁTICA. Daniel Díaz Sánchez

TEMA 2. Agenda. Fundamentos de JAVA

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

Programación interactiva. Oscar Bedoya

Repaso de las características más importantes de la programación Java y su adaptación a Android

Estructuras básicas de la programación en Java

Test : Conteste exclusivamente en una HOJA DE LECTURA ÓPTICA, no olvidando marcar que su tipo de examen es A.

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

UNIVERSIDAD POLITÉCNICA DE PACHUCA SOCKETS EN JAVA

public static void main(string[ ] args) { Numero f1 = new Numero(3); Numero f2 = new Numero(4); Numero f3 = f1; f1.value = f2.value; Numero f4 = null;

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Ejercicios de evaluación de fundamentos de programación en Java

Manejo básico de record store RMS en aplicaciones móviles con J2ME. Por: Rubén Dario Orozco

Programa Java. El lenguaje de programación Java. Comentarios. Programa Java. Palabras reservadas. Identificadores

Principios de Computadoras II

Práctica 5: Servidor web concurrente en Java

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Universidad de Cantabria

Solución al Examen de Prácticas de Programación (Ingeniería Informática)

Examen de Prácticas de Programación Ingeniería Informática

FACULTAD DE INGENIERÍA

Federico Peinado

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Java en 2 horas. Rodrigo Santamaría

Prof. Dr. Paul Bustamante

Diseñar y Programar todo es empezar

Transcripción:

Java IO - Streams OutputStream os = new OutputStream(); 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. Departamento de Matemáticas y Computación Grado en Informática Programación de Bases de Datos

Agenda Introducción Salida (Out ) Filtros de salida Entrada (Input ) Filtros de entrada Readers y Writers Clase File Grado en Informática Programación de Bases de datos 2 Francisco J. García Izquierdo

Agenda Introducción Salida (Out ) Filtros de salida Entrada (Input ) Filtros de entrada Readers y Writers Clase File Grado en Informática Programación de Bases de datos 3 Francisco J. García Izquierdo

Justificación Vamos a utilizar Java como lenguaje de programación de la asignatura Una de las características intrínsecas 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 través de esos streams se envían y reciben los mensajes (como si grabásemos o leyésemos ficheros) Además la información 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 Informática Programación de Bases de datos 4 Francisco J. García Izquierdo

Streams La E/S de Java se realiza a través 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 métodos de OutputStream (y también de InputStream) lanzan la excepción IOException ante cualquier fallo relacionado con el intento de escritura o lectura Grado en Informática Programación de Bases de datos 5 Francisco J. García Izquierdo

Agenda Introducción Salida (Out ) Filtros de salida Entrada (Input ) Filtros de entrada Readers y Writers Clase File Grado en Informática Programación de Bases de datos 6 Francisco J. García Izquierdo

La clase OutputStream Clase abstracta de la que derivan los demás 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. Dónde se envía un byte que se escribe a través de un OutputStream? Dependerá del tipo del stream. Hay varias clases que derivan de OutputStream y redefinen el método write para darle una implementación distinta: FileOutputStream ByteArrayOutputStream PipedOutputStream sun.net.telnetoutputstream Grado en Informática Programación de Bases de datos 7 Francisco J. García Izquierdo

Grado en Informática Programación de Bases de datos 8 Francisco J. García Izquierdo

FileOutputStream El FileOutputStream redefine el método 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(); Véanse los constructores disponibles en la ayuda de Java. Grado en Informática Programación de Bases de datos 9 Francisco J. García Izquierdo

ByteArrayOutputStream El ByteArrayOutputStream redefine el método write para enviar el byte a un array dinámico (en memoria). Añade los métodos: 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 Informática Programación de Bases de datos 10 Francisco J. García Izquierdo

Agenda Introducción Salida (Out ) Filtros de salida Entrada (Input ) Filtros de entrada Readers y Writers Clase File Grado en Informática Programación de Bases de datos 11 Francisco J. García Izquierdo

FilterOutputStream Un filtro de salida es un OutputStream al cual se le asocia en su constructor otro OutputStream (patrón Decorator) Los filtros reenvían toda la información que reciben a su OutputStream asociado, previa realización de algún tipo de transformación en la misma. De esta manera cada filtro añade una funcionalidad adicional al OutputStream que encapsula. Se pueden encadenar varios filtros para obtener varias funcionalidades combinadas. Grado en Informática Programación de Bases de datos 12 Francisco J. García Izquierdo

OutputStream +f lush:v oid +write:v oid +close:v oid FileOutputStream ByteArrayOutputStream PipedOutputStream TelnetOutputStream FilterOutputStream GZIPOutputStream DataOutputStream PrintStream BufferedOutputStream Grado en Informática Programación de Bases de datos 13 Francisco J. García Izquierdo

Composición de filtros OutputStream out = GZIPOutputStream new GZIPOutputStream( CipherOutputStream BufferedOutputStream new CipherOutputStream( FileOutputStream new FileOutputStream( f.txt ) ) ; Grado en Informática Programación de Bases de datos 14 Francisco J. García Izquierdo

Filtro DataOutputStream Los métodos de la clase OutputStream solo permiten enviar bytes. Cualquier otro tipo deberán 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. Grado en Informática Programación de Bases de datos 15 Francisco J. García Izquierdo

Filtro DataOutputStream La clase DataOutputStream añade 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 Grado en Informática Programación de Bases de datos 16 Francisco J. García 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 también el socio Grado en Informática Programación de Bases de datos 17 Francisco J. García Izquierdo

Filtro PrintStream La clase PrintStream añade la funcionalidad de poder enviar todos los tipos primitivos en formato texto. Ofrece los métodos 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 también el socio Grado en Informática Programación de Bases de datos 18 Francisco J. García Izquierdo

Combinación La forma más 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 Informática Programación de Bases de datos 19 Francisco J. García Izquierdo

Uso de OutputStreams Qué se puede comentar sobre la siguiente clase? class class Persona Persona { { private private String String nombre; nombre; private private int int edad; edad; Persona Persona (String (String nombre, nombre, int int edad) edad) { { this.nombre this.nombre = nombre; = nombre; this.edad this.edad = edad; = edad; } } } public public void void escribe(fileoutputstream write(fileoutputstream f) throws IOExcepcion { DataOutputStream dos; dos; dos dos = new = new DataOutputStream(f); dos.writechars(nombre); dos.writeutf(nombre); dos.writeint(edad); } } } Grado en Informática Programación de Bases de datos 20 Francisco J. García 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 Informática Programación de Bases de datos 21 Francisco J. García Izquierdo

Agenda Introducción Salida (Out ) Filtros de salida Entrada (Input ) Filtros de entrada Readers y Writers Clase File Grado en Informática Programación de Bases de datos 22 Francisco J. García Izquierdo

Clase InputStream Clase abstracta de la que derivan los demás 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 dónde se recibe el byte que se lee a través de un InputStream? Dependerá del tipo del stream. Hay varias clases que derivan de InputStream y redefinen el método read para darle una implementación distinta: FileInputStream. ByteArrayInputStream. StringInputStream. SequenceInputStream. PipedInputStream. TelnetInputStream Grado en Informática Programación de Bases de datos 23 Francisco J. García Izquierdo

FileInputStream El FileInputStream redefine el método 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 Informática Programación de Bases de datos 24 Francisco J. García 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 Informática Programación de Bases de datos 25 Francisco J. García Izquierdo

ByteArrayInputStream El ByteArrayInputStream redefine el método 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++) byte[] v = new byte[1024]; for (int i 0; i < v.length; i++) v[i] v[i] = i = * 2; i * 2; ByteArrayInputStream ba; ba = new ByteArrayInputStream(v); ByteArrayInputStream ba; ba = new ByteArrayInputStream(v); int int dato; dato; while ((dato = ba.read())!= -1) System.out.println(dato); while ((dato = ba.read())!= -1) System.out.println(dato); ba.close(); ba.close(); Grado en Informática Programación de Bases de datos 26 Francisco J. García Izquierdo

StringInputStream El StringInputStream redefine el método read para leer el siguiente carácter 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 ); StringInputStream ba; ba = new StringInputStream( Hola ); int int dato; dato; while ((dato = ba.read())!= -1) System.out.println(dato); while ((dato = ba.read())!= -1) System.out.println(dato); ba.close(); ba.close(); Grado en Informática Programación de Bases de datos 27 Francisco J. García 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; f1 = new FileInputStream( Datos1.dat ); f2 = new FileInputStream( Datos2.dat ); FileInputStream f1, f2; f1 = new FileInputStream( Datos1.dat ); f2 = new FileInputStream( Datos2.dat ); SequenceInputStream sis; SequenceInputStream sis; sis = new SequenceInputStream(f1, f2); sis = new SequenceInputStream(f1, f2); int dato; while int ((dato dato; = sis.read())!= -1) System.out.println(dato); while ((dato = sis.read())!= -1) System.out.println(dato); sis.close(); sis.close(); Grado en Informática Programación de Bases de datos 28 Francisco J. García Izquierdo

Agenda Introducción Salida (Out ) Filtros de salida Entrada (Input ) Filtros de entrada Readers y Writers Clase File Grado en Informática Programación de Bases de datos 29 Francisco J. García Izquierdo

FilterInputStream Un filtro de entrada es un InputStream al cual se le asocia en su constructor otro InputStream. Los filtros devuelven la información que a su vez han leído de su InputStream asociado, previa realización de algún tipo de transformación en la misma. De esta manera cada filtro añade una funcionalidad adicional al InputStream básico. Se pueden encadenar varios filtros para obtener varias funcionalidades combinadas. Grado en Informática Programación de Bases de datos 30 Francisco J. García Izquierdo

Filtro DataInputStream Los métodos de la clase InputStream solo permiten leer bytes. Cualquier otro tipo deberán leerse como una secuencia de bytes y recomponerse antes de poder utilizarse. FileInputStream in = in new = new FileInputStream( datos.dat ); 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(); = in.read(); if ((ch1 if ((ch1 ch2 ch2 ch3 ch3 ch4) ch4) < 0) < 0) throw throw new new EOFException(); int int i = i ((ch1 = ((ch1 << 24) << 24) + (ch2 + (ch2 << 16) << 16) + (ch3 + (ch3 << 8) << + 8) (ch4 + (ch4 << 0)); << 0)); // Idem // Idem para para String, String, float, float, etc. etc. Grado en Informática Programación de Bases de datos 31 Francisco J. García Izquierdo

Filtro DataInputStream La clase DataInputStream añade la funcionalidad de poder leer todos los tipos primitivos directamente. readboolean() readchar readbyte() readshort() readint() readlong() readfloat() readdouble() readline() readfully(byte[] b) Grado en Informática Programación de Bases de datos 32 Francisco J. García Izquierdo

Filtro DataInputStream DataInputStream dis; dis; dis dis = = new new DataInputStream(new FileInputStream( A )); int int i i = = dis.readint(); double double d d = = dis.readdouble(); String String s s = = dis.readline(); dis.close(); dis.close(); // // Se Se cierra cierra también también el el socio socio El final del stream se detecta: readline() devuelve null El resto de métodos lanza EOFException Grado en Informática Programación de Bases de datos 33 Francisco J. García Izquierdo

Lectura de ficheros de texto Esquema típico 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 Informática Programación de Bases de datos 34 Francisco J. García Izquierdo

Combinación La forma más 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 también el socio Grado en Informática Programación de Bases de datos 35 Francisco J. García 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 Informática Programación de Bases de datos 36 Francisco J. García Izquierdo

Agenda Introducción Salida (Out ) Filtros de salida Entrada (Input ) Filtros de entrada Readers y Writers Clase File Grado en Informática Programación de Bases de datos 37 Francisco J. García Izquierdo

Readers y Writers Los streams están orientados a la E/S de bytes Los Readers y los Writers están 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 internacionalización Existe una jerarquía 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 recomendación es que siempre que se vaya a escribir texto se escriba con Writer. Grado en Informática Programación de Bases de datos 38 Francisco J. García Izquierdo

Sobre codificación de caracteres Internamente los caracteres en Java se codifican en Unicode (siempre 2 bytes por carácter) a es el carácter 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 carácter xej. en un fichero. El encoding depende de la región del mundo Nosotros usamos Latin1 (ISO-8859-1) o Windows 1252 (o Cp-1252) Un byte por carácter (solo se puede escribir 256, menos que los caracteres Unicode) Si un carácter 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 Número variable de bytes por carácter 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 Informática Programación de Bases de datos 39 Francisco J. García Izquierdo

Lectura de ficheros de texto Esquema típico usando un DataInputStream DataInputStream dis = new DataInputStream(...); String linea; while ( (linea = dis.readline())!= null) { } // Hacer algo con linea O con BufferedReader En Windows no dará problemas, pero sí en Linux BufferedReader br = new BufferedReader (...); String linea; while ( (linea = br.readline())!= null) { // Hacer algo con linea } Grado en Informática Programación de Bases de datos 40 Francisco J. García Izquierdo

Agenda Introducción Salida (Out ) Filtros de salida Entrada (Input ) Filtros de entrada Readers y Writers Clase File Grado en Informática Programación de Bases de datos 41 Francisco J. García Izquierdo

Clase File Los objetos de la clase File representan ficheros en un sistema de ficheros Sólo los representan No se escribe ni lee en los fichero a través de un File Puede que el fichero final ni siquiera exista (exists() ) Sirven también para directorios Permite obtener el contenido del directorio (list()) Permiten crear directorios (mkdir(), mkdirs()) Permiten acceder a propiedades sobre el fichero: tamaño (length()), solo lectura (canwrite()), fecha de modificación (lastmodified()), nombre completo (getabsolutepath()), Permiten realizar operaciones de destrucción y movimiento de ficheros: renameto(file dest), delete(), deleteonexit() Grado en Informática Programación de Bases de datos 42 Francisco J. García Izquierdo

Serialización de objetos Departamento de Matemáticas y Computación Grado en Informática Programación de Bases de Datos

Introducción La serialización es el proceso de transformar un objeto en una secuencia de bytes y su reconstrucción posterior a partir de la misma La secuencia de bytes obtenida mediante la serialización 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 Informática Programación de Bases de datos 44 Francisco J. García Izquierdo

Introducción Para poder leer y escribir objetos simplemente hay que utilizar dos nuevos tipos de streams: el ObjectOutputStream y el ObjectInputStream. La única condición que debe cumplir una clase para ser serializable es implementar el interface Serializable Es un marker, no tiene ningún método y simplemente sirve para marcar la clase como serializable Si no serializable java.io.notserializableexception Consecuencia: si una clase es serializable lo serán todas sus derivadas. Grado en Informática Programación de Bases de datos 45 Francisco J. García Izquierdo

Introducción - 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 Informática Programación de Bases de datos 46 Francisco J. García Izquierdo

Introducción En la serialización se almacena el contenido de todos los atributos de la instancia, incluidos los privados y los heredados. Por tanto deberán ser de tipos primitivos o de tipos Serializables. Si tiene algún 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 sólo se almacena una vez. Se almacena el estado del objeto, no el código, que está en el fichero.class. Para de-serializar un objeto es necesario disponer de su fichero de clase. Grado en Informática Programación de Bases de datos 47 Francisco J. García Izquierdo

Introducción Serializar un array implica serializar todos sus elementos. Los atributos estáticos no se serializan En el proceso de reconstrucción del objeto no se llama al constructor de las clases serializables Sus atributos se inicializan a partir de la información del stream. Grado en Informática Programación de Bases de datos 48 Francisco J. García Izquierdo

Atributos transient Hay veces que no interesa guardar todos los atributos de una instancia: Información confidencial: ej. un string que guarde una password. Información 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 Informática Programación de Bases de datos 49 Francisco J. García Izquierdo

Escritura de instancias Hay ocasiones en que interesa controlar el proceso de escritura: Se desean guardar ciertos atributos en otro formato más compacto que el que mantienen en memoria Si se desea escribir información adicional junto con los atributos de la instancia Si la clase define el método 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 Informática Programación de Bases de datos 50 Francisco J. García 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 información adicional que se escribió en writeobject. Dar un valor adecuado a los atributos transient. Si la clase define el método 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 Informática Programación de Bases de datos 52 Francisco J. García Izquierdo

os.close() Departamento de Matemáticas y Computación Grado en Informática Programación de Bases de Datos