Sei sulla pagina 1di 10

6.

FLUJOS Y ARCHIVOS
6.1 DEFINICIÓN
En la mayoría de los programas que se implementan, en un momento u otro hay que interaccionar
con alguna fuente de datos, como un archivo del disco duro, un DVD, teclado o un dispositivo de red,
ya sea para guardar información o para recuperarla. Java implementa una serie de clases llamadas
flujos, encargadas de comunicarse con los dispositivos de almacenamiento. El funcionamiento de
estos flujos, desde el punto de vista del programador, no depende del tipo de dispositivo hardware
con el que está asociado, lo que nos liberará del trabajo que supone tener en cuenta las
características físicas de cada dispositivo.

6.2 CLASIFICACIÓN: ARCHIVOS DE TEXTO Y BINARIOS


Los archivos por su contenido podemos dividir en binarios y de texto.

Un archivo de texto es aquel que solo guarda cadena de caracteres, en cambio el contenido en un
archivo binario corresponde a la representación en bytes de diferentes tipos de datos. Entonces, en
archivos binarios se puede guardar, además de String, todo tipo de datos incluyendo objetos.

En Java se utiliza el flujo (stream) de datos. Hay dos flujos, el primero corresponde al de entrada
(input stream) donde los datos llegan del exterior por medio del teclado. En la salida (output
stream), la información se envía a la impresora, pantalla o archivos.

Para poder guardar o leer datos de archivos, es importante conocer la jerarquía de clases para el
flujo de datos que maneja el lenguaje Java. Existen dos jerarquías, una para los tipos de datos char
UNICODE de 16 bits y otra para bytes de 8 bits, éstas se muestran en las figuras 1 y 2. La figura 1
muestra las clases bases (Reader y Writer) para el flujo de caracteres en archivos de texto y la
figura 2 muestra la jerarquía que se utiliza para datos tipo byte en archivos binarios.

Figura 1. Jerarquía de las clases para flujo de caracteres en archivos texto.


Figura 2. Jerarquía de las clases para flujo de bytes en archivos binarios.

Estás jerarquías se encuentran en la carpeta de. io (java.io.*) de Java. Cuando se escriban


programas sobre archivos, se deben importar las clases que se usaran, escribiendo import
java.io.FileInputStream en el primer renglón del programa. Cuando se pone un asterisco en lugar
del nombre de la clase, indica que se importan todas las clases de la carpeta io.

Es importante conocer los métodos de cada una de las clases que aparecen en las figuras 1 y 2. La
forma de hacerlo es buscando la API de Java en internet.

Ejemplo de la clase FileWriter

Figura 3. Descripción de FileWriter.


Figura 4. Métodos constructores y ordinarios heredados de otras clases

Sí se observa detenidamente la figura 4, pueden conocer todos los constructores que pueden usarse,
los métodos que hereda de otras clases y otra información sobre la clase FileWriter. También se
puede o consultar las demás clases de la carpeta io de la misma manera.
6.3 OPERACIONES BÁSICAS Y TIPOS DE ACCESO
Crear.

Para crear físicamente un archivo de texto o binario, se crea un objeto File, FileWriter,
FileOutputStream, con la intención de escribir en el archivo, tal cómo se muestra a continuación.

File arch1 = new File (“archivo1.txt”); arch.createNewFile ();

FileWriter arch2 = new FileWriter (“archivo2.txt”);

FileOutputStream arch3 = new FileOutputStream (“archivo3.txt”);

Sí creamos objetos con la intención de leer datos de archivos, marcara error si no existen los archivos
archivo1.txt y archivo3.txt, ya que se pretende leer información de un archivo que debe existir.

FileReader arch1 = new FileReader (“Archivo1.txt”);

FileInputStream arch3 = new FileInputStream (“Archivo3.txt”);

Podemos concluir que solo se crean los archivos físicamente cuando se escribe en ellos y cuándo
se van a leer los archivos deben existir.

Ejercicio 1. Archivo1.java. Este programa nos muestra la creación de archivos físicos con la
utilización de varios objetos. Cuando se utiliza File se maneja el método createNewFile (), con
FileWriter y FileOutputStream se hace de forma directa con la ejecución de su constructor de la
clase cuando se crea el objeto.

Ejercicio 2. Archivo2.java. Muestra una clase CreaArchivo con un método estático crearArchivo
(), éste puede ser llamado desde otras clases utilizando el siguiente código
CreaArchivo.crearArchivo (). Este método es útil en la creación de archivos para escritura o lectura
de datos.

Este ejemplo puede ser útil cuando se pretenda crear un objeto para leer datos y el archivo no exista.

Abrir.

Abrir un archivo (texto o binario) para lectura escritura, se realiza creando el objeto, tal es el caso:

Para lectura

 FileReader arch1 = new FileReader (“archivo1.txt”);


 FileInputStream arch3 = new FileInputStream (“archivo3.txt”);

Para escritura

 FileWriter arch2 = new FileWriter (“archivo2.txt”);


 FileOutputStream arch4 = new FileOutputStream (“archivo4.txt”);

