230 likes | 404 Views
Programación Orientada a Objetos. Anexo 5 Streams. Universidad de Chile Departamento de Ciencias de la Computación. Temario. Streams El package java.io Streams de bytes y de caracteres Streams de bajo y alto nivel Leyendo y escribiendo Sockets. Streams.
E N D
Programación Orientada a Objetos Anexo 5 Streams Universidad de Chile Departamento de Ciencias de la Computación
Temario • Streams • El package java.io • Streams de bytes y de caracteres • Streams de bajo y alto nivel • Leyendo y escribiendo • Sockets
Streams • Los Streams son interfaces que permiten ver de una manera común los diferentes elementos de entrada / salida (archivos, teclado/pantalla, sockets, etc.) • Un stream de entrada: • Un stream de salida:
El Package java.io • Las clases de entrada / salida del paquete java.io: • ocultan la complejidad de las operaciones de bajo nivel • aíslan al programador de los detalles específicos del sistema operativo • proveen una manera consistente de representar la entrada / salida
Las clases de streams del paquete java.io se encuentran divididas en 4 jerarquías de clases, dependiendo de si son de entrada o salida, y del tipo de datos sobre el que operan (bytes o caracteres) El Package java.io
Streams de Caracteres Métodos operan sobre (arreglos de) caracteres Contiene caracteres Unicode de 16-bit Implementado por clases Reader y Writer Manejan buffers Streams Byte v/s Character Streams de Bytes Métodos operan sobre (arreglos de) bytes Contiene bytes de 8-bit Implementado por clases InputStream y OutputStream No manejan buffers
Reader y InputStream • Clases abstractas para leer caracteres y bytes • Reader permite leer streams de caracteres • InputStream permite leer streams de bytes • Métodos básicos Reader: • int read() • int read(char[] cbuf) • abstract int read(char[] cbuf, int off, int len) • Métodos básicos InputStream: • abstract int read() • int read(byte[] bbuf) • int read(byte[] bbuf, int off, int len)
Writer y OutputStream • Clases abstractas para escribir caracteres y bytes • Writer permite escribir streams de caracteres • OutputStream permite escribir streams de bytes • Métodos básicos Writer: • void write(int c) • void write({char[]|String} cbuf) • abstract void write({char[]|String} cbuf, int off, int len) • Métodos básicos OutputStream: • abstract void write(int b) • void write(byte[] bbuf) • void write(byte[] bbuf, int off, int len)
Streams conectados directamente a fuenteso destinos de información (en gris en las jerarquías anteriores) Streams Conectados a Datos
Streams que operan sobre otros streams, agregando funcionalidad, convirtiendo información, etc. (en blanco en las jerarquías anteriores) Encadenamiento de Streams
Copiando un Archivo import java.io.*; public class Copy { public static void main(String[] args) throws IOException { FileReader in = new FileReader("data.txt"); FileWriter out = new FileWriter("out.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } in.close(); out.close(); } }
Encadenando Streams • Los streams están basados en el patrón de diseño Decorador, que permite agregar responsabilidades a los objetos de manera dinámica y transparente • Las clases FilterReader, FilterWriter, FilterInputStream y FilterOutputStream son clases base para decoradores: • Manejan la referencia al stream“encadenado”, y le delegan losrequerimientos • Los decoradores concretosagregan o modifican funcionalidad • Los decoradores tienen la mismainterfaz que los componentes“decorados”, de modo que parael cliente es transparente si estáoperando con un componentedecorado o no
Leyendo de un Archivo • El siguiente código permite leer por líneas de un archivo: FileReader fr = null; BufferedReader br = null; try { fr = new FileReader("/home/archivo.txt"); br = new BufferedReader(fr); String s; while ((s = br.readLine()) != null) { ... } } finally { if (fr != null) { fr.close(); } }
Leyendo del Teclado • El siguiente código permite leer por líneas lo que el usuario escribe en el teclado: InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); try { System.out.print("Ingrese su nombre: "); String name = br.readLine( ); System.out.print("Ingrese su dirección: "); String address = br.readLine( ); } catch (IOException e) { System.out.println("IOException"); }
PrintWriter • Escribe texto y números en formato de texto, en métodos print() y println() • El constructor de PrintWriter recibe como parámetro un objeto OutputStream, Writer, File, o String (el nombre de un archivo) FileWriter fw = new FileWriter("C:/dat/emp.dat"); PrintWriter pw = new PrintWriter(fw); String nombre = "Andrea Ramírez"; double sueldo = 1500000; pw.print(nombre); pw.print(""); pw.print(sueldo); pw.close(); fw.close();
Ejemplo: Encadenando Streams • El siguiente ejemplo muestra cómo comprimir y encriptar información, escribiendo sobre un archivo: • El siguiente código genera la estructura de objetos: • FileOutputStream fos = new FileOutputStream("myfile.out"); CryptOutputStream cos = new CryptOutputStream(fos); GZIPOutputStream gos = new GZIPOutputStream(cos); • Para escribir sobre los streams encadenados se invoca el métodowrite()sobre el objeto más externo: • gos.write('a');
Archivos de Acceso Directo • Las clases vistas anteriormente implementan streams de acceso secuencial • La clase RandomAccessFile implementa archivos de acceso directo, en modalidad lectura y escritura (no está conectada con el modelo de streams) • Además de los métodos de lectura y escritura, provee los siguientes métodos adicionales • int skipBytes(int n) • void seek(long pos) • long getFilePointer()
Excepciones • El paquete java.io contiene un conjunto de excepciones, todas derivadas de IOException: • EOFException • FileNotFoundException • InterruptedIOException • IOException • SecurityException
Clase File • Provee una abstracción de los nombres del archivo o directorio en el sistema de archivos • Provee métodos útiles para la manipulación de nombres de archivos • list() • exists() • isFile() • isDirectory() • getName() • getPath() • lastModified() • mkdir() • delete()
Close • Los streams ocupan recursos del sistema operativo • Al terminar de usar un stream, hay que cerrarlo utilizando su método close() • Al cerrar un archivo se realiza un flush()
Resumen • El paquetejava.iotiene dos jerarquías de streams: unapara leer/escribircaracteres (clasesReader y Writer), otrapara leer/escribir bytes (clasesInputStream y OutputStream) • Existen streams conectados directamente a fuentes y destinos de información, y streams que se encadenan a otros