Flujo de Entrada y Salida – Archivos

Lenguaje de programación
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 algún 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 información 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 información contenida en los ficheros de nuestro
sistema con el fin de leer desde ellos o escribir información hacia ellos. De nuevo, podemos
distinguir dos tipos de flujos a ficheros dependiendo de si la información 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 análogo, la clase FileOutputStream nos permite crear un flujo de escritura hacia unfichero
para escribir en él datos de tipo binario. Podemos instanciar esta clase también 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 creación del flujo podemos indicar si queremos conservar el posible contenido del
fichero en el momento de la creación del flujo a través 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 carácter. De modo análogo 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 carácter. De modo análogo 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 creación si el fichero conserva o no el posible contenido.

. a continuación se muestra cómo abrir un flujo a un fichero de caracteres para leer desde él línea a línea su contenido y mostrarlo por consola.Como ejemplo del manejo de ficheros..} en las líneas 17-27 que está incluido dentro de otro bloque try{.. Como curiosidad fíjate que hay un bloque try{..}.. Este modo de codificación es ampliamente utilizadoyconviene que lo incorpores como técnica de escritura de tu propio código..} externo.} finally{. y la excepción se propagaría al bloque try{. que es quien tiene los bloques catch{. Métodos de la clase File MÉTODO boolean canRead() boolean canWrite() DESCRIPCIÓN Devuelve true si se puede leer el fichero Devuelve true si se puede escribir en el fichero .. se ejecutará el bloque finally{.. y su ejecución es la siguiente: si se produce alguna excepción durante el trabajo con el fichero (líneasde código 18-23).. El uso de estos bucles anidados facilita la lectura de código.} para atrapar a cada una de las excepciones posibles...} con lo que se cerraría el fichero..

Devuelve 0 si el fichero no existe o ha ocurrido un error. Crea el directorio. Devuelve true si se ha podido crear. Similar al anterior. Devuelve true si se ha podido crear. . Devuelve la ruta con la que se creó el objeto File. Devuelve un String conteniendo el directorio padre del File. Devuelve la ruta única absoluta asociada al objeto File. Devuelve true si es una ruta absoluta Devuelve true si es un directorio válido Devuelve true si es un fichero válido Devuelve un valor en milisegundos que representa la última vez que se ha modificado (medido desde las 00:00:00 GMT. Cambia el nombre del fichero por el indicado en el parámetro dest. Devuelve un objeto File conteniendo el directoriopadre del File. Devuelve un valor indeterminado si es un directorio. Devuelve null si no tiene directorio padre.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) CREACIÓN DE FILTROS Crea el fichero asociado al objeto File. Si es un directorio debe estar vacío. Lanza una excepción del tipo IOException. Para poder crearlo el fichero no debe existir. Si el directorio está vacío devuelve un array vacío. Devuelve true si el fichero o directorio existe Devuelve el nombre del fichero o directorio Devuelve la ruta absoluta asociada al objeto File. Devuelve el tamaño en bytes del fichero. Lanza una excepción del tipo IOException. del 1 de Enero de 1970). Devuelve true si se ha realizado el cambio. Crea el directorio incluyendo los directorios no existentes especificados en la ruta padre del directorio a crear. Elimina el fichero o directorio. Devuelve 0 si no existe. Puede haber varias rutas absolutas asociadas a un File pero solo una única ruta canónica. Si no es un directorio devuelve null . Devuelve un array de String con el nombre de los archivos y directorios que contiene el directorio indicado en el objeto File. Puede ser relativa o no. Devuelve null si no tiene directorio padre. Devuelve true si se ha creado el directorio y los directorios no existentes de la ruta padre. 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. Devuelve true si se ha podido eliminar.

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

Estos archivos puedencontener datos de tipo básico (int. La clase FileReader proporciona el método read() para leer caracteres del fichero aunque lo normal es realizar lalectura mediante la clase BufferedReader. si el fichero no existe se crea. Ambos lanzan una excepción FileNotFoundException si el fichero no existe. Para ello se le pasa al constructor de Scanner el objeto File asociado al fichero. La clase FileReader permite tener acceso al fichero en modo lectura. debemos saber cómo se han escrito: si hay enteros. Ambos métodos lanzan una excepción IOException si ocurre un error de lectura. y en qué ordenestán escritos en el fichero. LECTURA DE FICHEROS DE TEXTO EN JAVA Para leer en un fichero de texto utilizaremos dos clases: FileReader y BufferedReader. long. Devuelve un entero que representa el código Unicode del carácter leído. println() y printf() para escribir en el ficherocomo si fuese en pantalla. Este método lanza una excepción IOException. 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. Esta operación lanza una excepción FileNotFoundException. es decir.En este caso.txt"). BufferedReader entrada = new BufferedReader (fr). mediante el método close(). Ficheros Binarios en Java Un fichero binario o de datos está formado por secuencias de bytes. etc) y objetos. float.  El método read() para leer carácter a carácter. Para poder leer el contenido de un fichero binario debemos conocer la estructura interna del fichero. Una vez creado el objeto podemos utilizar print(). Este método devuelve null cuando no hay más líneas para leer. El fichero se debe cerrar cuando ya no se use. Si no se puede crear un archivo con ese nombre o si ocurre algún error se lanza una excepción FileNotFoundException. Para crear objetos Fi leReader podemos utilizar los constructores: FileReader(String ruta) FileReader(File objetoFile). etc. Si no se conoce su estructura podemos leerlo byte a byte . Una vez creado el objeto BufferedReader podemos utilizar:  El método readLine() para leer líneas de texto del fichero (String). Devuelve -1 si no hay más caracteres. 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 leyéramos por teclado. char.

Para crear objetos FileOutputStream podemos utilizar los constructores: FileOutputStream FileOutputStream FileOutputStream FileOutputStream (String ruta) (File objetoFile). Este método lanza una IOException. Si se utiliza uno de los dos primeros constructores los datos existentes se pierden. La clase proporciona métodos writeXxx() donde Xxx es el nombre del tipo primitivo. Los constructores lanzan una excepción FileNotFoundException si no existe y no se ha podido crear el fichero. Para crear un objeto DataOutputStream se utiliza el constructor: DataOutputStream(OutputStream nombre). FileOutputStream La clase FileOutputStream permite tener acceso al fichero para escribir bytes. (String ruta. boolean append) (File objetoFile. que proporciona métodos para escribir datos de tipo primitivo en el fichero. Lanzan una IOException .ESCRIBIR DATOS EN FICHEROS BINARIOS Para escribir datos en un fichero binario utilizaremos las clases Java FileOutputStream y DataOutputStream derivadas de OutputStream. DataOutputStream A partir de un objeto FileOutputStream se puede crear un objeto DataOutputStream. boolean append) Si el parámetro append es true significa que los datos se van a añadir a los existentes. La clase FileOutputStream proporciona el método write() para escribir bytes en el fichero. Si es false los datos existentes se pierden.