View
223
Download
0
Category
Preview:
Citation preview
Programación Orientada a Objetos
Anexo 5Streams
Universidad de ChileDepartamento de Ciencias de la Computación
2
Temario
Streams El package java.io Streams de bytes y de caracteres Streams de bajo y alto nivel Leyendo y escribiendo Sockets
3
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:
4
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
5
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
Lectura Escritura
Operan sobre bytes
InputStream OutputStream
Operan sobre caracteres
Reader Writer
6
Streams Byte v/s Character
Streams Streams de de CaracteresCaracteres
Métodos operan sobre (arreglos de) caracteres
Contiene caracteres Unicode de 16-bit16-bit
Implementado por clases ReaderReader y WriterWriter
Manejan buffers
Streams Streams de de ByteBytess Métodos operan
sobre (arreglos de) bytes
Contiene bytes de 8-bit8-bit
Implementado por clases InputStreamInputStream y OutputStreamOutputStream
No manejan buffers
7
Reader y InputStream
Clases abstractas para leer caracteres y bytes ReaderReader permite leer streams de caracteres InputStreamInputStream permite leer streams de bytes
Métodos básicos ReaderReader: int read() int read(char[] cbuf) abstract int read(char[] cbuf, int off, int len)
Métodos básicos InputStreamInputStream: abstract int read() int read(byte[] bbuf) int read(byte[] bbuf, int off, int len)
8
Writer y OutputStream
Clases abstractas para escribir caracteres y bytes WriterWriter permite escribir streams de caracteres OutputStreamOutputStream permite escribir streams de bytes
Métodos básicos WriterWriter: void write(int c) void write({char[]|String} cbuf) abstract void write({char[]|String} cbuf, int off, int len)
Métodos básicos OutputStreamOutputStream: abstract void write(int b) void write(byte[] bbuf) void write(byte[] bbuf, int off, int len)
9
Streams de Caracteres
10
Streams de Bytes
11
Streams Conectados a Datos
Streams conectados directamente a fuentes o destinos de información (en gris en las jerarquías anteriores)
Clases Fuente o destino de datos
FileReader, FileWriter, FileInputStream, FileOutputStream
Archivos
PipedReader, PipedWriter, PipiedInputStream, PipedOutputStream
Pipes: un thread lee en un PipedReader lo que otro escribe en un PipedWriter
CharArrayReader, CharArrayWriter
Arreglos de caracteres
StringReader, StringWriter Strings
ByteArrayInputStream, ByteArrayOutputStream
Arreglos de bytes
12
Encadenamiento de Streams Streams que operan sobre otros streams, agregando
funcionalidad, convirtiendo información, etc. (en blanco en las jerarquías anteriores)
Clases Descripción
FilterReader, FilterWriter, FilterInputStream, FilterOutputStream
Clases base para la implementación del patrón de diseño Decorator; los métodos simplemente delegan los requerimientos en el stram “conectado”.
BufferedReader, BufferedWriter, BufferedInputStream, BufferedOutputStream
Manejan buffers. BufferedReader agrega además un método readLine().
LineNumberReader, LineNumberInputStream
Agregan el método getLineNumber().
InputStreamReader, OutputStreamWriter Proveen conversión entre bytes y caracteres.
PushbackReader, PushbackInputStream Agregan métodos unread().
SequenceInputStream InputStream que lee desde una secuencia de objetos InputStream.
PrintWriter, PrintStream Agregan métodos para escribir objetos formateadamente.
DataInputStream, DataOutputStream Proveen métodos para leer y escribir tipos primitivos.
ObjectInputStream, ObjectOutputStream Proveen manejo de serialización.
13
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(); }}
14
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
15
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(); }}
16
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");}
17
Escribe texto y números en formato de texto, en métodos print()print() y println()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();
PrintWriter
18
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étodo write()write() sobre el objeto más externo:
gos.write('a');
19
Archivos de Acceso Directo
Las clases vistas anteriormente implementan streams de acceso secuencial
La clase RandomAccessFileRandomAccessFile 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()
20
El paquete java.io contiene un conjunto de excepciones, todas derivadas de IOException: EOFException EOFException FileNotFoundException FileNotFoundException InterruptedIOExceptionInterruptedIOException IOException IOException SecurityExceptionSecurityException
Excepciones
21
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
getName()getName() getPath()getPath() lastModified()lastModified() mkdir()mkdir() delete()delete()
list()list() exists()exists() isFile()isFile() isDirectory()isDirectory()
22
Close
Los streams ocupan recursos del sistema operativo
Al terminar de usar un stream, hay que cerrarlo utilizando su método close()close()
Al cerrar un archivo se realiza un flush()flush()
23
El paquete java.iojava.io tiene dos jerarquías de streams: una para leer/escribir caracteres (clases ReaderReader y WriterWriter), otra para leer/escribir bytes (clases InputStreamInputStream y OutputStreamOutputStream)
Existen streams conectados directamente a fuentes y destinos de información, y streams que se encadenan a otros
Resumen
Recommended