domingo, 28 de junio de 2015

FLUJOS DE ENTRADA Y SALIDA EN JAVA


¿QUÉ ES UN FLUJO O STREAM?

La entrada (input) y salida (output) en java se implementa en el paquete java.io

En términos de programación se denomina entrada a la posibilidad de introducir datos hacia un programa; salida sería la capacidad de un programa de mostrar información al usuario.

La E/S en java se basa en el concepto de flujo o denominado STREAM.

El flujo es una secuencia ordenada de datos que tiene una fuente (flujos de entrada) o un destino (flujos de salida).

Los streams soportan varios tipos de datos:
  • bytes simples, tipos de datos primitivos, caracteres localizados, y objetos
Los Streams se caracterizan por se unidireccionales, es decir que un Stream se utilizara solo para leer, solo para escribir, pero no ambas acciones al mismo tiempo.


En Java se accede a la E/S estándar a través de campos estáticos de la clase java.lang.System
  •  System.in implementa la entrada estándar 
  • „ System.out implementa la salida estándar
  • „ System.err implementa la salida de error


TIPOS DE STREAMS

La API de Java diferencia entre los streams de caracteres y streams de bytes.

  • Streams de bytes (InputStream y OutputStream) 
Los Streams de Bytes como su nombre lo indica trabaja con bytes. Los bytes a leer se leeran en forma unitaria(es decir 8 bits por byte).
Son utilizados para leer y escribir información que esta almacenada en forma binaria, como por ejemplo archivos.
La Superclase utilizada para leer streams orientados a byte es la clase InputStream. A partir de esta clase - la cual es abstracta – heredan todas las clases concretas que se utilizan para leer información en forma binaria.
La superclase utilizada para escribir streams orientados a bytes es la clase OutputStream. A partir de esta clase - la cual es abstracta – heredan todas las clases concretas que se utilizan para escribir información en forma binaria.






  • Streams de caracteres (Reader y Writer):
Los Streams de caracteres operan con caracteres como unidad de trabajo. Los caracteres a leer están formados por 2 bytes(es decir 16 bits por carácter).
Son utilizados para leer y escribir información que esta almacenada en forma de texto, como por ejemplo archivos.
La Superclase utilizada para leer streams orientados a carácter es la clase Reader. A partir de esta clase - la cual es abstracta – heredan todas las clases concretas que se utilizan para leer información en forma textual.
La Superclase utilizada para escribir streams orientados a carácter es la clase Writer. A partir de esta clase - la cual es abstracta – heredan todas las clases concretas que se utilizan para escribir información en forma textual.





EXCEPCIÓN

La excepción que es lanzada cuando algún tipo de operación I/O ha fallado es IOException. Esta excepción debe de ser tratada ya sea manejándola con un bloque de código try-catch en el mismo momento que se realice la operación o dejando que se propague hacia arriba en la pila de llamadas utilizando throws IOException.



SERIALIZACIÓN

La serialización de un objeto consiste en obtener una secuencia de bytes que represente el estado de dicho objeto. Esta secuencia puede utilizarse de varias maneras (puede enviarse a través de la red, guardarse en un fichero para su uso posterior, utilizarse para recomponer el objeto original, etc.). 
Para poder transformar el objeto en una secuencia de bytes, el objeto debe ser serializable.
Un objeto es serializable si su clase implementa la interface Serializable.
La interface Serializable se encuentra en el paquete java.io Es una interface vacía. No contiene ningún método.

ESCRITURA DE OBJETOS EN UN FICHERO BINARIO

Para escribir objetos en un fichero binario en Java se utiliza la clase ObjectOutputStream derivada de OutputStream.
Un objeto ObjectOutputStream se crea a partir de un objeto FileOutputStream asociado al fichero.
El constructor de la clase es:
ObjectOutputStream(OutputStream nombre);

Lanza una excepción IOException.
La clase proporciona los siguientes métodos:
  •  método writeObject(Object objeto) para escribir el objeto en el fichero. 
  • método defaultWriteObject() de la clase ObjectOutputStream realiza de forma automática la serialización de los objetos de una clase. Este método se invoca en el método writeObject().
  • defaultWriteObject() escribe en el stream de salida todo lo necesario para reconstruir los objetos:
  1. - La clase del objeto.
  2. - Los miembros de la clase (atributos).
  3. - Los valores de los atributos que no sean static o transient.
LECTURA DE OBJETOS EN UN FICHERO BINARIO
Para leer los objetos contenidos en un fichero binario que han sido almacenados mediante ObjectOutputStream se utiliza la clase ObjectInputStream derivada de InputStream.
Un objeto ObjectInputStream se crea a partir de un objeto FileInputStream asociado al fichero.
El constructor de la clase es:
ObjectInputStream(InputStream nombre);
Lanza una excepción IOException.
La clase proporciona el método readObject() que devuelve el objeto del fichero (tipo Object).
Es necesario hacer un casting para guardarlo en una variable del tipo adecuado.
Es necesario cerrar el flujo de bytes de salida para esto se usa el método close().


EJEMPLO:
Escribir y guardar en un archivo los datos de un paciente, para luego poder leerlos mediante la utilización de flujos de entrada y salida.

1. Creación de la Clase Paciente
La clase Paciente implementa la interfaz Serializable, la cual le permite la transformación de un objeto en una secuencia de bytes que pueden ser posteriormente leídos para reconstruir el objeto original.
Esta Clase presenta 5 atributos: Documento, nombre, género, fecha de nacimiento y la cantidad de pacientes.
Se crea los respectivos constructores de la clase, al igual que los métodos getters y setters de cada atributo.
Finalmente se sobreescribe el método TosString.
A continuación se muestra la clase Paciente realizada en NETBEANS.


Aplicación para escribir en un archivo mediante la utilización de la clase ObjectOutputInputString



Salida


Aplicación para leer en un archivo mediante la utilización de la clase ObjectInputString


Salida

2 comentarios: