Está en la página 1de 25

Un Stream es simplemente una fuente o destino de bytes. Los streams ms comunes son los archivos.

Tambin pueden ser caracteres de un string o bloque de memoria o bytes de un socket. La idea es que el programador los trate de la misma forma que archivos. En Java se usan diferentes mecanismos para dar formato a datos. Ofrece clases orientada a manejo de bajo nivel y otras de alto nivel. Da gran flexibilidad y hace uso de filtros en cascada para manipular los datos de entrada o salida. En general la flexibilidad en ocasiones resulta ms aparatosa que lo que desearamos.
1

Clase para lectura de Caracteres

Clase abstracta

Clase para escritura de caracteres

Clase abstracta

PrintWriter

Lectura de bytes
Clase abstracta

Escritura de bytes

Clase abstracta

Los archivos tienen como finalidad guardar datos de forma permanente. Una vez que acaba la aplicacin los datos almacenados estn disponibles para que otra aplicacin pueda recuperarlos para su consulta o modificacin.

En ocasiones, no se desea leer un archivo de principio a fin; sino acceder al archivo como una base de datos, donde se salta de un registro a otro; cada uno en diferentes partes del archivo. Java proporciona una clase RandomAccessFile para este tipo de entrada/salida.

Hay dos posibilidades para abrir un archivo de acceso aleatorio: Con el nombre del archivo:
miRAFile = new RandomAccessFile( String nombre,String modo );

Con un objeto File:

miRAFile = new RandomAccessFile( File fichero,String modo );

El argumento modo determina si se tiene acceso de slo lectura ( r ) o de lectura/escritura ( r/w ). Por ejemplo, se puede abrir un fichero de una base de datos para actualizacin:
RandomAccessFile miRAFile = new RandomAccessFile( "/tmp/kk.dbf","rw" );

Acceso a la Informacin Los objetos RandomAccessFile esperan informacin de lectura/escritura de la misma manera que los objetos DataInput / DataOutput, el acceso a todas las operaciones read() y write() de las clases DataInputStream y DataOutputStream . Tambin se tienen muchos mtodos para moverse dentro de un archivo: long getFilePointer(); Devuelve la posicin actual del puntero del archivo void seek( long pos ); Coloca el puntero del archivo en una posicin determinada. La posicin es dada como un desplazamiento en bytes desde el comienzo del archivo. La posicin 0 marca el comienzo de ese fichero. long length();

La clase OutputStream es una clase abstracta que especifica un nmero de operaciones para escribir un byte, para escribir un arreglo de bytes, y para cerrar el stream. Clases derivadas de sta son FileOutputStream y ByteArrayOutputStream, las cuales son clases concretas (no abstractas). Sus operaciones de write envan bytes a archivo o memoria. Para dar formato a los datos (imprimir nmeros y strings) se dispone de las clases Writers. PrintWriter es una clase de esa jerarqua, la cual recibe en su constructor el objeto con el cual podr escribir (write) los bytes. Ej. FileOutputStream fout = new FileOutputStream(output.dat); PrintWriter pout = new PrintWiter(fout);

import java.io.*;

