You are on page 1of 8

SERVICIO NACIONAL DE APRENDIZAJE SENA 2014

Archivos en Java

Para poder entender cmo manejar un archivo en Java debemos empezar por entender
lo que es un Flujo de datos.

Flujos

Un flujo es el sistema que nos ayuda a realizar la comunicacin en Java, utilizando el


paquete ya implementado java.io cuyo fin es guardar y tomar la informacin en cada
uno de los diversos dispositivos de almacenamiento.

Se puede decir que un flujo es como un tubo o recipiente en donde podemos leer o
escribir bytes. De un extremo nosotros ponemos algo y del otro extremo del tubo
puede estar cualquier dispositivo un teclado, un monitor, un archivo, un objeto de
Java, etc.

Todos los flujos que aparecen en Java englobados en el paquete java.io, pertenecen a
dos clases abstractas comunes: java.io.InputStream para los flujos de Entrada
(aquellos de los que podemos leer) y java.io.OutputStream para los flujos de salida
(aquellos en los que podemos escribir). Java tiene un conjunto de Clases y mtodos ya
establecidos para captar la informacin de los flujos de entrada y de salida por los
dispositivos estndar.

En el caso de los flujos de entrada tiene System.in, el cual suele recibir los datos de
teclado, utilizando el mtodo read() para leer los caracteres. Para los flujos de salida
se utiliza System.out y los datos se envan a pantalla, utilizando el mtodo print() o
println() cuya diferencia es que con el print la informacin se manda tal cual al buffer
de salida, sin saltar de lnea, pero debemos utilizar el mtodo flush() para saltar de
lnea, en cambio con el println se manda el buffer de salida directamente a la pantalla
y se salta de lnea.

Existe un flujo de datos para los errores y ste es el System.err, el cual enva la salida
tambin directamente a la pantalla, pero si se desea se puede redireccionar, de
manera que se separe el dispositivo de salida del dispositivo de la salida con error.

La manera en la que en Java se toma la informacin de entrada es asociando al flujo


estndar de entrada la creacin de un objeto de InputStreamReader, el cual es
utilizado a su vez para la creacin de un objeto de la clase BufferedReader, de esta
manera lo que viene del teclado se envuelve entre clases para de pasar de bits a bytes
y luego a datos que pueden ser ledos.

Al utilizar el objeto de la clase BufferedReader tenemos el mtodo readLine() el cual


lee un conjunto de bytes del buffer de entrada hasta detectar el fin de lnea. La
manera en la que Java saca la informacin a salida es utilizando la clase PrintWriter
tomando el objeto de salida System.out, para crear el objeto de la clase PrintWriter.
Los mtodos que se utilizan son el print y println. Las clases de Streams, Readers y
Writers en java ven la entrada y salida como una secuencia de bytes. Los streams de
bajo nivel ms comunes son:

Ing. Yuli Garcs Bolaos


SERVICIO NACIONAL DE APRENDIZAJE SENA 2014

FileInputStream(String pathname)
FileInputStream(File file)
FileOutputStream(String pathname)
FileOutputStream(File file)

Una vez que un stream de entrada ha sido construido, pueden llamarse mtodos para
leer un simple byte, o una porcin de un arreglo de bytes.

A continuacin un ejemplo que lee bytes de un archivo.

Es conveniente leer bytes de un dispositivo de entrada y escribir a un dispositivo de


salida. Sin embargo, normalmente lo que se desea leer y escribir no son bytes sino
informacin tal como enteros o cadenas de caracteres (int o String), etc.
Java cuenta con manejo de streams de alto nivel. Los ms comunes son:

DataInputStream(InputStream instream)
DataOutputStream(OutputStream outstream)

Un ejemplo de cmo grabar en un archivo utilizando un DataOutputStream sera:

Ing. Yuli Garcs Bolaos


SERVICIO NACIONAL DE APRENDIZAJE SENA 2014

Un ejemplo que muestra como leer los datos que el anterior ejemplo dej, utilizando
un DataInputStream sera:

Puedes probar implementar estas instrucciones cada conjunto en una diferente


aplicacin y ver lo que hacen, para que percibas como es que se genera el archivo y
luego lo leas desde la otra aplicacin.

Otros manejadores de streams de alto nivel:

Ing. Yuli Garcs Bolaos


SERVICIO NACIONAL DE APRENDIZAJE SENA 2014

BufferedInputStream y BufferedOutputStream, manejan internamente un buffer


de manera que los bytes puedan ser escritos y ledos en bloques, optimizando el
proceso de entrada/salida. BufferedReader(Reader reader)

PrintStream: Esta clase maneja texto o primitivas de datos. Las primitivas de datos
se convierten a representaciones de carcter. El System.out y System.err que se
utiliza en las aplicaciones de consola son ejemplos de esta clase.
PrintStream(OutputStream out). Al igual que los streams de entrada y salida: Los
readers y writers de bajo nivel se comunican con dispositivos, mientras que los de alto
nivel se comunican con los de bajo nivel. La diferencia es que los readers y writers se
orientan exclusivamente al manejo de caracteres Unicode.
Un ejemplo de reader de bajo nivel es el FileReader:

FileReader(String pathname)
FileReader(File file)

Algunos mtodos para lectura que provee la superclase Reader son:

