Sie sind auf Seite 1von 6

Flujo de Entrada y Salida Archivos

Lenguaje de programacin
El sistema de ficheros y flujos a ficheros
Un caso particular de fuente y sumidero de datos son los ficheros. Desde nuestros programas
podemos leer los datos contenidos en un fichero, sean estos datos de tipo binarios o caracteres, y
podemos escribir datos a un fichero, sea estos datos de tipo binarios o caracteres.
Como el acceso para realizar entrada/salida es independiente del dispositivo, lo que necesitaremos
en este caso es algn medio para acceder al sistema de ficheros. Para ello Java nos proporciona la
clase File. Esta clase nos da acceso al sistema de ficheros y sobre esta clase podemos construirflujos
de entrada/salida para tipos de datos tanto binarios como caracteres.
El sistema de ficheros
La clase File nos da acceso al sistema de ficheros, con independencia del sistema operativo sobre el
que se ejecute. Gracias a esta clase, podemos obtener informacin tal como la lista de ficheros o
directorios bajo un directorio dado, o comprobar si el camino con el que se construye la instancia
de File hace referencia a un fichero o a un directorio.
Flujos a ficheros
Los flujos a ficheros nos permiten acceder a la informacin contenida en los ficheros de nuestro
sistema con el fin de leer desde ellos o escribir informacin hacia ellos. De nuevo, podemos
distinguir dos tipos de flujos a ficheros dependiendo de si la informacin contenida en ellos es de
tipo binario o caracteres.
Flujos de bytes a ficheros
La clase FileInputStream nos permite crear un flujo de lectura hacia un fichero para leer desde l
datos de tipo binario. Podemos instanciar esta clase a partir de una referencia a File o bien a partir
de un String que represente el camino hasta el fichero.
De modo anlogo, la clase FileOutputStream nos permite crear un flujo de escritura hacia unfichero
para escribir en l datos de tipo binario. Podemos instanciar esta clase tambin a partir de una
referencia a File o bien a partir de un String que represente el camino hasta el fichero. En el
momento de la creacin del flujo podemos indicar si queremos conservar el posible contenido del
fichero en el momento de la creacin del flujo a travs de un argumento de tipo booleano en el
constructor.
Flujos de caracteres a ficheros
La clase FileReader nos permite crear un flujo de lectura hacia un fichero, para leer desde l datos
de tipo carcter. De modo anlogo al caso de FileInputStream, podemos instanciar esta clase a
partir de una referencia a File o bien a partir de un String que represente el camino hasta el fichero.
Finalmente, la clase FileWriter nos permite crear un flujo de escritura de caracteres hacia unfichero
para escribir en l datos de tipo carcter. De modo anlogo a la clase FileOutputStream, podemos
instanciar esta clase a partir de una referencia File, de un String que indique el camino al fichero, e
indicar en el momento de la creacin si el fichero conserva o no el posible contenido.

Como ejemplo del manejo de ficheros, a continuacin se muestra cmo abrir un flujo a un fichero
de caracteres para leer desde l lnea a lnea su contenido y mostrarlo por consola.

Como curiosidad fjate que hay un bloque try{...} finally{...} en las lneas 17-27 que est incluido
dentro de otro bloque try{...}. El uso de estos bucles anidados facilita la lectura de cdigo, y su
ejecucin es la siguiente: si se produce alguna excepcin durante el trabajo con el fichero (lneasde
cdigo 18-23), se ejecutar el bloque finally{...} con lo que se cerrara el fichero, y la excepcin se
propagara al bloque try{...} externo, que es quien tiene los bloques catch{...} para atrapar a cada
una de las excepciones posibles. Este modo de codificacin es ampliamente utilizadoyconviene que
lo incorpores como tcnica de escritura de tu propio cdigo.
Mtodos de la clase File
MTODO
boolean canRead()
boolean canWrite()

DESCRIPCIN
Devuelve true si se puede leer el fichero
Devuelve true si se puede escribir en el fichero

boolean createNewFile()

boolean delete()
boolean exists()
String getName()
String getAbsolutePath()
String getCanonicalPath()

String getPath()
String getParent()
File getParentFile()
boolean isAbsolute()
boolean isDirectory()
boolean isFile()
long lastModified()

long length()

String[] list()

