Está en la página 1de 8

TEMA 10: TRABAJAR CON FICHEROS I.

FLUJOS, FILTROS Y CLASE FILE.

Desde el punto de vista informtico, un fichero o archivo es una coleccin de informacin que
almacenamos en un soporte magntico para poderla manipular en cualquier momento. Esta
informacin se almacena como un conjunto de registros, conteniendo todos ellos,
generalmente, los mismos campos. Cada campo almacena un dato de un tipo predefinido o de
un tipo definido por el usuario. El registro ms simple estara formado por un carcter.

Para dar soporte al trabajo con ficheros, la biblioteca de Java proporciona varias clases de
entrada/salida (E/S) que permite leer y escribir datos a, y desde, ficheros y dispositivos.

VISIN GENERAL DE LOS FLUJOS DE E/S.

Sabemos que la comunicacin entre un programa y el origen o el destino de cierta


informacin, se realiza mediante un flujo de informacin (en ingls stream) que no es ms que
un objeto que hace de intermediario entre el programa, y el origen o el destino de la
informacin. De esta forma, el programa leer o escribir en el flujo sin importarle desde
dnde viene la informacin o a dnde va.

El programa lee datos


PROGRAMA FICHERO
Flujo de entrada

Flujo de salida
PROGRAMA  FICHERO
El programa escribe datos

Este nivel de abstraccin hace que un programa no tenga que saber nada del dispositivo, lo
que se traduce en una facilidad ms a la hora de escribir programas, ya que los algoritmos para
leer y escribir datos sern siempre ms o menos los mismos:

Leer Escribir
Abrir un flujo desde un fichero. Abrir un flujo hacia un fichero
Mientras haya informacin Mientras haya informacin
Leer informacin Escribir informacin
Cerrar el flujo Cerrar el flujo

El paquete java.io de la biblioteca estndar de Java, contiene una coleccin de clases que
soportan estos algoritmos para leer y escribir. Por ejemplo, las clases FileOutputStream y
FileInputStream permiten escribir o leer datos de un fichero byte a byte, anlogamente, las
clases FileWriter y FileReader subclases de Reader permiten escribir o leer caracteres (char);
y las clases DataInputStream y DataOutputStream permiten leer y escribir datos de cualquier
tipo primitivo y cadenas de caracteres.

ABRIENDO FICHEROS PARA ACCESO SECUENCIAL.

EL tipo de acceso ms simple a un fichero de datos es el secuencial. Un ficheroabierto para


acceso secuencial es un fichero que puede almacenar registros de cualquier longitud, incluso
de un solo byte. Cuando la informacin se escribe registro a registro, stos son colocados uno
a continuacin de otro, y cunado se lee, se empieza por el primer registro y se contina al
siguiente hasta alcanzar el final.

Este tipo de acceso generalmente se utiliza con ficheros de texto en los que se escribe toda la
informacin desde el principio hasta el final y se lee de la misma forma. En cambio, los
ficheros de texto no son los ms apropiados para almacenar grandes series de nmeros, porque
cada nmero es almacenado como una secuencia de bytes; esto significa que un nmero
entero de nueve dgitos ocupa nueve bytes en lugar de los cuatro requeridos para un entero. De
ah que a continuacin se expongan distintos tipos de flujos: de bytes y de caracteres para el
tratamiento de texto, y de datos para el tratamiento de nmeros.

Flujos de bytes.

Los datos pueden ser escritos o ledos de un fichero byte a byte utiliznado flujos de las clases
FileOutputStream y FileInputStream.

FileOutputStream

Este flujo nos permite escribir bytes en un fichero. Adems de los mtodos que esta clase
hereda de OutputStream, la clase proporciona los constructores siguientes:

FileOutputStream (String nombre)


FileOutputStream (String nombre, bolean aadir)
FileOutputStream (File fichero)

