3.9 Streams y
Archivos
Streams, clases, archivos,
streams de objetos y
serialización
3.9.1 Streams Básicos
Streams de Bytes y Caracteres
l E/S es en principio una secuencia de bytesl Ejemplo: Archivo, dispositivo, conexión red, etc.
l Java provee dos clases básicas para bytes:
l InputStream: Secuencia de bytes de entrada
l OutputStream: Secuencia de bytes de salida
l Estas clases no son convenientes para manejo de Unicode (un carácter tiene 16 bits), ∴se define:
l Reader: Entrada de caracteres Unicode
l Writer: Salida de caracteres Unicode
l De estas cuatro clases abstractas Java deriva las demás clases
API de
InputStream (1/2)
l abstract int read()l Lee un byte de entrada (retorna -1 se llega al final) l int read(byte[] b)
l Lee un arreglo de bytes (lee a lo más b.length bytes)
l Retorna bytes leídos (retorna -1 si está al final) l int read(byte[] b, int off, int largo)
l Lee un arreglo de bytes (lee a lo más b.length bytes)
l Retorna bytes leídos (retorna -1 si está al final)
l off: offset en arreglob
l largo: Máximo # de bytes a leer
API de
InputStream (2/2)
l long skip(long n)l Salta nbytes en la entrada (retorna # de bytes saltados) l int avalaible ()
l Retorna # de bytes disponibles sin bloquear l void close()
l Cierra entrada l void mark(int lim)
l Coloca marca en posición actual. Se borra al leer limbytes l void reset()
l Vuelve a posición de última marca l boolean markSupported()
l retorna verdadero si soporta marcas
API de
OutputStream
l abstract void write(int n)
l Escribe un byte de datos l void write(byte [] b)
l Escribe todos los bytes en el arreglo b
l void write(byte [] b, int off, int largo)
l Escribe largobytes desde posición offen el arreglo b
l void close()
l Cierra la salida l void flush()
API de Reader y Writer
l
Reader
lint read()
lint read(char cbuf[])
lint read(char cbuf[], int offset, int largo)
l
Writer
lint write(int c)
lint write(char cbuf[])
lint write(char cbuf[], int offset, int largo)
Conjunto de Streams
l
Java provee más de 60 clases de streams
l
Todas las clases se derivan de las 4 clases
básicas
l
Clases básicas sólo permiten leer o escribir
bytes o caracteres
Subclases de Reader y Writer
Subclases de
OutputStream
InputStream y
Composición de Streams
l Los streams se pueden componer para lograr la funcionalidad deseada
l Ejemplo:
l FileInputStreampermite leer bytes desde un archivo
l Java provee algunas clases que permiten ensamblar bytes en tipos de datos útiles (e.g. DataInputStreamy
PrintWriter)
l Java permite combinarlos para lograr, por ejemplo leer números de un archivo
Ejemplos de Streams de
Filtrado
FileInputStream fin = new FileInputStream(“miArchivo.txt”) DataInputStream din = new DataInputStream(fin); double d = din.realDouble();
PushbackInputStream pbin = new PushbackInputStream (new BufferedInputStream
(new FileInputStream(“miArchivo.txt”))); ...
3.9.2 Archivos
Clases Básicas de Archivos
l
FileReader
. Lectura de caracteres
l
FileWriter
. Escritura de caracteres
l
FileInputStream
. Lectura de bytes
l
FileOutputStream
. Escritura de bytes
Constructores para Archivos
l Las cuatro clases anteriores aceptan tres tipos deconstructores
l FileInputStream in = new
FileInputStream (“miArchivo”); l File f = new File(“miArchivo”)
FileInputStream in = new FileInputStream(f); l FileDescriptor fd = ...;
FileInputStream in = new FileInputStream(fd); FileInputStream in = new
FileInputStream(archivoEntrada); FileOutputStream out = new
FileOutputStream(archivoSalida);
Ejemplo: Copia de Archivo
import java.io.*;public class Copy {
public staticvoid main(String[] args) throws IOException {
File archivoEntrada = new File(”Entrada.txt"); File archivoSalida = new File(”Salida.txt"); FileReader in = new FileReader(archivoEntrada); FileWriter out = new FileWriter(archivoSalida); int c; while ((c = in.read()) != -1) out.write(c); in.close(); out.close(); } }
Clase
File
l
No corresponde a un stream (se deriva de
Object
), que permite tener repesentación
abstracta de archivos y directorios
l
Está definida en
paquete java.io
l
Posee métodos tales como:
lCrear directorio, renombrar, borrar, sendero del archivo, listar directorio, etc.
Clase
RandomAccessFile
l
int skipBytes(int)
lMueve el puntero el # de bytes indicado hacia adelante
l
void seek(long)
lPosiciona el puntero justo antes del byte especificado
l
long getFilePointer()
Streams y Archivos ZIP
l Se usan para archivar uno o más archivos en formato comprimido (GZIP o ZIP)
l Cada archivo tiene un cabecera con información tal como:
l Nombre del archivo, método de compresión
l Para procesar una entrada se deben leer las entradas l Java provee cuatro clases para compresión
definidas en paquete java.util.zip.*:
l ZipInputStream. Stream de entrada comprimida
l ZipOutputStream. Stream de salida comprimida
l ZipEntry. Describe una entrada
l ZipFile. Archivo ZIP
3.9.3 Streams
Especiales
Streams de Buffering
l
BufferedInputStream
lPermite usar buffer de entrada para leer sin causar un acceso a dispositivo en cada operación
l
BufferedOutputStream
lIdem para salida
l
PushbackInputStream
lPermite devolver datos al stream
Clases DataInput y DataOutput
l boolean readBoolean () l byte readByte() l char readChar() l double readDouble() l float readFloat() l int readInt() l String readLine() l long readLong() l short readShort () void writeBolean(boolean b) void writeByte(byte b) void writeChar(char c) void writeChars(String s) void writeDouble (double d) void writeFloat(float f) void writeInt(int i) void writeLong (long l) writeShort(short s)
¡Leen y escriben en binario!
Clase
PrintWriter
l Permite escribir texto formateado(no se especifica destinatario)
l void print(Object) l void print(String s) l void println(String s) l void print(char[] s) l void print(char c) l void print(int i) l etc.
Ejemplo de
PrintWriter
PrintWriter out = new PrintWriter ( new FileOutputStream (“miArchivo”)); ...
out.print(“Esta es una prueba ”); out.print(2002);
... Especifica
System.in y System.out
l
System.out es un PrintStream
lSystem.out.println(“....”);
l
System.in es un InputStream
l¿Cómo leer desde el teclado?
java.io.BufferedReaderbr; try{ br = new java.io.BufferedReader( new java.io.InputStreamReader(System.in)); Stringstr= br.readLine(); System.out.println("Ud ingreso "+str); }catch(java.io.IOExceptionioe ){ }
Resumen
l
Los streams son el mecanismo básico de
Java para proveer E/S y son parte de
java.io
l