Download Java6-Streams - DCC

Document related concepts
no text concepts found
Transcript
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
2
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:

3
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
4
El Package java.io

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)
Lectura
Escritura
Operan sobre bytes
InputStream
OutputStream
Operan sobre
caracteres
Reader
Writer
5
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
Streams de Caracteres




Métodos operan
sobre (arreglos de)
caracteres
Contiene caracteres
Unicode de 16-bit
Implementado por
clases Reader y
Writer
Manejan buffers
6
Reader y InputStream

Clases abstractas para leer caracteres y bytes



Métodos básicos Reader:




Reader permite leer streams de caracteres
InputStream permite leer streams de bytes
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)
7
Writer y OutputStream

Clases abstractas para escribir caracteres y bytes



Métodos básicos Writer:




Writer permite escribir streams de caracteres
OutputStream permite escribir streams de bytes
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)
8
Streams de Caracteres
9
Streams de Bytes
10
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
11
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.
12
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();
}
}
13
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 los
requerimientos
Los decoradores concretos
agregan o modifican funcionalidad
Los decoradores tienen la misma
interfaz que los componentes
“decorados”, de modo que para
el cliente es transparente si está
operando con un componente
decorado o no
14
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();
}
}
15
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");
}
16
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();
17
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() sobre el objeto más
externo:

gos.write('a');
18
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()
19
Excepciones

El paquete java.io contiene un conjunto
de excepciones, todas derivadas de
IOException:





EOFException
FileNotFoundException
InterruptedIOException
IOException
SecurityException
20
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()
getPath()
lastModified()
mkdir()
delete()




list()
exists()
isFile()
isDirectory()
21
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()
22
Resumen


El paquete java.io tiene dos jerarquías de
streams: una para leer/escribir caracteres
(clases Reader y Writer), otra para
leer/escribir bytes (clases InputStream y
OutputStream)
Existen streams conectados directamente a
fuentes y destinos de información, y streams
que se encadenan a otros
23