Se debe tener cuidado cuando se abren archivos para escritura ya que, si posteriormente se desea
seguir anexando datos, por lo tanto, se debe utilizar un parámetro con valor true, cuando se crea el
objeto.

 FileWriter arch2 = new FileWriter (“archivo2.txt”, true);


 FileOutputStream arch4 = new FileOutputStream (“archivo4.txt”, true);
Cerrar.

Para cerrar un archive de texto o binario se utiliza el método close (), éste aparece en todas las
clases que se muestran en las figuras 1 y 2, que manejan archivos. Existen diferentes maneras de
cerrar un archivo, a continuación, se presentan dos ejemplos.

Ejercicio 3. Archivo3.java. Muestra la primera forma de cerrar un archivo, considerando el uso


adecuado de las excepciones.

Ejercicio 4. Archivo4.java. Muestra la segunda forma de cerrar un archivo.

En los 2 ejemplos anteriores se utilizó close () de la clase FileReader, pero podemos utilizar el
método para cualquiera de las clases que se muestran en las figuras 1 y 2.

Lectura y escritura

Escritura en archivos de texto

Cuando guardamos información en un archivo de texto, podemos hacerlo de varias formas una de
ellas es, abriendo un block de notas y escribiendo en él la información, otra manera es a través de
un programa, el cual pregunte la información que se desea guardar en el archivo.

Para escribir cadenas de caracteres se utiliza la clase PrintWriter. La clase PrintWriter es subclase
de la clase Writer y FileWriter es derivada de OutputStreamWriter tal como se muestra en la figura
5.

Figura 5. Jerarquía de las clases PrintWriter y FileWriter

La clase PrintWriter tiene varios métodos para guardar datos tipo String en un archivo, pero los más
usados son el print y el println. Para conocer otros métodos y ampliar tus conocimientos, conviene
que revises más a fondo el API de Java para esta clase.

Ejercicio 5. Archivo5.java. En este programa se crea el objeto escribe para la clase PrintWriter,
utilizando el constructor que envía el objeto arch creado en FileWriter. El constructor que utiliza la
clase FileWriter, consiste en enviar como argumento el nombre del archivo (archivo5.txt) que será
utilizado.

Modificando el Archivo5.java: Sí se desea anexar más datos al final del archivo5.txt, se debe
ejecutar nuevamente Archivo5.java, anexando un segundo parámetro con el valor de true en el
consultor de FileWriter. //6 de mayo grupo 700
FileWriter arch = new (“archivo5.txt”, true);

Modifica el constructor de FileWriter colocando el segundo parámetro true y ejecuta varias veces
Archivos5.java. Revisa en el archivo5.txt los nuevos datos anexados.

Ejercicio 6. Archivo6.java. En este ejemplo se emplea el método print de PrintWriter, este método
escribe los datos en un buffer y hasta que se utiliza flush () se guardan en el archivo.

También podemos escribir cadenas de caracteres en archivos de texto utilizando BufferedWriter y


FileWriter. La figura 6 muestra la jerarquía de cada clase.

La clase BufferedWriter es subclase de la clase Writer y FileWriter es derivada de


OutputStreamWriter tal como se muestra en la figura 6. La clase BufferedWriter tiene un buffer
intermedio que al ingresar datos se guardan en el buffer hasta que este se llena y después se escribe
en disco, esto permite que se tengan menos accesos a disco logrando mayor rapidez de escritura.

Figura 6. Jerarquía de las clases BufferedWriter y FileWriter.//6 de mayo grupo701.

Ejercicio 7. Archivo7.java. Utiliza BufferedWriter y FileWriter para escribir datos en un archivo,


utiliza método newLine () para salto de línea, cada vez que escribe información.

Escritura en archivos binarios

Los archivos binarios son mejores en cuanto podemos escribir o leer diferentes tipos de datos, int,
double, float, String, boolean. También se manejan archivos de texto con su representación en el
código UTF-8.

La clase que se utilizan para escribir es DataOutputStream y su jerarquía de clases se presenta en


la figura 7.
Figura 7. Jerarquía de la clase DataOutputStream.

Los métodos que podemos utilizar para escribir diferentes tipos de datos son:

writeUTF (String s)

writeByte (byte b)

writeInt (int i)

writeLong (long l)

writeDouble (double d)

writeShort (short s)

writeBoolean (boolean)

Ejercicio 8. Archivo8.java. Este programa plantea dos formas de escribir cadenas en archivos
binarios, la primera escribiendo la longitud de la cadena con dato.writeInt(s.length()) e
inmediatamente después se escribe la cadena con dato.write.Chars(s); la segunda manera es
escribiendo directamente con dato.writeUTF(“cadena”).

Lectura de archivos de texto.

Para leer un archivo de texto, se abre el archivo con FileReader, pero esta clase no tiene métodos
que lean líneas de texto de un archivo, pero podemos utilizar readLine, de la clase BufferedReader.
Para ello se debe pasar como parámetro la creación del objeto arch de FileReader, cómo se muestra
en el siguiente código.