int read() throws IOException. Regresa el siguiente valor entero del carcter (16 bits:
0 to 65535), -1 si no hay ms caracteres.
int read(char[] cbuf) throws IOException.
Llena el arreglo con los caracters leidos, regresa el nmero de caracteres que se
leyeron.

Un ejemplo de writer de bajo nivel es el FileWriter:

FileWriter(String pathname)
FileWriter(File file)

BufferedReader y BufferedWriter. Estas clases tienen buffers internos de manera


que los datos pueden ser ledos o escritos en bloques. Son similares a
BufferedInputStream y BufferedOutputStream, pero mientras stos manejan bytes,
BufferedReader y BufferedWriter se maneja con caracteres.
Constructores para estas clases:

BufferedReader(Reader in)
BufferedWriter(Writer out)

InputStreamReader y OutputStreamWriter. Estas clases convierten entre streams


de bytes y secuencias de caracteres Unicode. Provee el puente entre la conversin de
los bytes y un sistema (charset). Ejemplo:
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));

PrintWriter. Similar a PrintStream, pero escribe caracteres en vez de bytes. Ejemplo.


PrintWriter stdErr = new PrintWriter(System.out,true);
A continuacin tenemos un ejemplo muy sencillo:

Ing. Yuli Garcs Bolaos


SERVICIO NACIONAL DE APRENDIZAJE SENA 2014

La aplicacin se pudiera visualizar como los ejemplos siguientes:

En este ejemplo observamos cmo se utiliza el objeto ent para pedir el dato, el objeto
sal es utilizado para desplegar la salida correcta y el objeto salErr es utilizado para
desplegar la salida con errores.

Es una convencin de Java el utilizar la salida con errores salErr para poder tener la
diferencia entre la salida normal y la salida con errores, de esta manera, si tuvieramos
aplicaciones que se entrelazan para que la salida de una aplicacin sea la entrada de
otra, no entremezclamos la salida del proceso normal con la salida de los errores o
desplegados.
Si te das cuenta la salida con errores salErr fue utilizada para pedir el nmero, ya que
en la pantalla seria lo mismo utilizar sal o salErr, pero si redireccionamos sal, y salErr,
entonces salErr pudiera seguir siendo la pantalla para ver los que me pide la aplicacin
y lo que se despliega con error, pero sal pudiera ser redireccionado a un archivo o a
otra aplicacin y nosotros como usuarios no veramos esa salida.

Las clases de FileReader y FileWriter proveen acceso a los datos de disco. El FileReader
extiende del InputStreamReader y el siguiente es uno de sus constructores:

FileReader(String fileName)
Un constructor para FileWriter:
FileWriter(String fileName)

Se usan archivos para almacenar datos que se quieren conservar despus de que el
programa que los gener ha terminado su ejecucin. Los archivos se guardan en
dispositivos de almacenamiento secundario (discos cintas magnticas).

El uso de archivos es una de las capacidades ms importantes que debe tener un


lenguaje para apoyar aplicaciones comerciales que suelen manejar grandes cantidades
de datos y que requieren que dichos datos sean persistentes.

En Java la entrada/salida (I/O) de datos se maneja a travs de streams.

Ing. Yuli Garcs Bolaos


SERVICIO NACIONAL DE APRENDIZAJE SENA 2014

La entrada y salida puede ser de archivos, y de teclado y pantalla. Se usan streams en


ambos casos.

Un stream es un objeto que puede:

Tomar datos de una fuente (archivo o teclado) y llevarlos a un programa.


Tomar datos del programa y entregarlos a un destino (archivo o pantalla)

Ya se mencion que para leer/escribir de consola y de archivos se usan streams.


Para declarar la variable, crear el objeto y abrir el archivo utilizamos:

BufferedReader fileIn = new BufferedReader(new FileReader(nomArch));


PrintWriter fileOut = new PrintWriter(new FileWriter(nomArch));
PrintWriter fileApnd = new PrintWriter(new FileWriter(nomArch, true));

Nota que en un solo paso ests haciendo las 3 acciones mencionadas.


Observa tambin que los objetos que ests creando son exactamente de las mismas
clases que los que usamos para leer/escribir de consola. Dado que para escribir en el
archivo se utiliza la clase PrintWriter, se escribe en el archivo de la misma forma que
se hace a pantalla:
fileOut.println(unString);
fileOut.print(unString);
fileOut.flush();

Estas funciones trabajan de la forma que ya conocemos.

Dado que para leer del archivo se utiliza la clase BufferedReader, se lee del archivo de
la misma forma que se hace del teclado:

fileIn.readLine();
readLine() lee una lnea del stream de entrada y regresa esa lnea.

A continuacin encontrars un ejemplo que te muestra cmo crear un archivo de texto


a partir de la consola:

Ing. Yuli Garcs Bolaos


SERVICIO NACIONAL DE APRENDIZAJE SENA 2014

La ejecucin de esta aplicacin pudiera ser:

El archivo generado se vera as:

Ya que fue generado con extensin txt se abre desde el NotePad.

Una manera de leer el archivo es tomando el BufferedReader con un objeto de


FileReader y entonces pasarle como parmetro el nombre del archivo, y en un ciclo
leer hasta que no encontremos ningn valor mas a leer, como el ejemplo:

Ing. Yuli Garcs Bolaos


SERVICIO NACIONAL DE APRENDIZAJE SENA 2014

El cual al ejecutar se vera as:

Ing. Yuli Garcs Bolaos

You might also like