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
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)
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 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
Leyendo de un Archivo
El siguiente código permite leer por líneas de un archivo:
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étodo write() 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
getName()
getPath()
lastModified()
mkdir()
delete()
list()
exists()
isFile()
isDirectory()
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 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