Flujos - (I/O)Stream

Como todos conocemos que en todo programa tenemos 3 flujos, entrada estándar, salida de error  y salida estándar.



Flujo abstracción de todo aquello que nos produzca o consuma información.


En java a los flujos se los denominan como "STREAM" para lograr la comunicación entre el medio externo y nuestro programa (para saber si tiene que tratar con el monitor, el teclado, un socket o un sistema de ficheros); se acceden a las entradas y salidas estándar a través de campos estáticos de la clase java.lang.System; para cada flujo tenemos:
  • System.in (entrada estándar)
  • System.out (salida estándar)
  • System.err (salida de error)



Existen dos tipos de flujos:


Byte Streams nos permiten manejar entradas y salidas de bytes, esta orientado a la lectura y escritura de datos binarios. Poseen las clases abstractas InputStream y OutputStream; también definen los métodos que sus subclases deberán implementar read() y write(), que leen y escriben bytes respectivamente.


Character Streams nos permite manejar entradas y salidas de caracteres, esta orientado a la lectura y escritura de caracteres; utiliza unicode (codificación de caracteres, que proporciona a cada carácter un numero único que lo representa  sin importar la plataforma, programa o idioma). Del mismo modo posee clases abstractas que manejan flujos de caracteres como lo son Reader y Writer, que definen los métodos read() y write(), los cuales deben ser implementados por sus subclases.




Pautas previas a la lectura y escritura de un archivo con flujos de bytes:



Crear un Objeto Serializable


Con los flujos de bytes podemos escribir o leer directamente un objeto sobre un archivo; para lo cual es necesario crear un objeto serializable.


Serializar es codificar un objeto en el buffer de memoria (medio de almacenamiento), para mas adelante ser transmitido como un flujo de bytes.


Objeto serializable es un objeto en el cual se a implementado al interfaz seralizable con el fin de que pueda ser convertido en una secuencia de bytes, y mas tarde ser reconstruido de secuencia de bytes como objeto.


Serializable es una interfaz que logra la conversión a secuencia de bytes a un objeto, esta incluida dentro dentro del JRE de java, cuyo método abstracto no debe ser sobrescrito, solo debe ser llamada. Se la implementa como cualquier otra interfaz.



Escribir un archivo


Para escribir un archivo es necesario crear un flujo de salida a disco (proceso similar a la escritura desde la salida estándar) y vincular los datos a un objeto de salida, para lo cual implementamos:


FileOutputStream es un constructor de la clase File que permite crear un archivo como flujo de salida a disco (archivo de salida); cuyo parámetro de entrada sera el nombre o dirección del archivo.


ObjectOutputStream es un constructor de la clase FileOutputStream que crea un objeto, cuyos datos están vinculados al archivo de salida (FileOut) el mismo que es el el parámetro de entrada del constructor.


Adicionalmente necesitamos escribir los objetos al flujo de salida y guardalos en el archivo del disco, entonces utilizamos el método writeObject().


Finalmente es necesario cerrar el flujo de bytes de salida para lo cual utilizamos el método close().



Leer un archivo:


Para leer un archivo es necesario crear un flujo de entrada a disco (proceso similar a la lectura desde la entrada estándar) y vincular los datos a un objeto de entarda, para lo cual implementamos:


FileInputStream es un constructor de la clase File que permite crear un archivo como flujo de entrada a disco (archivo de entrada); cuyo parámetro de entrada sera el nombre o dirección del archivo.


ObjectInputStream es un constructor de la clase FileInputStream que crea un objeto, cuyos datos están vinculados al archivo de entrada (FileIn) el mismo que es el el parámetro de entrada del constructor.


Adicionalmente necesitamos leer los objetos del flujo de entrada, entonces utilizamos el método readObject(), y lo almacenamos dentro de un objeto del mismo tipo, haciendo el casting respectivo.


Finalmente es necesario cerrar el flujo de bytes de salida para lo cual utilizamos el método close().



Excepciones lanzadas:


Al momento de emplear los constructores FileOutputStream y FileInputStream me lanzara la excepción FileNotFoundException; también al implementar ObjectOutputStream ObjectInputStream la excepción IOException; de igual manera al llamar al método readObject() la excepción ClassNotFoundException.


FileNotFoundException indica que la existe un error al momento de abrir un archivo.


IOException indica que las operaciones de Entrada/Salida han sido fallidas o interrumpidas.


ClassNotFoundException se da cuando aplicación intenta cargar en una clase a través de su nombre de cadena usando los métodos forName, findSystemClass , loadClass y no están definido el nombre de la clase.




EJEMPLO


Escribir y leer un archivo, con flujo de bytes, utilizando la escritura directa de un objeto.


Primero crearemos la clase paciente con los atributos: (String) documento, (String) nombre, (char) genero, (Calendar) fecha de nacimiento y su respectivo encapsulamiento; adicionalmente crearemos un constructor con atributos de entrada (documento, nombre y genero) 




Segundo implementaremos la interfaz serializable, con el fin de que los objetos creados puedan ser convertidos flujos de bytes





Escribir!
Tercero crearemos nuestra clase aplicación para la escritura de archivos, entonces creamos e instanciamos un ArrayList de tipo Paciente y de nombre listaPacientes en el cual ingresaremos 6 pacientes solo numero, nombre y genero



Cuarto creamos archivo de flujo de salida a disco de nombre informacionFileOutput, y vincularemos un objeto (ObjectOutputStream) cuyo nombre es salida, al archivo de salida creado


Quinto tratamos cada una de las excepciones lanzadas con try y catch, las capturamos y mostramos el respectivo mensaje de error y su información 



Sexto escribimos el objeto listaPacientes al flujo de salida con writeObject()



Séptimo cerramos el flujo de salida de bytes.


Finalmente tendremos el siguiente código.



Resultados por consola tendremos una compilación exitosa.


Y si abrimos el archivo generado con cualquier editor de texto, tendremos algo como esto:






Leer!
Tercero crearemos nuestra clase aplicación para la lectura de archivos, donde generaremos nuestro archivo de flujo de entrada a disco de nombre informacionFileInput, y vincularemos un objeto (ObjectInputStream) cuyo nombre es entrada, al archivo de salida creado



Cuarto creamos e instanciamos un ArrayList de tipo Paciente y de nombre listaPacientes, donde guardaremos nuestros datos leídos.



Quinto leemos los datos con el método readObject() e igualo al objeto (ArrayList) listaPacientes, con su debido casting de ObjectInputStream a  ArrayList



Sexto cerramos el flujo de bytes de lectura con el método close()



Séptimo tratamos cada una de las excepciones lanzadas con try y catch, las capturamos y mostramos el respectivo mensaje de error y su información.



Octavo imprimimos el contenido de Array (datos leídos). No utilizamos el toString porque no ingresamos todos los datos y nos dará un error.



Finalmente tendremos el siguiente código.



Resultado si al lectura fue exitosa tendremos por consola:




Ejemplo

     Paciente



No hay comentarios.:

Publicar un comentario