El primer constructor abre un flujo de salida hacia el fichero especificado por nombre.
El segundo hace lo mismo, pero con la posibilidad de aadir datos a un fichero existente
(aadir = true).
El tercero lo hace a partir de un objeto File.

Ejemplo: Lee una lnea de texto desde el teclado y la guarda en un fichero denominado
texto.txt.

import java.io.*; //Libreras de Entrada/Salida

public class CEscribirBytes


{
public static void main (String[] args)
{
FileOutputStream fs = null;
byte[] buffer = new byte[81]; //Define una matriz buffer de 81 bytes.
int nbytes;

try
{
System.out.println(
"Escriba el texto que desea almacenar en el fichero:");

nbytes = System.in.read (buffer);


//Lee una lnea de texto desde el teclado de longitud nbytes (nbytes < 81)
//y la almacena en buffer (read tambin admite como argumento una matriz de bytes)

fs = new FileOutputStream ("texto.txt");


//Define un flujo fs hacia un fichero denominado texto.
//Tenga presente que si el fichero existe, se borrar en el momento de definir el
//flujo que permite su acceso, excepto si especifica como segunda parmetro true.

fs.write(buffer, 0, nbyte);
//Escribe explcitamente la lnea de texto en el flujo (implcitamente la escribe
//en el fichero). Esto se hace cunado el flujo recibe el mensaje write, lo que
//origina que se ejecute el mtodo write, en este caso con tres parmetros: el primero
//es una referencia a la matriz que contiene los bytes que deseamos escribir, el
//segundo es la posicin en la matriz del primer byte que se desea escribir y el
//tercero, el nmero de bytes a escribir.
}
catch(IOException e)
{
System.out.println ("Error: " + e.toString());
}
}
}

Si lo que desea es aadir informacin al fichero, cree el flujo hacia el mismo como se indica a
continuacin:

Fs = new FileOutputStream (texto.txt, true);

En este caso, si el fichero no existe se crea y si existe, los datos que se escriban en l se
AADIRAN AL FINAL.

ES UNA BUENA COSTUMBRE CERRAR UN FLUJO cuando ya no se vaya a utilizar


ms, para lo cual se invocar a su mtodo close. En la biblioteca de Java puede observar que
el mtodo close de FileOutputStream declara que puede lanzar una excepcin de la clase
IOException, razn por la que nuestro cdigo debe atraparla.

En los casos en los que sea necesario realizar alguna accin antes de salir de un mtodo (por
ejemplo cerrar un fichero) ponga el cdigo adecuado dentro de un bloque finally colocado a
continuacin de un bloque try o de un bloque match.
El bloque finally debe ser siempre el ltimo.

Aplicando lo expuesto a la aplicacin anterior, el cdigo quedara as:

finally
{
try
{
//Cerrar el fichero
if (fs != null)
{
fs.close();
}
}
catch (IOException e)
{
System.out.println ("Error: " + e.toString());
}
}
La ejecucin del bloque finally queda garantizada independientemente de que finalice o no la
ejecucin del bloque try. Quiere esto decir que aunque se abandone la ejecucin del bloque
try porque, por ejemplo, se ejecute una sentencia return, el bloque finally se ejecuta.

FileInputStream

Un flujo de la clase FileInputStream permite leer bytes desde un fichero. Adems de los
mtodos que esta clase hereda de InputStream, la clase proporciona los siguientes
constructores:

FileInputStream (String nombre)


FileInputStream (File fichero)

El primero constructor abre un flujo de entrada desde el fichero especificado por nombre,
mientras que el segundo lo hace a partir de un objeto File.

En el siguiente ejemplo veremos como se usa:

import java.io.*; //Libreras de Entrada/Salida

public class CLeerBytes