String[] list(FilenameFilter filtro)

boolean mkdir()
boolean mkdirs()

boolean renameTo(File dest)

CREACIN DE FILTROS

Crea el fichero asociado al objeto File. Devuelve true si se


ha podido crear. Para poder crearlo el fichero no debe
existir. Lanza una excepcin del tipo IOException.
Elimina el fichero o directorio. Si es un directorio debe
estar vaco. Devuelve true si se ha podido eliminar.
Devuelve true si el fichero o directorio existe
Devuelve el nombre del fichero o directorio
Devuelve la ruta absoluta asociada al objeto File.
Devuelve la ruta nica absoluta asociada al objeto File.
Puede haber varias rutas absolutas asociadas a un File pero
solo una nica ruta cannica. Lanza una excepcin del tipo
IOException.
Devuelve la ruta con la que se cre el objeto File. Puede
ser relativa o no.
Devuelve un String conteniendo el directorio padre del File.
Devuelve null si no tiene directorio padre.
Devuelve un objeto File conteniendo el directoriopadre del
File. Devuelve null si no tiene directorio padre.
Devuelve true si es una ruta absoluta
Devuelve true si es un directorio vlido
Devuelve true si es un fichero vlido
Devuelve un valor en milisegundos que representa la
ltima vez que se ha modificado (medido desde las
00:00:00 GMT, del 1 de Enero de 1970). Devuelve 0 si el
fichero no existe o ha ocurrido un error.
Devuelve el tamao en bytes del fichero. Devuelve 0 si no
existe. Devuelve un valor indeterminado si es un
directorio.
Devuelve un array de String con el nombre de los archivos
y directorios que contiene el directorio indicado en el
objeto File. Si no es un directorio devuelve null . Si el
directorio est vaco devuelve un array vaco.
Similar al anterior. Devuelve un array de String con el
nombre de los archivos y directorios que contiene el
directorio indicado en el objeto File que cumplen con el
filtro indicado.
Crea el directorio. Devuelve true si se ha podido crear.
Crea el directorio incluyendo los directorios no existentes
especificados en la ruta padre del directorio a crear.
Devuelve true si se ha creado el directorio y los directorios
no existentes de la ruta padre.
Cambia el nombre del fichero por el indicado en el
parmetro dest. Devuelve true si se ha realizado el cambio.

Un filtro sirve para que el mtodo list devuelva solo aquellos archivos o carpetas que cumplan una
determinada condicin. (que tengan una extensin determinada, contengan en su nombre una
cadena determinada, empiecen por..., etc). Un filtro es un objeto de una clase que implementa el
interface FilenameFilter. FilenameFilter tiene un solo mtodo llamado accept que devuelve unvalor
de tipo boolean:
public interface FilenNameFilter{
boolean accept (File ruta, String nombre);
}
El mtodo recibe el directorio donde se encuentra el archivo (objeto File) y el nombre del archivo
(String). Este mtodo lo utiliza el mtodo list de File para decidir si un archivo o directorio
determinado se incluye o no en el array que devuelve. Si accept devuelve true se incluye y si
devuelve false no se incluye.
El mtodo list llama de form automtica al mtodo accept para cada uno de los archivos o
directorios.
CREAR Y ESCRIBIR EN FICHEROS DE TEXTO EN JAVA
Para escribir en un fichero de texto utilizaremos dos clase s: FileWriter y PrintWriter.
La clase FileWriter permite tener acceso al fichero en modo escritura. Para crear objetos FileWriter
podemos utilizar los constructores:
FileWriter(String path)
FileWriter(File objetoFile);
El fichero se crea y si ya existe su contenido se pierde. Si lo que necesitamos es abrir un fichero de
texto existente sin perder su contenido y aadir ms contenido al final utilizaremos los
constructores:
FileWriter(String path, boolean append)
FileWriter(File objetoFile, boolean append)
Si el parmetro append es true significa que los datos se van a aadir a los existentes. Si es false los
datos existentes se pierden.
La clase FileWriter proporciona el mtodo write() para escribir cadenas de caracteres aunque lo
normal es utilizar esta clase junto con la clase PrintWriter para facilitar la escritura.
La clase PrintWriter permite escribir caracteres en el fichero de la misma forma que en la pantalla.
Un objeto PrintWriter se crea a partir de un objeto FileWriter.
Ejemplo:
FileWriter fw = new FileWriter("c:/ficheros/datos.txt");
PrintWriter salida = new PrintWriter(fw);
A partir de Java 5 se puede crear un objeto PrintWriter directamente a partir de un objeto File o de
la ruta:
PrintWriter salida = new PrintWriter("c:/ficheros/datos.txt");

