Tema Ficheros I
Tema Ficheros I
Tema Ficheros I
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.
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.
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:
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.
try
{
System.out.println(
"Escriba el texto que desea almacenar en el fichero:");
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:
En este caso, si el fichero no existe se crea y si existe, los datos que se escriban en l se
AADIRAN AL FINAL.
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.
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:
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.
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.
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:
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
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:
DataOutputStream
Definicin de un filtro:
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:
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 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:
El siguiente fragmento de cdigo muestra cmo utilizar el filtro anterior para leer datos
nombre, direccin y telfono desde un fichero especificada por nombreFichero:
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.