{
public static void main (String[] args)
{
FileInputStream fe = null;
byte[] buffer = new byte[81]; //Define una matriz buffer de 81 bytes.
int nbytes;

try
{
fe = new FileInputStream ("texto.txt");
//Define un flujo fe desde un fichero denominado texto.txt. Tenga
//presente que si el fichero no existe, se lanzar un excepcin.

nbytes = fe.read(buffer, 0 , 81);


//Lee el texto y lo almacena en el buffer. Los tres parametros del
//parntesis indican el primero una referencia a la matriz que
//almacenar los bytes ledos, el segundo es la posicin en la matriz
//del primer byte que desea almacenar y el tercero, el nmero mximo
//de bytes que se leern. El mtodo devuelve el nmero de bytes ledos
//o -1 si no hay ms tados porque se ha alcanzado el EOF (End Of File).

String str = new String (buffer, 0 ,nbytes);


//Crea un objeto string con los datos ledos.

System.out.println(str);
//Impresion del objeto String

}
catch(IOException e) //Captura de excepcion
{
System.out.println ("Error: " + e.toString());
}
finally
{
try
{
//Cerrar el fichero
if (fe != null)
{
fe.close();
}
}
catch(IOException e)
{
System.out.println ("Error: " + e.toString());
}
}
}
}

CLASE FILE

El ejemplo anterior utiliza un String para referirse al fichero, pero tambin podra haber
utilizado un objeto de la clase File. Un objeto de esta clase representa el nombre de un fichero
o de un directorio que puede existir en el sistema de ficheros de la mquina; por lo tanto, sus
mtodos permitirn interrogar al sistema sobre todas las caractersticas de ese fichero o
directorio. Adems de los mtodos a los que nos referimos, la clase proporciona el constructor
siguiente:

Public File(String ruta_completa)

Este constructor crea un objeto File, ejemplos:

File fichero = new File ("protecto\\texto.txt");


//Crea un objeto File a partir de la ruta relativa proyecto/texto.txt. Observe que
//el separador de directorios viene especificado por la secuencia de escape '\\'.
//Este separador en un sistema UNIX es '/'.

System.out.println ("Nombre del fichero: " + fichero.getName());


System.out.println ("Directorio padre: " + fichero.getParent());
System.out.println ("Ruta relativa: " + fichero.getPath());
System.out.println ("Ruta absoluta: " + fichero.getAbsolutePatth());

Mtodo Significado
GetName Devuelve el nombre del fichero
getParent Devuelve el directorio padre
getPath Devuelve la ruta relativa del fichero
getAbsolutePath Devuelve la ruta absoluta del fichero
exists Devuelve True si el fichero existe
canWriter Devuelve true si se puede escribir en el fichero o directorio especificado
CanRead Devuelve true si se puede leer desde el fichero o directorio especificado
isFile Devuelve true si se trata de un fichero vlido
IsDirectory Devuelve true si se trata de un directorio vlido
isHidden Devuelve true si se trata de un fichero o directorio oculto
Length Devuelve el tamao en bytes del fichero, cuando se trata de un directorio
el valor es 0
list Devuelve una matriz de objetos String que almacena que almacena los
nombres de los ficheros y directorios que hay en el directorio especificado
por el objeto File.
mkdir Crea el directorio especificado por el objeto File
mkdirs Crea el directorio especificado por el objeto File incluyendo los directorio
que no existan en la ruta especificada
delete Borra el fichero o directorio especificado por el objeto File. Cuando se
trate de un directorio, ste debe de estar vaco.
DeleteOnExit Igual que delete, pero cuando la mquina virtual termina
CreateTemFile Crea el fichero vaco especificado por los argumentos pasados, en el
directorio
renameTo Renombra el fichero especificado por el objeto File que recibe este
mensaje, con el nombre especificado por el objeto File pasado como
argumento
setReadOnly Marcar el fichero o directorio especificado por el objeto File de slo
lectura.
toString Devuelve la ruta especificada cuando se cre el objeto File

Flujos de datos primitivos.