En este caso, si el fichero no existe se crea. Si no se puede crear un archivo con ese nombre o si
ocurre algn error se lanza una excepcin FileNotFoundException.
Una vez creado el objeto podemos utilizar print(), println() y printf() para escribir en el ficherocomo
si fuese en pantalla.
LECTURA DE FICHEROS DE TEXTO EN JAVA
Para leer en un fichero de texto utilizaremos dos clases: FileReader y BufferedReader.
La clase FileReader permite tener acceso al fichero en modo lectura. Para crear objetos Fi leReader
podemos utilizar los constructores:
FileReader(String ruta)
FileReader(File objetoFile);
Ambos lanzan una excepcin FileNotFoundException si el fichero no existe. La clase FileReader
proporciona el mtodo read() para leer caracteres del fichero aunque lo normal es realizar lalectura
mediante la clase BufferedReader.
Para leer utilizando la clase BufferedReader se debe crear un objeto BufferedReader a partir de un
objeto FileReader:
Ejemplo:
FileReader fr = new FileReader("c:/ficheros/datos.txt");
BufferedReader entrada = new BufferedReader (fr);
Una vez creado el objeto BufferedReader podemos utilizar:
El mtodo readLine() para leer lneas de texto del fichero (String). Este mtodo devuelve
null cuando no hay ms lneas para leer.
El mtodo read() para leer carcter a carcter. Devuelve un entero que representa el cdigo
Unicode del carcter ledo. Devuelve -1 si no hay ms caracteres.
Ambos mtodos lanzan una excepcin IOException si ocurre un error de lectura.
El fichero se debe cerrar cuando ya no se use, mediante el mtodo close(). Este mtodo lanza una
excepcin IOException.
LECTURA DE FICHEROS DE TEXTO CON SCANNER
A partir de Java 5 se puede leer un fichero de texto utilizando la clase Scanner igual que si leyramos
por teclado. Para ello se le pasa al constructor de Scanner el objeto File asociado al fichero. Esta
operacin lanza una excepcin FileNotFoundException.
Ficheros Binarios en Java
Un fichero binario o de datos est formado por secuencias de bytes. Estos archivos puedencontener
datos de tipo bsico (int, float, char, etc) y objetos.
Para poder leer el contenido de un fichero binario debemos conocer la estructura interna del
fichero, es decir, debemos saber cmo se han escrito: si hay enteros, long, etc. y en qu ordenestn
escritos en el fichero. Si no se conoce su estructura podemos leerlo byte a byte

ESCRIBIR DATOS EN FICHEROS BINARIOS


Para escribir datos en un fichero binario utilizaremos las clases Java FileOutputStream y
DataOutputStream derivadas de OutputStream.
FileOutputStream
La clase FileOutputStream permite tener acceso al fichero para escribir bytes. Para crear objetos
FileOutputStream podemos utilizar los constructores:
FileOutputStream
FileOutputStream
FileOutputStream
FileOutputStream

(String ruta)
(File objetoFile);
(String ruta, boolean append)
(File objetoFile, boolean append)

Si el parmetro append es true significa que los datos se van a aadir a los existentes. Si es false los
datos existentes se pierden. Si se utiliza uno de los dos primeros constructores los datos existentes
se pierden.
Los constructores lanzan una excepcin FileNotFoundException si no existe y no se ha podido crear
el fichero.
La clase FileOutputStream proporciona el mtodo write() para escribir bytes en el fichero. Este
mtodo lanza una IOException.
DataOutputStream
A partir de un objeto FileOutputStream se puede crear un objeto DataOutputStream, que
proporciona mtodos para escribir datos de tipo primitivo en el fichero. Para crear un objeto
DataOutputStream se utiliza el constructor:
DataOutputStream(OutputStream nombre);
La clase proporciona mtodos writeXxx() donde Xxx es el nombre del tipo primitivo. Lanzan una
IOException