FileReader arch = new FileReader (“archivo9.txt”);

BufferedReader lee = new BufferedReader (arch);

Por lo tanto, podemos leer líneas de archivos de texto utilizando las clases BufferedReader y
FileReader. La figura 8, muestra la jerarquía de cada una de ellas.

La clase BufferedReader es subclase de la clase Reader y FileReader es derivada de


InputStreamReader tal como se muestra en la figura 8. La clase BufferedReader tiene un buffer
intermedio, que al leer del disco se guardan más datos de los solicitados en el buffer, y se mandan
visualizar los datos pedidos, esto disminuye los accesos a disco y el programa correrá más rápido,
esto se nota cuando la lectura sea de un archivo muy grande.
Figura 8. Jerarquía de clases BufferedReader y FileReader.

Ejercicio 9. Archivo9.java. Este programa realiza la lectura de datos, utilizando las clases
BufferedReader y FileReader.

Otra forma de leer archivos de texto es utilizar las clases StringBuffer y FileReader. La jerarquía
de clases se muestra en la figura 9. Aquí nos ayudamos de StringBuffer para crear el objeto cadena
en el archivo10.java, donde se anexan los caracteres al objeto cadena con el código
cadena.append((char)c).

Figura 9. Jerarquía de las clases StringBuffer y FileReader.

Ejercicio 10. Archivo10.java. Este programa lee archivos de texto. En la declaración de variables
se encuentran arch1 y arch2 que corresponden a los nombres de dos archivos. Sí se ejecuta
utilizando arch dos en el código inf = new FileReader(arch2), visualiza el código del programa
Caja.java, y si utiliza arch1, se despliega el archivo9.txt.

Los siguientes ejemplos utilizan la clase Scanner para leer archivos que contienen cadenas, a
continuación, se presenta la jerarquía de la clase figura 10.
Figura 10. Jerarquía de la clase Scanner.

Ejercicio 11. Archivo11.java.Utilizando la clase Scanner podemos leer líneas de caracteres de


archivos de texto. Este ejercicio muestra la forma de leer datos del archivo de texto datos.txt.

Ejercicio 12. Archivo12.java. Este programa contempla leer líneas de cadenas de archivos de texto,
utilizando un separador entre cada cadena. El archivo datos.txt. tiene guardada la información que
contiene nombre y dos apellidos separados por #. Cada línea debe tener tres cadenas separadas
por un símbolo de gato (#), porque en el programa se leen tres campos con
System.out.print(d.next()+" ");

Ernesto # Zapata # Bello

Margarita # Carrillo # Moreno

En este caso tenemos tres campos separados por el símbolo gato (#), entonces se usan las
expresiones regulares, teniendo el delimitador “\\s*#\\s*”, donde \\s* indica cero o más espacios en
blanco y el separador es el simbolo #.El código es d.useDelimiter("\\s*#\\s*");

Lectura de archivos binarios

Los archivos binarios pueden ser leídos utilizando los métodos de la clase DataInputStream. Estos
métodos corresponden a leer diferentes tipos de datos de un archivo binario.

Métodos de la clase DataInputString.

String readUTF ()

byte readByte ()

int readInt ()

long readLong ()

double readDouble()

short readShort()

boolean readBoolean()
Figura 11 Jerarquía de la clase DataInputStream.

Ejercicio 13. Archivo13.java. Este programa realiza la lectura del archivo binario Dataoutput.txt,
cuyos datos fueron escritos en el Archivo8.java. Es importante resaltar que una cadena fue
guardada carácter por carácter, ahora es leída en este programa, carácter por carácter de la
siguiente manera; primero se lee el valor de la longitud de la cadena que se guardó, se leen los
caracteres guardando cada uno en cada posición del vector buffer tipo Char, por último, se asigna
el vector buffer a la variable s tipo String. La cadena que fue escrita en el archivo binario con el
método writeUTF (String s), en este ejemplo es leída directamente con dato.readUTF().

Una nota importante del Archivo13.java, es leer los tipos de datos en la secuencia en que fueron
escritos en el Archivo8.java. Primero fue una cadena de caracteres, después un tipo double, luego
un entero y por último una cadena utilizando UTF.

Recorrer un archivo

Recorrer un archivo de texto o binario para escritura o lectura, puede hacer de manera secuencial o
directa.

La forma secuencial consiste en consultar uno a uno los datos de un archivo, desde el primero al
último. Y cuándo se realiza la escritura secuencial, siempre se van anexando los datos nuevos al
final. Esta forma de recorrido podemos revisar la en todos los ejemplos anteriores.

Ejercicio 14. Archivo14.java. Este programa realiza una lectura secuencial de datos tipo cadena.
Es importante que el archivo que se consulte exista y para ello se puede verificar si existe con el
código f.exists ().

6.4 MANEJO DE OBJETOS PERSISTENTES

Potrebbero piacerti anche