Muchas aplicaciones requieren escribir en un fichero datos de tipos primitivos (bolean, byte,
double, float, long, int y short) para posteriormente recuperarlos como tal. Para estos casos, el
paquete java.io proporciona las clases:

DataInputStream
DataOutputStream

Las cuales nos permiten leer y escribir, respectivamente, datos de cualquier tipo primitivo.
Estos flujo actan como filtros; estos es, los datos obtenidos del origen o enviados al destino
son transformados mediante alguna operacin. El procedimiento para utilizar un filtro, es
bsicamente as:

- Se crea un flujo asociado con un origen o destino de los datos.


- Se asocia un filtro con el flujo anterior.
- Finalmente, el programa leer o escribir datos a travs de ese filtro.

DataOutputStream

Definicin de un filtro:

FileOutputStream fos = new FileOutputStream("datos.dat");


DataOutputStream dos = new DataOutputStream (fos);

Un programa que quiera almacenar datos en el fichero datos.dat, escribir tales datos en el
filtro dos, que a su vez est conectado al flujo fos abierto hacia ese fichero. Es decir:

PROGRAMA  DOS  FOS  FICHERO


El siguiente fragmento de cdigo muestra cmo utilizar el filtro anterior para que almacenar
los datos nombre, direccin y telfono en un fichero especificado por nombreFichero:

FileOutputStream fos = new FileOutputStream (nombreFichero);


DataOutputStream dos = new DataOupputStream (fos);

//Almacenar el nombre la direccin y el telfono en el fichero


//Usando mtodos del filtro
dos.writeUTF ("un nombre");
dos.writeUTF ("una direccin");
dos.writeLong (942334455);

dos.close(); fos.close(); //Los filtros tambin se cierran como los flujos

Mtodo Descripcin
writeBoolen Escribe un valor de tipo bolean.
writeByte Escribe un valor de tipo byte.
writeBytes Escribe un String como una secuencia de bytes
writeChar Escribe un valor de tipo char
writeChars Escribe un String como una secuencia de caracteres.
writeShort Escribe un valor de tipo short.
writeInt Escribe un valor de tipo int.
writeLong Escribe un valor de tipo long.
writeFloat Escribe un valor de tipo float.
writeDouble Escribe un valr tipo double
writeUFT Escribe una cadena de caracteres en formato UTF-8; los dos primeros bytes
especifican el nmero de bytes de datos escritos a continuacin

DataInputStream

Un flujo de la clase DataInputStream, derivada indirectamente de InputStream, permite a


una aplicacin leer de un flujo de entrada subordinado, datos de cualquier tipo primitivo
escritos por un flujo de la clase DataOutputStream.

Un programa que quiera leer datos del fichero datos.dat, leer tales datos del filtro dis, que a
su vez est conectado a flujo fis abierto desde ese fichero. La figura siguiente muestra de
forma grfica lo expuesto:

Programa  dis  fis  Fichero

El siguiente fragmento de cdigo muestra cmo utilizar el filtro anterior para leer datos
nombre, direccin y telfono desde un fichero especificada por nombreFichero:

FileInputStream fis = new FileInputStream (nombreFichero);


DataInputStream dis = new DataInputStream (fis);
//Lee el nombre, la direccin y el telfono del fichero
nombre=dis.readUTF();
direccin = dis.readUTF();
telfono = dis.readLong();

dis.close();fis.close();
Los mtodos ms utilizados de esta clase son:

Mtodo Descripcin
readBoolean Devuelve un valor de tipo bolean
readByte Devuelve un valor de tipo byte
readShort Devuelve un valor de tipo short
readChar Devuelve un valor de tipo char
readInt Devuelve un valor de tipo int
ReadLong Devuelve el valor tipo Long
readFloat Devuelve un valor tipo float
readDouble Devuelve un valor tipo double.
ReadUTF Devuelve una cadena de caracteres en formato UTF-8; los dos primeros bytes
especifican el nmero de bytes de datos que sern ledos a continuacin.

También podría gustarte