public class Copy { public static void main(String[] args) throws IOException { File inputFile = new File("farrago.txt"); File outputFile = new File("outagain.txt"); FileReader in = new FileReader(inputFile); FileWriter out = new FileWriter(outputFile); int c;
while ((c = in.read()) != -1) out.write(c); in.close(); out.close();
9

Adems de formato podemos disponer de un buffer para mejorar el desempeo de algunos dispositivos de entrada y salida. El incorporar un buffer y con ello crear la cadena es un caso de filtrado, se usa: PrintWriter pout = new PrintWriter( new BufferedOutputStream (new FileOutpurStream(Output.dat)));

PrintWriter

Los filtros se pueden construir usando cualquier combinacin de clases encadenando una despus de la otra. La primera clase es aquella que permite leer o escribir objetos, y la ltima clase de la cadena enva o recibe los bytes. Las clases intermedias pueden hacer el trabajo que necesitemos (buffer, encriptacin etc.)

BufferedOutputStream

FileOutputStream

10

Flujos (Streams)
Es una abstraccin, que representa a un flujo de datos entre un origen y un destino en Java. Todo proceso de entrada y salida en Java se hace a travs de flujos.

Entre el origen y el destino debe existir un canal , por el que viajan datos. Cuando se abre un archivo se establece una conexin entre el programa y el dispositivo que contiene ese archivo , por el canal fluir la secuencia de datos. Igual ocurre al intentar escribir en un archivo.

Archivos y Flujos (Streams)


Para obtener informacin de una fuente un programa abre un stream y lee la informacin secuencialmente

De igual forma, un programa puede enviar informacin a un destino externo abriendo un stream al destino y escribiendo la informacin secuencialmente .

No importa el tipo de datos ni de donde proviene ni a donde se dirige, los algoritmos para la lectura y escritura de datos son escencialmente los mismos
Abrir el stream mientra haya informacin leer informacin cerrar el stream
Abrir el stream mientra haya informacin escribir la informacin cerrar el stream

Java posee una coleccin de clases stream las cuales soportan estos algoritmos de lectura y escritura

Para utilizar las clases stream el programa deber importar el paquete java.io donde se encuentran todas las clases necesarias para dar entrada/salida a las aplicaciones.

Adems de formato podemos disponer de un buffer para mejorar el desempeo de algunos dispositivos de entrada y salida. El incorporar un buffer y con ello crear la cadena es un caso de filtrado, se usa: PrintWriter pout = new PrintWriter( new BufferedOutputStream (new FileOutpurStream(Output.dat)));

PrintWriter

Los filtros se pueden construir usando cualquier combinacin de clases encadenando una despus de la otra. La primera clase es aquella que permite leer o escribir objetos, y la ltima clase de la cadena enva o recibe los bytes. Las clases intermedias pueden hacer el trabajo que necesitemos (buffer, encriptacin etc.)

BufferedOutputStream

FileOutputStream

16

Para escribir texto, podemos usar PrintWriter y sus operaciones print o println. PrintWriter out; Employee harry; .... // apertura del PrintWriter entre otras out.println(3.14); out.print(Harry : ); out.print(harry); Cuando se imprimen objetos, se invoca el mtodo toString del objeto. La clase Object implementa este mtodo, el cual imprime la clase del objeto y su direccin. Lo recomendable es redefinir este mtodo para producir un string que tenga ms sentido para la clase especfica.

17

Para salida binaria, usamos las clases DataInputStream y DataOutputStream. Ellas proveen las siguientes operaciones: DataInputStream DataOutputStream readInt writeInt readShort writeShort readLong writeLong readFloat writeFloat readDouble writeDouble readBoolean writeBoolean readChar writeChar writeChars Ejemplo: DataOutputStream out = new DataOutputStream(new FileOutputStream(output.dat)); out.writeDouble(3.14); out.writeChars(Harry);

18

Una propiedad importante de las operaciones previas es que son independiente del procesador (tamao de datos). Se usa el ordenamiento de la red big-endian. La comunicacin es segura pues la clase se encarga de hacer las conversiones si el procesador es little-endian. Ej. Para guardar un string, primero se puede guardar el tamao y luego los caracteres. String s; .... out.writeInt(s.length()); out.writeChars(s); Para leer el string de vuelta: int len = in.readInt(); StringBuffer b = new StringBuffer(len); for (int i=0; i <len; i++) b.append(in.readChar()); String s = b.toString();

19

Una propiedad importante de las operaciones previas es que son independiente del procesador (tamao de datos). Se usa el ordenamiento de la red big-endian. La comunicacin es segura pues la clase se encarga de hacer las conversiones si el procesador es little-endian. Ej. Para guardar un string, primero se puede guardar el tamao y luego los caracteres. String s; .... out.writeInt(s.length()); out.writeChars(s); Para leer el string de vuelta: int len = in.readInt(); StringBuffer b = new StringBuffer(len); for (int i=0; i <len; i++) b.append(in.readChar()); String s = b.toString();

20

Los streams para archivos se manejan con los objetos asociados a la clase File(FileReader y FileWriter) para leer y escribir a un archivo en asociacin con los mtodos: read() y write(). Un stream para archivos se puede crear a partir de Un String con el nombre del archivo Un objeto tipo File Un objeto tipo FileDescriptor

import java.io.*; public class Copy { public static void main(String[] args) throws IOException { File inputFile = new File("archivo.txt"); File outputFile = new File("salida"); FileReader in = new FileReader(inputFile); FileWriter out = new FileWriter(outputFile); int c; while ((c = in.read()) != -1) out.write(c); in.close(); out.close(); } }

Se emplean las clases ByteArrayOutputStream y ByteArrayInputStream. Para escribir sobre un string usando print().
Date bday = new Date(1975, 6,16); ByteArrayOutputStream bout = new ByteArrayOutputStream(); PrintWriter out = new PrintWriter(bout); out.print(Birthday: ); out.println(bday); String b = out.toString();

23

Para escribir o leer dados binarios usamos DataInputStream o DataOutputStream. Para escritura formateada, usamos PrintWriter. Para lectura de texto en alto nivel no tenemos ninguna clase. Debemos hacerlo a mano. Por ejemplo: Para lectura de lneas podemos usar el mtodo readLine de la clase BufferedReader.
BufferedReader in = new BufferedReader(new FileReader(employee.txt); String line; while ((line = in.readLine())!=null) { hacemos algo }

24

Para leer nmeros, debemos cargar un string y luego convertirlo. Es posible que debamos extraer el dato desde el string para ello utilizamos la clase utilitaria StringTokenizer. Caso simple: String s=in.readLine(); double x=Double.parseDouble(s);

25

También podría gustarte