tema 10 - entrada y salida

Upload: anonymous-njrefqf

Post on 06-Jul-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/17/2019 Tema 10 - Entrada y Salida

    1/102

    ITSON Manuel Domitsu Kono 

    Tema 10

    Entrada y Salida 

    Sistema de Archivos

    Un sistema de archivos es un medio para organizar datos que se espera que perdurendespués de un programa termina su ejecución, proporcionando procedimientos paraalmacenar, recuperar y actualizar los datos, así como organizar el espacio disponibleen losdispositivos que los contienen. Un sistema de archivos organiza los datos en

    forma eficiente y está ajustado a las características específicas del dispositivo.Normalmente existe un fuerte acoplamiento entre el sistema operativo y el sistema dearchivos.

    Los sistemas de archivos se usan en dispositivos de almacenamiento de datos, comodiscos duros, flexibles, ópticos, memorias flash, para almacenar los archivos decomputadora.

     Aunque la vista de la estructura interna de un archivo como una secuencia de bytes,está relativamente estandarizada de un sistema operativo a otro, en lo que si difierenes en la metainformación asociada a ellos, como la fecha de creación del archivo, los

    permisos o el nombre del archivo. Esa metainformación se requiere en ciertasoperaciones que manipulan a los archivos independientemente de su contenido, comocrear, mover, renombrar, copiar o eliminar archivos.

    Java al ser un lenguaje multiplataforma, debe lidear con esa variabilidad en losmetadatos, creando un mecanismo que le oculte esas diferencias al programador.

    Nombres de Archivo

    Cada archivo tiene un nombre, su sintaxis depende del sistema operativo. En DOS elnombre de un archivo está formado por uno hasta 8 caracteres ASCII, seguido por una

    extensión de 0 a tres caracteres y separadas por un punto. Además no todos loscaracteres ASCII son válidos en el nombre de un archivo. En Win32 el nombre de unarchivo puede contener hasta 255 caracteres Unicode incluyendo la ruta. En Win32también hay algunos caracteres no permitidos. De la misma manera MacOS y Unixmanejan sus propias convenciones y restricciones para los nombres de archivo. Paratener mejores resultados en aplicaciones multiples plataformas considere lo siguiente alnombrar a los archivos:

  • 8/17/2019 Tema 10 - Entrada y Salida

    2/102

    282 Entrada / Salida

    ITSON Manuel Domitsu Kono

    •  Use solamente los caracteres ASCII imprimibles (Códigos ASCII 32 a 126),puntos y guiones bajo (_).

    •  Evite el uso de caracteres de puntuación en especial las diagonales (/) ydiagonales (invertidas).

    •  Nunca empiece un nombre de archivo con un punto, guiones (-) o el carácter

    (@).•  Evite el uso de caractere acentuados o extendidos.

    •  Use mayúsculas y minúsculas para facilitar la lectura. Aunque no asuma queexiste diferencias entre caracteres mayúsculos y minúsculos.

    •  Trate de mantener la longitud de los nombres de archivo a menos de 32caracteres.

    Extensiones de los Nombres de Archivo y Tipos de Archivo

    La extensión de los nombres de archivo por lo general indica el tipo de un archivo.“.java” denota un archivo texto que contiene código fuente Java. “.class” supone un

    archivo con código bytecode. “htm” o “html” denotan archivos que contienen códigoHTML. El problema es que las extensiones de archivo no garantizan el tipo decontenido. Un usuario puede cambiar la extención de un archivo o se pueden encontrararchivos de diferente contenido con la misma extensión.

    Directorios

    La mayoría de los sistemas operativos organizan a los archivos en una estructura jerárquica de directorios. Los directorios (llamados también carpetas) contienen cero,uno uno o más archivos o directorios. Los directorios también tienen nombres yatributos que dependiendo del sistema operativo pueden ser los mismos o no que losde los archivos.

    Rutas y Separadores

    Para especificar a un archivo completamente, no sólo se le da un nombre, también sedebe dar el directorio en el que se encuentra el archivo. El directorio mismo puedeencontrarse dentro de otro directorio, que a su vez puede estar dentro de otrodirectorio, hasta llegar a la raíz del sistema de archivos. La lista completa de losdirectorios a partir de la raíz hasta el archivo especificado, incluyendo el nombre delarchivo se conoce como la ruta absoluta del archivo. La sintaxis de la ruta absoluta

    varía de sistema operativo a sistema operativo. Algunos ejemplos son los siguientes:

    Sistema Operativo Ejemplo de una Ruta Absoluta

    DOS C: \ PUBLI C\ HTML\ J AVAFAQ\ I NDEX. HTMWin32 C: \ publ i c\ ht ml \ j avaf aq\ i ndex. ht mlLinux, Unix, Mac OS X / vol umes/ HD/ publ i c/ ht ml / j avaf aq/ i ndex. ht ml

  • 8/17/2019 Tema 10 - Entrada y Salida

    3/102

    Tema 10 Entrada / Salida 283

    ITSON Manuel Domitsu Kono 

    En los tres casos la ruta absoluta se refiere a un archivo llamado index.html en el discoduro primario, que se ecuentra en el directorio javafaq que a su vez está en eldirectorio html, que a su vez está en el directorio public. La diferencia obvia es elcarácter empleado como separador de nombres: ‘\’ para DOS y Win32 o ‘/’ paraLinux, Unix o Mac OS X.

    Rutas Absolutas y Relativas

    Hay dos formas de referenciar a un archivo, usando una ruta absoluta o una rutarelativa. Como ya se mencióno en la sección anterior, una ruta absoluta nos da elnombre completo del archivo, empezando por el nombre de la unidad de disco o raízdel sistema de archivos. En UNIX, todas los unidades de disco que se encuentranmontadas se combinan en un solo sistema de archivos virtual y su raíz es el directoriollamado ‘/’. Las rutas absolutas siempre empiezan con el directorio raíz ‘/’.

    En Windows y Mac OS 9, no hay un directorio raíz. Cada unidad de disco montado es

    un sistema de archivos separado e independiente. En Windows, a esas unidades dedisco se les asigna letras como nombre de la unidad: ‘A’ para el disco flexible, ‘B’ parael segundo disco flexible, ‘C’ para el disco de arranque primario, ‘D’, normalmente es eldisco óptico, pero puedo ser otro disco o partición. Las demás letras pueden usarsepara más discos, particiones o discos de red.

    Una ruta relativa no especifica la ruta completa a un archivo, en lugar de elloespecífica la ruta relativa al directorio de trabajo actual. Una ruta relativa puede apuntara un archivo dando sólo el nombre del archivo (si este se encuentra en el directorio detrabajo), otras veces puede apuntar a un archivo en un subdirectorio del directorio detrabajo dando el nombre del subdirectorio y el nombre del archivo o puede apuntar al

    padre del directorio de trabajo usando dos puntos (..).

    Los siguientes son algunos ejemplos de rutas relativas:

    Sistema Operativo Ejemplo de una Ruta AbsolutaDOS HTML\ J AVAFAQ\

    I NDEX. HTMWin32 ht ml \ j avaf aq\ i ndex. ht ml

    i ndex. ht mlLinux, Unix ht ml / j avaf aq/ i ndex. ht ml

    i ndex. ht ml

    Mac OS 9 : ht ml : j avaf aq: i ndex. ht mli ndex. ht ml

    Normalmente, una aplicación en ejecución identifica a un directorio como el directoriode trabajo actual, el directorio desde el que la aplicación fue arrancada. El directoriode trabajo queda fijo una vez que la aplicación arranca. Java no tiene forma decambiarlo.

  • 8/17/2019 Tema 10 - Entrada y Salida

    4/102

    284 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Clase File 

    Java trata de ocultarle al programador todas las diferencias entre los diferentessistemas de archivos de las diferentes plataformas que soporta Java, como losatributos de archivo y los separadores de nombre y de ruta. Para ello, utiliza unaabstración de los nombres de archivo y de ruta llamada ruta abstracta. Las instancias

    de la clase j ava. i o. Fi l e son rutas abstractas en el sistema local, no archivos. Elhecho de tener un objeto del tipo F i l e no significa que el archivo exista. La clase F i l e contiene métodos para obtener información acerca de los atributos de un archivo y paramanipularla.

    Una ruta abstracta tiene dos componentes:

    1. Un prefijo que es opcional y depende del sistema, como el nombre de la unidad

    de disco, “/ ” para el directorio raíz en UNIX o “\ \ \ \ ” para las rutas UNC de

    Microsoft Windows.2. Una secuencia de cero o más nombres.

    El primer nombre en una ruta abstracta puede ser un nombre de directorio o en el casode las las rutas UNC de Microsoft Windows, un nombre de un huésped. Cada uno delos nombres siguientes en una ruta abstracta es un directorio; el último nombre puedeser un directorio o un archivo. Un nombre abstracto vacío no tiene prefijo y susecuencia de nombres está vacía.

    La conversión entre una ruta y una ruta abstracta o viceversa es dependiente delsistema. Cuando una ruta abstracta se convierte a una ruta, cada nombre se separa del

    siguiente mediante una copia del carácter separador por omisión que está definido porla propiedad del sistema f i l e. separ at or  y esta disponible mediante los atributospúblicos estáticos separator  y separat orChar  de esta clase. caundo una ruta seconvierte a una ruta abstracta, los nombres pueden separarse por el carácterseparador por omisión o por cualquier otro carácter separador soportado por elsistema.

    Cada objeto de tipo F i l e contiene un campo de tipo String llamado pat h que contieneya sea un una ruta relativa o absoluta al archivo incluyendo el nombre del archivo odirectorio. Muchos de los métodos de esta clase trabajan solamente inspeccionandoesta cadena. No necesariamente inspeccionan alguna parte del sistema de archivos.

    En la figura 10.1 se muestra el diagrama de la clase F i l e y en las tablas 10.1 y 10.2los atributos y algunos de sus métodos.

  • 8/17/2019 Tema 10 - Entrada y Salida

    5/102

    Tema 10 Entrada / Salida 285

    ITSON Manuel Domitsu Kono 

    Figura 10.1 Diagrama de Clases de la Clase File.

    Tabla 10.1. Atributos de la Clase File publ i c st at i c f i nal St r i ng pathSeparator 

    El caracter separador de rutas, dependiente del sistema, representado como una cadena. La cadenacontiene un solo carácter, el caracter separador de rutas.publ i c stati c f i nal char pathSeparatorChar 

    El caracter separador de rutas, dependiente del sistema. Contiene el primer carácter de la propiedadpat hSeparat or . Este carácter se utiliza para separar las rutas en una secuencia de archivos dadacomo una lista de rutas. En los sitemas UNIX el carácter es ‘: ’ en Windows es ‘; ’,publ i c st at i c f i nal St r i ng separator 

    El caracter separador de nombres, dependiente del sistema, representado como una cadena. La cadenacontiene un solo carácter, el caracter separador de nombres.publ i c stati c f i nal char separatorChar 

    El caracter separador de nombres, dependiente del sistema. Contiene el primer carácter de la propiedadseparat or . Este carácter se utiliza para separar los nombres de una ruta. En los sitemas UNIX elcarácter es ‘/ ’ en Windows es ‘\ \ ’,

  • 8/17/2019 Tema 10 - Entrada y Salida

    6/102

    286 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Tabla 10.2. Métodos de la Clase File publ i c File( St r i ng pat hname)

    Crea una nueva instancia de la clase File convirtiendo la ruta del parámetro a una ruta abstracta. La

    ruta del parámetro está en un formato entendible por el sistema operativo huésped. Si la ruta delparámetro es una cadena vacía, el resultado es una ruta abstracta nula.

    Lanza:Nul l Poi nt er Except i on - Si el parámetro pat hname es nul l .

    publ i c File( St r i ng parent , St r i ng chi l d)

    Crea una nueva instancia de la clase File a partir de las rutas dadas por los parámetros parent  ychi l d.

    Si el parámetro par ent  es null, la nueva instancia de File se crea como si se invocara al constructorcon un solo argumento con el parámetro chi l d.

    De otro modo, se toma la ruta dada por el parámetro par ent  como si fuera un directorio y la ruta dadapor su parámetro chi l d como si fuera un directorio o un archivo. Si la ruta dada por chi l d  es absoluta

    entonces se convierte a una ruta relativa en una forma dependiente del sistema.

    Si el parámetro parent  es una cadena vacía, la nueva instancia de F i l e se crea convirtiendo elparámetro chi l d a una ruta abstracta y el resultado se resuelve contra el directorio por omisióndependiente del sistema.

    De otro modo cada ruta se convierte a una ruta abstracta y la ruta abstracta del parámetro chi l d seresuelve contra la ruta del parámetro par ent .

    Lanza:Nul l Poi nt er Except i on - Si el parámetro chi l d es nul l .

    publ i c File( Fi l e parent , St r i ng chi l d)

    Crea una nueva instancia de la clase File a partir de la ruta abstracta dada por el parámetro par ent  yla ruta dada por el parámetro chi l d.

    Si el parámetro parent  es null, la nueva instancia de File se crea como si se invocara al constructorcon un solo argumento con el parámetro chi l d.

    De otro modo, se toma la ruta abstracta dada por el parámetro par ent  como si fuera un directorio y laruta dada por su parámetro chi l d como si fuera un directorio o un archivo. Si la ruta dada por chi l d es absoluta entonces se convierte a una ruta relativa en una forma dependiente del sistema.

    Si el parámetro parent  es una ruta abstracta vacía, la nueva instancia de F i l e se crea convirtiendo elparámetro chi l d a una ruta abstracta y el resultado se resuelve contra el directorio por omisión

    dependiente del sistema.

    De otro modo cada ruta se convierte a una ruta abstracta y la ruta abstracta del parámetro chi l d seresuelve contra la ruta del parámetro par ent .

    Lanza:

    Nul l Poi nt er Except i on - Si el parámetro chi l d es nul l .

  • 8/17/2019 Tema 10 - Entrada y Salida

    7/102

    Tema 10 Entrada / Salida 287

    ITSON Manuel Domitsu Kono 

    Tabla 10.2. Métodos de la Clase File. Cont. publ i c i nt compareTo(Fi l e pat hname)

    Compara dos rutas abstractas lexicográficamente. El ordenamiento definido por este método esdependiente del sistema. En Unix, hay distinción entre mayúsculas y minúsculas, en Windows no.

    Regresa cero si la ruta abstracta del parámetro es igual a esta ruta abstracta, un valor negativo si estaruta abstracta es lexicográficamente menor que la ruta abstracta del parámetro o valor positivo si estaruta abstracta es lexicográficamente mayor que la ruta abstracta del parámetro.publ i c bool ean cr eateNewFi l e( ) t hr ows I OExcept i on

    Crea un archivo vacío nuevo en forma atómica, con el nombre de esta ruta abstracta si y sólo sí noexiste ya un archivo con este nombre.

    Regresa true si se pudo crear el archivo, f al se si el archivo ya existe.

    Lanza:

    I OExcept i on - Si ocurre un error de E/S.Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a

    escribir al archivo.publ i c bool ean delete( )

    Borra el archivo o directorio dado por esta ruta abstracta. Si esta ruta abstracta denota un directorio,entonces el directorio debe estar vacío para poder borrarlo.

    Regresa true si se pudo borrar el archivo, f al se en caso contrario.

    Lanza:

    Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso aborrar el archivo.

    publ i c bool ean equals( Obj ect obj )

    Compara esta ruta abstracta por igualdad con el objeto del parámetro. Regresa true si y sólo sí elparámetro no es nul l  y esta ruta abstracta es el mismo archivo o directorio que esta ruta abstracta.Que dos rutas abstractas sean iguales es dependiente del sistema. En Unix, hay distinción entremayúsculas y minúsculas, en Windows no.publ i c bool ean exists( )

    Regresa true si y sólo sí el archivo o directorio dado por esta ruta abstracta existe.

    Lanza:Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a leerel archivo. 

    publ i c Fi l e getAbsoluteFile( )

    Regresa la ruta abstracta absoluta de esta ruta abstracta.

    Lanza:Secur i t yExcept i on - Si no se puede acceder a un valor de una propiedad del sistema.

  • 8/17/2019 Tema 10 - Entrada y Salida

    8/102

    288 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Tabla 10.2. Métodos de la Clase File. Cont. publ i c St r i ng getAbsolutePath( )

    Regresa una cadena con la ruta absoluta de esta ruta abstracta.

    Si esta ruta abstracta es ya una ruta absoluta, entonces simplemente se regresa su ruta. Si esta ruta

    abstracta es una ruta vacía entonces se regresa la ruta del directorio actual que está dada por lapropiedad user. di r . De otra forma esta ruta es resuelta dependiendo del sistema. En los sistemasUNIX una ruta relativa se convierte en absoluta resolviéndola con respecto al directorio actual delusuario. En Windows se resuelve con respecto al directorio actual de la unidad de disco dada por laruta, si la hay, o contra el directorio actual del usuario.

    Lanza:Secur i t yExcept i on - Si no se puede acceder a un valor de una propiedad del sistema.

    publ i c St r i ng getName( )

    Regresa el nombre del archivo o directorio dado por esta ruta abstracta. Es el último nombre en lasecuencia del nombre de la ruta. Si la secuencia de la ruta es vacía se regresa una cadena vacía.publ i c St r i ng getParent( )

    Regresa el directorio padre de esta ruta abstracta o nul l  si la ruta no nombra un directorio padre.

    El directorio padre de una ruta abstracta consiste de prefijo de la ruta, si existe, seguido de cada uno delos nombres de la ruta menos el último. Si la secuencia de la ruta está vacía entonces la ruta no nombraun directorio padre.publ i c Fi l e getParentFile( )

    Regresa la ruta abstracta del directorio padre de esta ruta abstracta o nul l  si la ruta no nombra undirectorio padre.

    El directorio padre de una ruta abstracta consiste de prefijo de la ruta, si existe, seguido de cada uno delos nombres de la ruta menos el último. Si la secuencia de la ruta está vacía entonces la ruta no nombra

    un directorio padre.publ i c St r i ng getPath( )

    Convierte esta ruta abstracta a una cadena con la ruta. La cadena resultante usa el carácter separadorde nombres por ausencia para separar los nombres de la ruta.publ i c bool ean isAbsolute( )

    Regresa true si esta ruta abstracta es absoluta, f al se en caso contrario. La definición de rutaabsoluta es dependiente del sistema. En UNIX la ruta es absoluta si su prefijo es " / " . En Windows si suprefijo es un especificador de la unidad de disco seguida por " \ \ "  o si su prefijo es " \ \ \ \ " .publ i c bool ean isDirectory( )

    Regresa true si el archivo denotado por esta ruta abstracta existe y es un directorio, f al se en caso

    contrario.

    Lanza:Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a leerel archivo. 

  • 8/17/2019 Tema 10 - Entrada y Salida

    9/102

    Tema 10 Entrada / Salida 289

    ITSON Manuel Domitsu Kono 

    Tabla 10.2. Métodos de la Clase File. Cont. publ i c bool ean isFile( )

    Regresa true si el archivo denotado por esta ruta abstracta existe y es un archivo normal, f al se encaso contrario. Un archivo es normal si no es un directorio

    Lanza:Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a leerel archivo.

    publ i c l ong length( )

    Regresa la longitud del archivo, denotado por esta ruta abstracta, en bytes. Si la ruta denota undirectorio el valor regresado no está especificado. Si el archivo no existe, el método regresa 0L.publ i c St r i ng[ ] list( )

    Regresa un arreglo de cadenas con los nombres de los archivos y directorios dentro del directorio dadopor esta ruta abstracta. Si el directorio está vacío, el arreglo estará vacío. Si esta ruta abstracta no es un

    directorio o si ocurre un error de E/S, el método regresa nul l .

    Cada cadena es sólo el nombre del archivo o directorio, no la ruta completa. No hay garantía que elarreglo de canciones con los nombres de los archivos y directorios aparezca en un orden determinado.

    Lanza:Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a leerel directorio.

    publ i c St r i ng[ ] list( Fi l enameFi l ter f i l t er )

    Regresa un arreglo de cadenas con los nombres de los archivos y directorios dentro del directorio dadopor esta ruta abstracta y que satisfacen el filtro dado por el parámetro. Si el directorio está vacío oninguno de los nombres satisface al filtro, el arreglo estará vacío. Si esta ruta abstracta no es undirectorio o si ocurre un error de E/S, el método regresa nul l .

    Si el filtro del parámetro es nul l , se aceptan todos los nombres. De otra manera, un nombre satisfaceal filtro si y sólo el método Fi l enameFi l t er . accept ( ) del filtro regresa true cuando se le invocacon el nombre del archivo o directorio.

    Cada cadena es sólo el nombre del archivo o directorio, no la ruta completa. No hay garantía que elarreglo de canciones con los nombres de los archivos y directorios aparezca en un orden determinado.

    Lanza:

    Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a leerel directorio. 

    publ i c Fi l e[ ] listFiles( )

    Regresa un arreglo de rutas abstractas de los archivos y directorios dentro del directorio dado por esta

    ruta abstracta. Si el directorio está vacío, el arreglo estará vacío. Si esta ruta abstracta no es undirectorio o si ocurre un error de E/S, el método regresa nul l .

    Si esta ruta abstracta, es absoluta, cada ruta abstracta del arreglo es absoluta. Si esta ruta abstracta esrelativa, cada ruta abstracta del arreglo es relativa al mismo directorio. No hay garantía que el arreglo decanciones con los nombres de los archivos y directorios aparezca en un orden determinado.

    Lanza:Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a leerel directorio. 

  • 8/17/2019 Tema 10 - Entrada y Salida

    10/102

    290 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Tabla 10.2. Métodos de la Clase File. Cont. publ i c Fi l e[ ] listFiles(F i l enameFi l ter f i l ter )

    Regresa un arreglo de rutas abstractas de los archivos y directorios dentro del directorio dado por estaruta abstracta y que satisfacen el filtro dado por el parámetro. Si el directorio está vacío o ninguno de losnombres satisface al filtro, el arreglo estará vacío. Si esta ruta abstracta no es un directorio o si ocurre

    un error de E/S, el método regresa nul l .

    Si el filtro del parámetro es nul l , se aceptan todos los nombres. De otra manera, un nombre satisfaceal filtro si y sólo el método Fi l enameFi l t er . accept ( ) del filtro regresa true cuando se le invocacon el nombre del archivo o directorio.

    Si esta ruta abstracta, es absoluta, cada ruta abstracta del arreglo es absoluta. Si esta ruta abstracta esrelativa, cada ruta abstracta del arreglo es relativa al mismo directorio. No hay garantía que el arreglo decanciones con los nombres de los archivos y directorios aparezca en un orden determinado.

    Lanza:Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a leerel directorio. 

    publ i c Fi l e[ ] listFiles( Fi l eFi l t er f i l t er )

    Regresa un arreglo de rutas abstractas de los archivos y directorios dentro del directorio dado por estaruta abstracta y que satisfacen el filtro dado por el parámetro. Si el directorio está vacío o ninguno de losnombres satisface al filtro, el arreglo estará vacío. Si esta ruta abstracta no es un directorio o si ocurre

    un error de E/S, el método regresa nul l .

    Si el filtro del parámetro es nul l , se aceptan todos los nombres. De otra manera, un nombre satisfaceal filtro si y sólo el método Fi l eFi l t er . accept ( ) del filtro regresa true cuando se le invoca con elnombre del archivo o directorio.

    Si esta ruta abstracta, es absoluta, cada ruta abstracta del arreglo es absoluta. Si esta ruta abstracta esrelativa, cada ruta abstracta del arreglo es relativa al mismo directorio. No hay garantía que el arreglo de

    canciones con los nombres de los archivos y directorios aparezca en un orden determinado.

    Lanza:Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a leerel directorio.

    publ i c stat i c Fi l e[ ] listRoots( )

    Lista todos los directorios raíz de los sistemas de archivos. Cada sistema de archivos tiene un directorioraíz desde el cual todos los archivos en ese directorio pueden alcanzarse. En Windows cada unidad dedisco tiene un directorio raíz. En UNIX hay un solo directorio raíz.

    Este método regresa un arreglo de rutas abstractas, una para cada uno de los directorios del sistema dearchivos. Si no sepuede determinar los directorios raíz del sistema de archivos, el método regresa

    nul l . Si no hay directorios raíz en el sistema de archivos, el arreglo estará vacío.

    Si existe un administrador de seguridad y este niega el acceso a leer un directorio raíz en particular,este directorio raíz no aparecerá en el arreglo.

  • 8/17/2019 Tema 10 - Entrada y Salida

    11/102

    Tema 10 Entrada / Salida 291

    ITSON Manuel Domitsu Kono 

    Tabla 10.2. Métodos de la Clase File. Cont. publ i c bool ean mkdir( )

    Crea un directorio con el nombre de esta ruta abstracta.Regresa true si se pudo crear el directorio, f al se en caso contrario.

    Lanza:Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el crear eldirectorio.

    publ i c bool ean mkdirs( )

    Crea un directorio con el nombre de esta ruta abstracta, incluyendo cualquier directorio padre necesariopero no existente. Aún cuando esta operación falle en crear el directorio, alguno de los directorios pudohaber sido creado.

    Regresa true si se pudo crear el directorio, junto con sus directorios padres, f al se en caso contrario.

    Lanza:Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el crear el

    directorio y sus directorios padres.publ i c bool ean renameTo( Fi l e dest)

    Renombra el archivo o directorio dado por esta ruta abstracta. Mucho del comportamiento de estemétodo es dependiente de la plataforma. La operación de renombrar puede permitir mover al archivo deun sistema de archivos a otro, puede ser una operación atómica o no y puede tener éxito o no si elarchivo destino ya existe. El valor de retorno debe verificarse para saber si la operación tuvo éxito o no.

    Regresa true si se pudo renombrar el archivo, f al se en caso contrario.

    Lanza:

    Secur i t yExcept i on - Si existe un administrador de seguridad y este niega el acceso a leerel archivo anterior o nuevo.

    Nul l Poi nt er Except i on – Si el parámetro dest  es nul l .publ i c St r i ng toString( )

    Regresa una cadena con la ruta de esta ruta abstracta. Es la misma cadena regresada por el métodogetPath( ) .

    Ejemplo sobre los métodos de la Clase File

    El siguiente código ilustra el uso de algunos de los métodos de la clase F i l e.

    PruebaFile.java/ *

    * Pr uebaFi l e. j ava*/

    package pruebas;

    i mport j ava. i o. Fi l e;

    / * ** Este codi go i l ust r a el uso de al gunos de l os met odos de l a cl ase i o. Fi l e

  • 8/17/2019 Tema 10 - Entrada y Salida

    12/102

    292 Entrada / Salida

    ITSON Manuel Domitsu Kono

    ** @aut hor mdomi t su*/

    publ i c cl ass PruebaFi l e {

    / * ** @param ar gs t he command l i ne ar guments*/

    publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {St r i ng user Di r = Syst em. get Pr oper t y( "user . di r ") ;St r i ng separ ador = Syst em. get Pr oper t y( "f i l e. separ at or ") ;Syst em. out . pr i nt l n( "Di r ectori o del usuar i o: " + user Di r ) ;System. out . pr i nt l n( "Separ ador: " + separ ador) ;

    Fi l e f i l e1 = new Fi l e( user Di r ) ;Syst em. out . pr i nt l n( "Rut a abst r act a del di r ect or i o del usuar i o: "

    + f i l e1) ;Fi l e f i l e2 = new Fi l e( "sr c\ \ pr uebas\ \ Pr uebaFi l e. j ava") ;Syst em. out . pr i nt l n( "Car acteri st i cas del ar chi vo:

    src\ \ pr uebas\ \ PruebaFi l e. j ava: ") ;

    System. out . pr i nt l n( "Nombr e: " + f i l e2. get Name( ) ) ;Syst em. out . pr i nt l n( f i l e2. get Name( ) + ( f i l e2. exi st s( ) ? " ": " no ")+ "exi st e") ;

    System. out . pr i nt l n( "Tamaño " + f i l e2. l engt h( ) + " bytes") ;Syst em. out . pr i nt l n( "Rut a: " + f i l e2. get Pat h( ) ) ;Syst em. out . pr i nt l n( "Rut a abst r acta: " + f i l e2) ;Syst em. out . pr i nt l n( "Rut a absol ut a: " + f i l e2. get Absol ut ePat h( ) ) ;Syst em. out . pr i nt l n( "Rut a abst r act a absol ut a: "

    + f i l e2. get Absol ut eFi l e( ) ) ;System. out . pr i nt l n( f i l e2. get Name( ) + ( f i l e2. i sFi l e( ) ? " " : " no ")

    + "es un archi vo") ;Syst em. out . pr i nt l n( f i l e2. get Name( )

    + ( f i l e2. i sDi rect ory() ? " " : " no ")+ "es un di r ect or i o") ;

    System. out . pr i nt l n( "\ n") ;

    Syst em. out . pr i nt l n( "Car act er i st i cas del padr e de:src\ \ pr uebas\ \ PruebaFi l e. j ava: ") ;

    Syst em. out . pr i nt l n( "Rut a: " + f i l e2. get Par ent ( ) ) ;Syst em. out . pr i nt l n( "Rut a abst r acta: " + f i l e2. get Par ent Fi l e( ) ) ;Syst em. out . pr i nt l n( "Rut a absol ut a: "

    + f i l e2. get Par ent Fi l e( ) . get Absol ut ePat h( ) ) ;Syst em. out . pr i nt l n( "Rut a abst r act a absol ut a: "

    + f i l e2. get Par ent Fi l e( ) . get Absol ut eFi l e( ) ) ;Syst em. out . pr i nt l n( f i l e2. get Par ent ( )

    + ( f i l e2. get Parent Fi l e( ) . i sFi l e( ) ? " " : " no ")+ "es un archi vo") ;

    Syst em. out . pr i nt l n( f i l e2. get Par ent ( )+ ( f i l e2. get Parent Fi l e( ) . i sDi rect ory() ? " ": " no

    ") + "es un di r ectori o") ;

    Fi l e di r [ ] = f i l e1. l i st Fi l es( ) ;Syst em. out . pr i nt l n( "Ar chi vos del di r ectori o del usuar i o: ") ;f or ( Fi l e f i l e: di r ) {

    System. out . pr i nt l n( f i l e) ;}

  • 8/17/2019 Tema 10 - Entrada y Salida

    13/102

    Tema 10 Entrada / Salida 293

    ITSON Manuel Domitsu Kono 

    Fi l e rai ces[ ] = Fi l e. l i s tRoots ( ) ;Syst em. out . pr i nt l n( "Rai ces: " ) ;f or ( Fi l e f i l e: r ai ces) {

    System. out . pr i nt l n( f i l e) ;}

    }}

    La salida de ese programa es:

    Di r ectori o del usuar i o:C: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i oSepar ador: \Rut a abst r act a del di r ect or i o del usuar i o:C: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i oCar acteri st i cas del ar chi vo: src\ pr uebas\ Pr uebaFi l e. j ava:Nombr e: PruebaFi l e. j avaPr uebaFi l e. j ava exi st e

     Tamaño 2603 byt es

    Rut a: sr c\ pr uebas\ Pr uebaFi l e. j avaRut a abst r act a: sr c\ pr uebas\ Pr uebaFi l e. j avaRut a absol ut a:C: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ sr c\ pr uebas\Pr uebaFi l e. j avaRut a abst r act a absol ut a:C: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ sr c\ pr uebas\Pr uebaFi l e. j avaPr uebaFi l e. j ava es un ar chi voPr uebaFi l e. j ava no es un di r ect or i o

    Car act er i st i cas del padr e de: sr c\ pr uebas\ Pr uebaFi l e. j ava:Rut a: sr c\ pr uebasRut a abst r act a: sr c\ pr uebas

    Rut a absol ut a:C: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ sr c\ pr uebasRut a abst r act a absol ut a:C: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ sr c\ pr uebassr c\ pr uebas no es un archi vosr c\ pr uebas es un di r ect or i oAr chi vos del di r ectori o del usuar i o:C: \ User s\ usuari o\ Document s\ Net BeansPr oj ect s_Notas_Cur sos\ i o\ bui l dC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ bui l d. xmlC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ mani f est . mfC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ nbpr oj ectC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ sr cC: \ User s\ usuari o\ Document s\ Net BeansPr oj ect s_Notas_Cur sos\ i o\ t est

    Rai ces:C: \D: \E : \F : \

    Filtros de Nombres de Archivo

    Dos de los métodos de la clase File permiten obtener una lista de los archivos de undirectorio que cumplen con cierto criterio:

  • 8/17/2019 Tema 10 - Entrada y Salida

    14/102

    294 Entrada / Salida

    ITSON Manuel Domitsu Kono

    •  publ i c St r i ng[ ] list( Fi l enameFi l t er f i l t er )  

    •  publ i c Fi l e[ ] listFiles(F i l enameFi l t er f i l ter )

    •  publ i c Fi l e[ ] listFiles( Fi l eFi l t er f i l t er )

    Que regresan los nombres de los archivos (y directorios) y las rutas abstractas de losarchivos (y directories) de la ruta abstracta de la clase y que satisfacen el filtro de suparámetro. Los filtros son instancias de clases que implementan ya sea la interfaz

    Fi l enameFi l t er  o la interfaz Fi l eFi l t er .

    Interfaz FilenameFilter 

    Las clases que implementan esta interfaz se usan para filtrar nombres de archivos.

    Esta interfaz sólo declara el método accept ( )  mostrado en la tabla 10.3.

    Tabla 10.3. Método accept() de la Interfaz FilenameFilter bool ean accept( Fi l e di r , St r i ng name)

    Regresa true si el archivo dado por el parámetro name y que se encuentra en el directorio dado por elparámetro di r , satisface al filtro, f al se en caso contrario.

    Interfaz FileFilter 

    Las clases que implementan esta interfaz se usan para filtrar rutas abstractas. Esta

    interfaz sólo declara el método accept ( )  mostrado en la tabla 10.4.

    Tabla 10.4. Método accept() de la Interfaz FileFilter bool ean accept( Fi l e pathname)

    Regresa true si la ruta abstracta dada por el parámetro pat hname satisface al filtro, f al se en casocontrario.

    Ejemplo sobre Filtros para los Directorios

    El siguiente código es un filtro que acepta sólo rutas abstractas que son archivos.

    FiltraArchivos.java/ ** Fi l t raArchi vos. j ava*/

    package f i l t r os;

    i mport j ava. i o. Fi l e;i mpor t j ava. i o. Fi l eFi l ter ;

    / * ** Est e f i l t r o sól o acept a ar chi vos* @aut hor usuar i o*/

  • 8/17/2019 Tema 10 - Entrada y Salida

    15/102

    Tema 10 Entrada / Salida 295

    ITSON Manuel Domitsu Kono 

    publ i c cl ass Fi l t r aAr chi vos i mpl ement s Fi l eFi l t er {

    / * ** Prueba si l a ruta abst r act a es un ar chi vo* @par am pat hname ruta abst r act a a probar* @r et ur n t r ue si l a r ut a abst r act a es un ar chi vo,* f al se en caso cont r ar i o*/

    publ i c bool ean accept ( Fi l e pathname) {r et ur n pat hname. i sFi l e( ) ;

    }}

    El siguiente código es un filtro que acepta sólo rutas abstractas que son directorios.

    FiltraDirs.java/ ** F i l t raDi rs . j ava*/

    package f i l t r os;

    i mport j ava. i o. Fi l e;i mpor t j ava. i o. Fi l eFi l ter ;

    / * ** Este f i l t ro sól o acept a di rect or i os* @aut hor usuar i o*/

    publ i c cl ass Fi l t r aDi r s i mpl ement s Fi l eFi l t er {

    / * ** Prueba si l a rut a abst r act a es un di r ect or i o* @par am pat hname ruta abst r act a a probar* @r et ur n t r ue si l a r ut a abst r act a es un di r ect or i o,* f al se en caso cont r ar i o*/

    publ i c bool ean accept ( Fi l e pathname) {r et ur n pat hname. i sDi r ect or y( ) ;

    }}

    El siguiente código utiliza los filtros anteriores para listar los archivos y directorios, sólolos archivos y sólo los directorios.

    PruebaFiltro.java/ ** Pr uebaFi l t r o. j ava*/

    package pruebas;

    i mport f i l t ros. Fi l t raArchi vos;i mpor t f i l t r os .F i l t r aDi rs ;

  • 8/17/2019 Tema 10 - Entrada y Salida

    16/102

    296 Entrada / Salida

    ITSON Manuel Domitsu Kono

    i mport j ava. i o. Fi l e;

    / * ** Este codi go i l ustr a el uso de l os f i l t ros para l i star di r ector i os** @aut hor usuar i o*/

    publ i c cl ass Pr uebaFi l t r o {

    / * ** @param ar gs t he command l i ne ar guments*/

    publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {Fi l e di r [ ] ;

    St r i ng user Di r = Syst em. get Pr oper t y( "user . di r ") ;St r i ng separ ador = Syst em. get Pr oper t y( "f i l e. separ at or ") ;Syst em. out . pr i nt l n( "Di r ectori o del usuar i o: " + user Di r ) ;Fi l e f i l e1 = new Fi l e( user Di r ) ;

    di r = f i l e1. l i st Fi l es( ) ;Syst em. out . pr i nt l n( "Ar chi vos y di r ectori os del di r ectori o delusuar i o: ") ;

    f or ( Fi l e f i l e: di r ) {System. out . pr i nt l n( f i l e) ;

    }

    di r = f i l e1. l i s tFi l es(new Fi l t raArchi vos() ) ;Syst em. out . pr i nt l n( "\ nAr chi vos del di r ectori o del usuar i o: ") ;f or ( Fi l e f i l e: di r ) {

    System. out . pr i nt l n( f i l e) ;}

    di r = f i l e1. l i s tFi l es (new Fi l t r aDi rs ( ) ) ;Syst em. out . pr i nt l n( "\ nDi r ectori os del di r ectori o del usuar i o: ") ;f or ( Fi l e f i l e: di r ) {

    System. out . pr i nt l n( f i l e) ;}

    }}

    La salida del programa anterior es:

    Di r ectori o del usuar i o:C: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i oAr chi vos y di r ectori os del di r ectori o del usuar i o:

    C: \ User s\ usuari o\ Document s\ Net BeansPr oj ect s_Notas_Cur sos\ i o\ bui l dC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ bui l d. xmlC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ mani f est . mfC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ nbpr oj ectC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ sr cC: \ User s\ usuari o\ Document s\ Net BeansPr oj ect s_Notas_Cur sos\ i o\ t est

    Ar chi vos del di r ectori o del usuar i o:C: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ bui l d. xmlC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ mani f est . mf

  • 8/17/2019 Tema 10 - Entrada y Salida

    17/102

    Tema 10 Entrada / Salida 297

    ITSON Manuel Domitsu Kono 

    Di r ectori os del di r ectori o del usuar i o:C: \ User s\ usuari o\ Document s\ Net BeansPr oj ect s_Notas_Cur sos\ i o\ bui l dC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ nbpr oj ectC: \ Users \ usuari o\ Document s\ Net BeansProj ect s_Notas_Cur sos\ i o\ sr cC: \ User s\ usuari o\ Document s\ Net BeansPr oj ect s_Notas_Cur sos\ i o\ t est

    La Clase JFileChooser 

    La clase J Fi l eChooser  del paquete swi ng de la API de Java es un componente quenos permite seleccionar uno o más archivos. No es un cuadro de diálogo por lo quedebe agregarse a una ventana, cuadro de diálogo u otro contenedor. Sin embargo, la

    clase J Fi l eChooser  tiene varios métodos que crean un cuadro de diálogo con unainstancia de esta clase y despliegan el cuadro de diálogo.

    Para usar J Fi l eChooser  para pedirle al usuario que seleccione un archivo se siguenlos siguientes pasos:

    1. Construye una instancia de la clase J Fi l eChooser .2. Establece si se desea el o los filtros de archivo deseados.

    3. Despliega la instancia de la clase J Fi l eChooser .4. Obtén los archivos seleccionados por el usuario.

    Para ello se usan algunos de los métodos de la clase.

    La figura 10.2 muestra el diagrama de clases de la clase J Fi l eChooser  y lastablas10.5 y 10.6 los atributos y algunos de sus métodos.

    Tabla 10.5. Atributos de la Clase JFileChooser publ i c s tat i c f i nal i nt APPROVE_OPTION 

    Valor regresado por la instancia de la clase J Fi l eChooser  si el usuario selecciona la opción aceptar.publ i c s tat i c f i nal i nt CANCEL_OPTION 

    Valor regresado por la instancia de la clase J Fi l eChooser  si el usuario selecciona la opción cancelar.publ i c s tat i c f i nal i nt CUSTOM_DIALOG 

    Indica que la instancia de la clase J Fi l eChooser  soporta una operación definida por el programador.publ i c s tat i c f i nal i nt DIRECTORIES_ONLY 

    Le indica a la instancia de la clase J Fi l eChooser  que solo muestre directorios.publ i c s tat i c f i nal i nt ERROR_OPTION 

    Valor regresado por la instancia de la clase J Fi l eChooser  si ocurrió un error.publ i c s tat i c f i nal i nt FILES_AND_DIRECTORIES 

    Le indica a la instancia de la clase J Fi l eChooser  que sólo muestre tanto archivos como directorios. publ i c s tat i c f i nal i nt FILES_ONLY 

    Le indica a la instancia de la clase J Fi l eChooser  que solo muestre archivos. 

  • 8/17/2019 Tema 10 - Entrada y Salida

    18/102

    298 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Figura 10.2 Diagrama de Clases de la Clase JFileChooser.

    Tabla 10.5. Atributos de la Clase JFileChooser. Cont.publ i c s tat i c f i nal i nt OPEN_DIALOG 

    Indica que la instancia de la clase J Fi l eChooser  soporta una operación de abrir archivo. publ i c s tat i c f i nal i nt SAVE_DIALOG 

    Indica que la instancia de la clase J Fi l eChooser  soporta una operación de guardar archivo. 

    Tabla 10.6. Métodos de la Clase JFileChooserpubl i c JFileChooser( )

    Crea una nueva instancia de la clase J Fi l eChooser  apuntando al directorio del usuario por ausencia.Este directorio es dependiente del sistema. En Windows es por lo general la carpeta “Mis Documentos”y el directorio hogar del usuario en UNIX.

  • 8/17/2019 Tema 10 - Entrada y Salida

    19/102

    Tema 10 Entrada / Salida 299

    ITSON Manuel Domitsu Kono 

    Tabla 10.6. Métodos de la Clase JFileChooser. Cont. publ i c JFileChooser( Fi l e curr ent Di r ector y)

    Crea una nueva instancia de la clase J Fi l eChooser  apuntando al directorio dado por la ruta abstractadel parámetro. Si el parámetro es nul l , se usa el directorio del usuario por ausencia. Este directorio esdependiente del sistema. En Windows es por lo general la carpeta “Mis Documentos” y el directorio

    hogar del usuario en UNIX.publ i c JFileChooser( St r i ng cur r ent Di r ect or yPat h)

    Crea una nueva instancia de la clase J Fi l eChooser  apuntando al directorio dado por la ruta delparámetro. Si el parámetro es nul l , se usa el directorio del usuario por ausencia. Este directorio esdependiente del sistema. En Windows es por lo general la carpeta “Mis Documentos” y el directoriohogar del usuario en UNIX. public  void addChoosableFileFilter( Fi l eFi l t er f i l t er )

     Agrega un filtro a la lista de filtros seleccionables por el usuario. public  void  changeToParentDirectory()

     Cambia el directorio para que sea el directorio padre del directorio actual.

    publ i c voi d ensureFileIsVisible( Fi l e f )

    Se asegura que el archivo del parámetro sea visible y no estéocultopubl i c Fi l eFi l ter getAcceptAllFileFilter( )

    Regresa el filtro que acepta todos los archivos. En Windows sería: Al l Fi l es ( * . * ) . publ i c Fi l eFi l ter [ ] getChoosableFileFilters( )

    Regresa la lista de filtros seleccionables por el usuario.publ i c Fi l e getCurrentDirectory( )

    Regresa el directorio actual.publ i c Fi l eFi l ter getFileFilter( )

    Regresa el filtro seleccionado actualpubl i c i nt getFileSelectionMode( )

    Regresa el tipo de archivos a ser desplegado. Puede ser uno de los siguientes:

    •   J Fi l eChooser . FI LES_ONLY: Despliegua sólo archivos.

    •   J Fi l eChooser . DI RECTORI ES_ONLY: Despliegua sólo directorios. 

    •   J Fi l eChooser . FI LES_AND_DI RECTORI ES: Despliega ambos. 

    El valor por omisión es J Fi l esChooser . FI LES_ONLY.publ i c Fi l e getSelectedFile( )

    Regresa la ruta abstracta del archivo seleccionado.publ i c Fi l e getSelectedFiles( )

    Regresa una lista con las rutas abstractas de los archivos seleccionados si está habilitada la selecciónmúltiple. publ i c bool ean isAcceptAllFileFilterUsed ( )

    Regresa true si se esta usando el filtro que acepta todos los archivos.

  • 8/17/2019 Tema 10 - Entrada y Salida

    20/102

    300 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Tabla 10.6. Métodos de la Clase JFileChooser. Cont. publ i c bool ean isDirectorySelectionEnabled ( )

    Regresa true si el modo de selección permite que se muestren los directorios.publ i c bool ean isFileSelectionEnabled ( )

    Regresa true si el modo de selección permite que se muestren los archivos.publ i c bool ean isMultiSelectionEnabled (

    Regresa true si se pueden seleccionar múltiples archivos. publ i c bool ean removeChoosableFileFilter( Fi l eFi l t er f )

    Elimina un filtro de la lista de filtros seleccionables por el usuario.publ i c voi d rescanCurrentDirectory( )

     Actualiza la lista de los archives desplegadospubl i c voi d resetChoosableFileFilters( )

    Restablece la lista de filtros seleccionables por el usuario a su estado original. Por lo general elimina

    todos los filtros agregados dejando sólo el filtro que acepta todos los archivos.publ i c voi d setAcceptAllFileFilterUsed ( bool ean b)

    Establece si el filtro que acepta todos los archivos va a estar en la lista de filtros seleccionables por elusuario. Si el valor del parámetro es f al se, el filtro se elimina de la lista de filtros. Si el valor delparámetro es true, el filtro se vuelve el filtro activo.publ i c voi d setCurrentDirectory( Fi l e di r )

    Establece el directorio actual al directorio dado por la ruta abstracta del parámetro. Si el parámetro esnul l , se usa el directorio del usuario por ausencia. Este directorio es dependiente del sistema. EnWindows es por lo general la carpeta “Mis Documentos” y el directorio hogar del usuario en UNIX. Si elvalor del parámetro no es un directorio, se usará el directorio padre.publ i c voi d setFileFilter( Fi l eFi l t er f i l t er )

    Establece el filtro actual al filtro del del parámetro.publ i c voi d setFileSelectionMode( i nt mode)

    Establece el modo de selección de la instancia de J Fi l esChooser al valor del parámetro. Los valorespermitidos son:

    •   J Fi l eChooser . FI LES_ONLY: Despliegua sólo archivos.

    •   J Fi l eChooser . DI RECTORI ES_ONLY: Despliegua sólo directorios. 

    •   J Fi l eChooser . FI LES_AND_DI RECTORI ES: Despliega ambos. 

    El valor por omisión es J Fi l eChooser . FI LES_ONLY.

    Lanza:I l l egal Ar gument Except i on – Si el valor del parámetro es un valor ilegal.

    publ i c voi d setMultiSelectionEnabled ( bool ean b)

    Si el valor del parámetro es true se permite seleccionar múltiples archivos.

  • 8/17/2019 Tema 10 - Entrada y Salida

    21/102

    Tema 10 Entrada / Salida 301

    ITSON Manuel Domitsu Kono 

    Tabla 10.6. Métodos de la Clase JFileChooser. Cont. publ i c voi d setSelectedFile( Fi l e f i l e)

    Establece el archivo seleccionado al archivo dado por la ruta abstracta del parámetro. Si el directoriopadre del archivo no es el directorio actual, se cambia eldirectorio actual al directorio padre delarchivo.publ i c voi d setSelectedFiles( Fi l e[ ] sel ect edFi l es)

    Establece los archivos seleccionados a los archivos dados por las rutas abstractas del parámetro si sepermite seleccionar múltiples archivos.publ i c i nt showDialog( Component parent , St r i ng approveBut t onText )

    t hrows Headl essExcept i on

    Despliega un cuadro de diálogo con el texto dado por el parámetro approveBut t onText  en el botónaprobar, en lugar del texto “Save” o “Open”.

    El parámetro parent  determina el contenedor sobre el que se abrirá el cuadro de diálogo. Si elparámetro par ent  es nul l  el cuadro aparecerá sobre la pantalla.

    El método regresa el estado delcomponente al momento de cerrarse:

    •   J Fi l eChooser . CANCEL_OPTI ON

    •   J Fi l eChooser . APPROVE_OPTI ON

    •   J Fi l eCHooser . ERROR_OPTI ON Si ocurrió un error o se desecha el cuadro de diálogo.

    Lanza:

    Headl essExcept i on – Si el ambiente no soporta un monitor, teclado o ratón.publ i c i nt showOpenDialog( Component par ent ) t hrows Headl essExcept i on

    Despliega un cuadro de diálogo para abrir un archivo.

    El parámetro parent  determina el contenedor sobre el que se abrirá el cuadro de diálogo. Si elparámetro par ent  es nul l  el cuadro aparecerá sobre la pantalla.

    El método regresa el estado delcomponente al momento de cerrarse:

    •   J Fi l eChooser . CANCEL_OPTI ON

    •   J Fi l eChooser . APPROVE_OPTI ON

    •   J Fi l eCHooser . ERROR_OPTI ON Si ocurrió un error o se desecha el cuadro de diálogo.

    Lanza:Headl essExcept i on – Si el ambiente no soporta un monitor, teclado o ratón.

  • 8/17/2019 Tema 10 - Entrada y Salida

    22/102

    302 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Tabla 10.6. Métodos de la Clase JFileChooser. Cont. publ i c i nt showSaveDialog( Component par ent ) t hrows Headl essExcept i on

    Despliega un cuadro de diálogo para guardar un archivo.

    El parámetro parent  determina el contenedor sobre el que se abrirá el cuadro de diálogo. Si el

    parámetro par ent  es nul l  el cuadro aparecerá sobre la pantalla.

    El método regresa el estado del componente al momento de cerrarse:

    •   J Fi l eChooser . CANCEL_OPTI ON

    •   J Fi l eChooser . APPROVE_OPTI ON

    •   J Fi l eCHooser . ERROR_OPTI ON Si ocurrió un error o se desecha el cuadro de diálogo.

    Lanza:

    Headl essExcept i on – Si el ambiente no soporta un monitor, teclado o ratón.

    Filtros de Nombres de Archivo para la clase JFileChooser 

    La clase JFileChooser nos permite manejar una lista de filtros para seleccionar losnombres de archivos que serán desplegados mediante los métodos:

    •   public  void addChoosableFileFilter( Fi l eFi l t er f i l t er )  

    •  publ i c Fi l eFi l ter getAcceptAllFileFilter( )

    •  publ i c Fi l eFi l ter [ ] getChoosableFileFilters( )

    •  publ i c Fi l eFi l ter getFileFilter( )

    •  publ i c bool ean isAcceptAllFileFilterUsed ( )

    •  publ i c bool ean removeChoosableFileFilter( Fi l eFi l t er f )

    •  publ i c voi d resetChoosableFileFilters( )

    •  publ i c voi d setAcceptAllFileFilterUsed ( bool ean b)

    •  publ i c voi d setFileFilter( Fi l eFi l t er f i l t er )

    Los filtros son instancias de clases que heredan de la clase abstracta

     j avax. swi ng. f i l echooser . Fi l eFi l t er  e implementan sus métodos. Esta clasetiene el mismo nombre que la interfaz j ava. i o. Fi l eFi l t er  vista previamente y paraevitar conflictos de nombre, si se importan ambos paquetes se deben utilizar losnombres completamente calificados.

    Clase 

    javax.swing.filechooser.FileFilter 

    Las clases que implementan los métodos de esta clase abstracta se usan para filtrarnombres de archivos. Estos métodos se muestran en la tabla 10.7.

    Tabla 10.7. Métodos de la c lase javax.swing.filechooser.FileFilter publ i c abst r act bool ean accept( Fi l e f )

    Regresa true si el archivo dado por la ruta abstracta del parámetro satisface al filtro, f al se en casocontrario.

  • 8/17/2019 Tema 10 - Entrada y Salida

    23/102

    Tema 10 Entrada / Salida 303

    ITSON Manuel Domitsu Kono 

    Tabla 10.7. Métodos de la c lase javax.swing.filechooser.FileFilter publ i c abst r act St r i ng getDescription( )

    Regresa una cadena con la descripción de este filtro.

     

    Clase FileNameExtensionFilter 

    Una clase que implementa los métodos abstractos de la clase

     j avax. swi ng. f i l echooser . Fi l eFi l t er  es la claseFi l eNameExt ensi onFi l t er  y que nos permite crear filtros usando un conjunto deextensiones. La extensión de un nombre de archivo es la porción del nombre despuésdel último punto. Los nombres de archivo que no contienen un punto no tienenextensión. Las comparaciones de las extensiones no toman en distinguen entremayúsculas y minúsculas.

    Los métodos de esta clase se muestran en la tabla 10.8.

    Tabla 10.8. Métodos de la Clase FileNameExtensionFilter publ i c abst r act bool ean accept( Fi l e f )

    Regresa true si el archivo dado por la ruta abstracta del parámetro satisface al filtro, f al se en casocontrario. Un archivo satisface este filtro si su extensión se ajusta a una de las extensiones de este filtroo es un directorio.publ i c abst r act St r i ng getDescription( )

    Regresa una cadena con la descripción de este filtro.publ i c St r i ng[ ] getExtensions( )

    Regresa un arreglo con las extensiones de este filtro.

    publ i c St r i ng toString( )

    Regresa una cadena con la representación de este filtro.Su valor depende de la implementación.

    Ejemplos sobre el uso de la clase JFileChooser 

    El siguiente código muestra el uso de una instancia de la clase JFileChooser paraseleccionar el archivo con la imagen a leer. El código para leer la imagen se estudiaráen el Tema 13 - Imágenes en Java.

    / * ** Est e metodo l ee una i magen bmp, gi f , j pg, png y l a* guarda en el at r i but o dbi del t i po Buf f er edI mage* @par am f r ame Vent ana sobr e l a que se despl i ega el cuadro* de di al ogo J Fi l eChooser*/

    publ i c voi d l eeI magen( J Frame f r ame) { J Fi l eChooser f c = new J Fi l eChooser ( ) ;

    / / El i mi na el f i l t r o * . *f c. set Accept Al l Fi l eFi l t erUsed( f al se) ;

  • 8/17/2019 Tema 10 - Entrada y Salida

    24/102

    304 Entrada / Salida

    ITSON Manuel Domitsu Kono

    / / Cr ea el f i l t r o par a l as ext enci ones val i dasFi l eNameExtensi onFi l t er extFi l t r o = new Fi l eNameExtensi onFi l t er (

    "I mages", "bmp", "gi f ", "j pg", "png") ;

    / / Est abl ece el f i l t r o par a l as ext enci ones val i dasf c. setFi l eFi l ter ( extFi l t r o) ;

    / / Despl i ega el cuadr o de di al ogo par a sel ecci onar l a i magen a abr i ri nt r et ur nVal = f c. showOpenDi al og( f r ame) ;

    / / Si se sel ecci ono una i mageni f ( r etur nVal == J Fi l eChooser . APPROVE_OPTI ON) {

    / / Obt i ene el obj et o Fi l e de l a i magen sel ecci onadaf i l e = f c. get Sel ect edFi l e( ) ;

    / / est a part e de códi go en l a que se l ee l a i magen se est udi ara/ / en el Tema 13 - I mágenes en J avatry {

    / / l ee l a i magen y l a guarda en el at r i but o obi

    / / del t i po Buf f er edI mageobi = I mageI O. r ead( f i l e) ;

    / / Hace que l a ref er enci a dbi apunt e a obidbi = obi ;

    } cat ch ( I OExcept i on e) { J Opt i onPane. showMessageDi al og( f r ame,

    "Er r or al car gar i magen") ;r et urn;

    }}

    }

    El siguiente código muestra el uso de una instancia de la clase JFileChooser paraseleccionar el archivo con la imagen a guardar. El código para guardar la imagen seestudiará en el Tema 13 - Imágenes en Java.

    / * ** Est e metodo guar da l a i magen bmp, gi f , j pg, png del* at r i but o dbi del t i po Buf f er edI mage en un archi vo* @par am f r ame Vent ana sobr e l a que se despl i ega el cuadro* de di al ogo J Fi l eChooser*/

    publ i c voi d Guar daI magenComo( J Fr ame f r ame) {Fi l e f i l eSel = nul l ;

     J Fi l eChooser f c = new J Fi l eChooser ( ) ;

    / / El i mi na el f i l t r o * . *f c. set Accept Al l Fi l eFi l t erUsed( f al se) ;

    / / Agr ega var i os f i l t r os de i magenesf c. addChoosabl eFi l eFi l t er (

    new Fi l eNameExt ensi onFi l t er( " I magen BMP", "bmp") ) ;f c. addChoosabl eFi l eFi l t er (

    new Fi l eNameExtensi onFi l t er ( "I magen GI F", "gi f ") ) ;

  • 8/17/2019 Tema 10 - Entrada y Salida

    25/102

    Tema 10 Entrada / Salida 305

    ITSON Manuel Domitsu Kono 

    f c. addChoosabl eFi l eFi l t er (new Fi l eNameExtensi onFi l t er ( "I magen J PG", "j pg") ) ;

    f c. addChoosabl eFi l eFi l t er (new Fi l eNameExt ensi onFi l t er ( " I magen PNG", "png") ) ;

    / / Est abl ece el nombr e i ni ci al de l a i magenf c. setSel ectedFi l e( f i l e) ;

    / / Despl i ega cuadr o de di al ogo para obtener el nombr e/ / del archi vo en el que se va a guardar l a i mageni nt r et ur nVal = f c. showSaveDi al og( f r ame) ;

    / / Si se sel ecci ono un ar chi voi f ( r etur nVal == J Fi l eChooser . APPROVE_OPTI ON) {

    St r i ng nombr eExt = nul l ;

    / / Obt i ene el nombr e del archi vo sel ecci onadof i l eSel = f c. get Sel ectedFi l e( ) ;/ / Obt i ene el nombr e del f i l t r o sel ecci onadoFi l eNameExtensi onFi l t er extFi l t r o =

    ( Fi l eNameExt ensi onFi l t er) f c. get Fi l eFi l t er( ) ;

    / / Obt i ene l a extensi on del nombr e del f i l t r o sel ecci onadoSt r i ng ext = ext Fi l t r o. get Ext ensi ons( ) [ 0] ;

    St r i ng pat h = f i l eSel . get Pat h( ) ;

    / / Obt i ene l a extensi on del nombr e del archi vo sel ecci onadonombr eExt = get Extensi on( f i l eSel ) ;

    / / Si el nombre sel ecci onado no corr esponde a uno de i mageni f ( nombr eExt ! = nul l && ! esI mageExt ensi on( nombr eExt ) ) {

     J Opt i onPane. showMessageDi al og( f r ame,"No es un ar chi vo de i magen") ;

    r et urn;}

    / / Si no hay ext ensi on del nombr e del archi vo sel ecci onadoi f ( nombr eExt == nul l ) {

    / / Agr egal e l a extensi on del nombr e del f i l t r o sel ecci onadopat h += " . " + ext ;f i l eSel = new Fi l e( pat h) ;nombreExt = ext ;

    }

    / / est a par t e de códi go en l a que se guarda l a i magen se est udi ara/ / en el Tema 13 - I mágenes en J avatry {

    / / Guarda l a i magen

    I mageI O. wr i t e( dbi , nombr eExt , f i l eSel ) ;} cat ch ( I OExcept i on e) {

     J Opt i onPane. showMessageDi al og( f r ame,"Er r or al guar dar l a i magen") ;

    }}

    }

    / *** Est e met odo est at i co obt i ene l a ext ensi on de un ar chi vo

  • 8/17/2019 Tema 10 - Entrada y Salida

    26/102

    306 Entrada / Salida

    ITSON Manuel Domitsu Kono

    * @par amf i l e Obj et o de ti po Fi l e de l a que se obt i ene* l a extensi on* @r eturn Ext ensi on de un archi vo*/

    publ i c st at i c St r i ng get Ext ensi on( Fi l e f i l e) {St r i ng ext = nul l ;/ / Obt i ene el nombr e del archi voSt r i ng s = f i l e. get Name( ) ;/ / busca el separador de l a extensi oni nt pos = s . l ast I ndexOf ( ' . ' ) ;

    / / Si hay un punto en el nombre y hay una/ / ext ensi on despues del punt oi f ( pos > 0 && pos < s. l engt h( ) - 1) {

    ext = s. subst r i ng( pos + 1) . t oLower Case( ) ;}r et ur n ext ;

    }

    / * *

    * Est e medodo det ermi na si l a ext ensi on del nombre de ar chi vo* cor r espont e a una i magen* @par am ext Ext ensi on del nombre de ar chi vo* @r et ur n t r ue si si l a ext ensi on del nombr e de ar chi vo* cor r espont e a una i magen, f al se en caso cont r ari o*/

    publ i c bool ean esI mageExtensi on( St r i ng ext ) {St r i ng[ ] i magenesExt = {"bmp", "gi f ", "j pg" , "png"};

    f or ( i nt i = 0; i < i magenesExt. l engt h; i ++) {i f ( ext . equal s( i magenesExt [ i ] ) ) {

    r et ur n t r ue;}

    }

    return f al se;}

     ARCHIVOS Y FLUJOS

    Los datos almacenados en variables (ya sean simples o en arreglos) sólo se conservanmientras las variables están dentro de su ámbito. Esos datos se pierden cuando lasvariables lo abandonan o el programa termina su ejecución. Si deseamos que los datosse conserven debemos almacenar esos datos en un dispositivo de memoria secundaria:discos y cintas magnéticas, discos compactos, discos magneto-ópticos, etc. Los datosalmacenados en forma permanente en un dispositivo de memoria secundaria se conocencomo datos persistentes. Por otro lado, prácticamente todos los programascomputacionales requieren comunicarse con una serie de dispositivos de entrada/salida,tales como el teclado, el monitor, los puertos serie y paralelo, etc.

  • 8/17/2019 Tema 10 - Entrada y Salida

    27/102

    Tema 10 Entrada / Salida 307

    ITSON Manuel Domitsu Kono 

     Aunque cada dispositivo de memoria secundaria y cada dispositivo de entrada/salida esfísicamente diferente de los otros, el sistema operativo nos oculta las diferencias entreellos unificándolos bajo el concepto de archivo. Un archivo es un dispositivo lógico enel que podemos escribir información o del que podemos leer información. No todos losarchivos tienen las mismas capacidades. Por ejemplo hay archivos a los que sólo

    podemos escribir: monitor y puerto paralelo. Hay otros de los que sólo podemos leer, porejemplo el teclado. En algunos, como los archivos disco, podemos acceder la informaciónen forma aleatoria, mientras que en otros sólo en forma secuencial, por ejemplo el tecladoy los puertos serie y paralelo. Antes de poder leer o escribir en un archivo debemos deabrirlo y al terminar de trabajar con un archivo debemos cerrarlo. Al abrir un archivo,establecemos la comunicación entre el programa y el dispositivo y al cerrar el archivo destruimos esa comunicación.

     Adicionalmente al concepto de archivo, muchos lenguajes de programación, incluyendo aJava, nos presentan una abstracción o interfaz común para los archivos: El flujo(stream). Podemos considerar a un flujo como una corriente de bytes que se envía de

    nuestro programa a un archivo o que nuestro programa recibe de un archivo. Esta interfazo intermediario nos oculta todas las diferencias que existen entre los archivos y nospermiten concentrarnos en qué datos queremos enviar o recibir de un archivo y no encómo lo vamos a hacer. Al abrir un archivo se le asocia un flujo. Aunque un flujo es sólouna secuencia de bytes, la información que contiene puede ser interpretada por nuestroprograma de dos formas: flujos texto y flujos binarios.

    Flujos Texto

    Si el programa interpreta los bytes que lee o escribe a un archivo como caracteres, sedice que el flujo es un flujo texto. Por ejemplo, algunos dispositivos de entrada y salida

    como el teclado, el monitor y el puerto paralelo le envían a, o reciben de la computadorabytes que representan caracteres. Por lo tanto, los flujos flujos asociados a esosdispositivos son flujos texto. También si deseamos guardar en disco información en formade una secuencia de caracteres utilizaremos los flujos texto.

    Un flujo texto es una secuencia de caracteres organizada en líneas, donde cada líneatermina en un carácter de salto de línea, el carácter cuyo código ASCII es 0xA

    Flujos Binarios

    Si los bytes escritos o leídos de un archivo no son interpretados como caracteres, se diceque el flujo asociado al archivo es un flujo binario. En este caso los bytes puedenrepresentar cualquier cosa: valores numéricos, objetos, imágenes, etc.

    Clases de Entrada y Salida de Java 

    La API de Java nos proporciona un gran número de interfaces y clases que nos permitetrabajar con archivos. Esas interfaces y clases se encuentran en el paquete:

  • 8/17/2019 Tema 10 - Entrada y Salida

    28/102

    308 Entrada / Salida

    ITSON Manuel Domitsu Kono

     j ava. i o

    En este tema sólo se verá una parte de las interfaces y clases del paquete j ava. i o ypara su estudio, se dividirán en tres grupos de acuerdo a como el programa interpreta

    el contenido de un archivo y a la forma de acceder a los datos almacenados en elarchivo.

     Archivos de Caracteres de Acceso Secuencial

    En este caso, accederemos a los datos del archivo en forma secuencial, es decir delprimero al último en ese orden. Para poder acceder a un dato intermedio deberemoshaber leído los anteriores en orden. Además en este caso los datos del archivo seráninterpretados por el programa como caracteres. En la figura 10.3 se muestra undiagrama parcial de las interfaces y clases que podemos utilizar en este tipo deproblemas.

    Figura 10.3 Interfaces y Clases para Archivos de Caracteres de AccesoSecuencial

  • 8/17/2019 Tema 10 - Entrada y Salida

    29/102

    Tema 10 Entrada / Salida 309

    ITSON Manuel Domitsu Kono 

    •  La interfaz Readabl e se encuentra en el paquete j ava. l ang y representa unafuente de caracteres. Esta interfaz sólo declara un método que se muestra en latabla 10.9.

    Tabla 10.9 Método Declarado en la Interfaz Readable.

    int read(CharBuffer  cb) throws IOException 

    Intenta leer caracteres y los almacena en un buffer especificado. Regresa el número de caracteresagregados al buffer, -1 si la fuente de caracteres llegó a su final.

    Lanza:I OExcept i on – Si ocurre un error de entrada/salidaNul l Poi nt er Except i on – Si cb es nulo.

    ReadOnl yBuf f erExcept i on - Si cb es de solo lectura.

    •  La interfaz Cl osabl e representa una fuente o un destino que puede cerrarse.Esta interfaz sólo declara un método que se muestra en la tabla 10.10.

    Tabla 10.10 Método Declarado en la Interfaz Closable.void close() throws IOException

     

    Cierra este flujo y libera los recursos del sistema asignados a él.

    Lanza:

    I OExcept i on – Si ocurre un error de entrada/salida 

    •  La interfaz Fl ushabl e representa un destino que puede vaciarse. Escribe elcontenido del buffer al flujo. Esta interfaz sólo declara un método que se muestraen la tabla 10.11.

    Tabla 10.11 Método Declarado en la Interfaz Flushable.void flush() throws IOException

     

    Vacía el buffer escribiendo su contenido en el flujo.

    Lanza:I OExcept i on – Si ocurre un error de entrada/salida 

    •  La interfaz Appendabl e se encuentra en el paquete j ava. l ang y representaun objeto al que se le pueden agregar caracteres. Esta interfaz declara variosmétodos que se muestran en la tabla 10.12.

    Tabla 10.12 Métodos Declarados en la Interfaz Appendable. Appendable append(char  c) throws IOException 

     Agrega el carácter del parámetro c al objeto. Regresa una referencia al objeto agregable.

    Lanza:I OExcept i on – Si ocurre un error de entrada/salida 

  • 8/17/2019 Tema 10 - Entrada y Salida

    30/102

    310 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Tabla 10.12 Métodos Declarados en la Interfaz Appendable. Cont.  Appendable append(charSecuence  csq ) throws IOException 

     Agrega la secuencia de caracteres dada por el parámetro csq  al objeto. Regresa una referencia al

    objeto agregable.

    Lanza:I OExcept i on – Si ocurre un error de entrada/salida 

     Appendable append(CharSecuence  csq , int  start, int  end ) throws IOException 

     Agrega la subsecuencia de caracteres del parámetro csq  a partir del carácter en la posición dada por el

    parámetro start hasta el carácter en la posición dada por el parámetro end . Regresa una referencia al

    objeto agregable.

    Lanza:I ndexOutOf BoundsExcept i on  - Si start o end  son negativos, start > end , o end esmayor que csq. l engt h( )  I OExcept i on – Si ocurre un error de entrada/salida 

    •  La clase abstracta Reader  es para leer de flujos de caracteres. Los métodos deesta clase se muestran en la tabla 10.13.

    Tabla 10.13 Métodos de la clase Reader.Reader()

    Crea un flujo de caracteres de entrada. void mark(int  readAheadLimit) throws IOException 

    Marca la posición actual en el archivo. Las siguientes llamadas al método reset()  posicionaran alarchivo en este punto. No todos los flujos de entrada de caracteres soportan esta operación. El

    parámetro readAheadLimit es el límite de caracteres que pueden leerse mientras se preserva la

    marca. Después de leerse este número de caracteres, intentar reestablecer el flujo puede fallar.

    Lanza:I OExcept i on – Si el flujo no sopota el método mar k( )  u ocurre un error de entrada/salida 

     boolean markSupported()

    Establece si el flujo soporta la operación mar k( ) .

    Regresa:true si y sólo si el flujo soporta la operación mark( ) .

    int read() throws IOException

    Lee un solo caracter. El método se bloquea hasta que haya un carácter, ocurra un error de

    entrada/salida o se llegue al final del flujo. Regresa el carácter leído como un entero en el rango de 0 a65,535 o -1 si se ha alcanzado el final del flujo.

    Lanza:I OExcept i on – Si ocurre un error de entrada/salida 

  • 8/17/2019 Tema 10 - Entrada y Salida

    31/102

    Tema 10 Entrada / Salida 311

    ITSON Manuel Domitsu Kono 

    Tabla 10.13 Métodos de la clase Reader. Cont.int read(char[]  cbuf ) throws IOException 

    Lee caracteres y los almacena en el arreglo dado por el parámetro cbuf . Regresa el número de

    caracteres leídos o -1 si se ha alcanzado el final del flujo..

    Lanza:I OExcept i on – Si ocurre un error de entrada/salida 

    abstract int read(char[]  cbuf , int  off , int  len) throws IOException 

    Lee hasta len caracteres y los almacena en el arreglo dado por el parámetro cbuf  a partir de la

    posición off . Regresa el número de caracteres leídos o -1 si se ha alcanzado el final del flujo.

    Lanza:I OExcept i on – Si ocurre un error de entrada/salida 

    int read(CharBuffer  target) throws IOException 

    Intenta leer caracteres en el buffer de caracteres dado por el parámetro target. Regresa el número de

    caracteres leídos o -1 si se ha alcanzado el final del flujo.

    Lanza:I OExcept i on –  Si ocurre un error de entrada/salidaNul l Poi nt er Except i on – Si target es nulo.ReadOnl yBuf f erExcept i on - Si target es un buffer de sólo lectura. 

     boolean ready() throws IOException

     Prueba si el flujo está listo para ser leído. Regresa true si hay garantía que la siguiente invocación ar ead( )  no se bloqueará, f al se en caso contrario.

    Lanza:I OExcept i on  – Si ocurre un error de entrada/salida

    void reset() throws IOException

     Restablece el flujo. Si el flujo se ha marcado se intenta reposicionar en la marca. No todos los flujos deentrada de caracteres soportan esta operación.

    Lanza:I OExcept i on – Si el flujo no se ha marcado, si la marca se ha invalidado, si el flujo no soportala operación reset()  o ocurre un error de entrada/salida.

    long skip(long  n) throws IOException 

    Lee y descarta n caracteres. Este método se bloqueará hasta que haya varios caracteres, ocurra un errorde entrada/salida o se llegue al final del flujo. Regresa el número de caracteres a leídos y descartados.

    Lanza:

    I l l egal Ar gument Except i on – Si n es negativo.I OExcept i on – Si ocurre un error de entrada/salida.

    •  La clase Buf f eredReader  es para leer de flujos de caracteres. Almacena loscaracteres leídos en un buffer para eficientar la lectura de caracteres, arreglos ylíneas. Se puede especificar el tamaño del buffer o se puede utilizar el valor poromisión, el cual es suficientemente grande para la mayoría de los casos.

  • 8/17/2019 Tema 10 - Entrada y Salida

    32/102

    312 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Por lo general se aconseja envolver cualquier objeto de la jerarquía de clases de

    Reader , por ejemplo las clases Fi l eReader  e I nput St r eamReader  con unobjeto del tipo Buf f eredReader  para eficientar su acceso. Por ejemplo:

    Buf f er edReader i n = new Buf f er edReader ( new Fi l eReader ( "datos. t xt " ) ) ;

    Los métodos de esta clase se muestran en la tabla 10.14.

    Tabla 10.14 Métodos de la clase BufferedReader.BufferedReader(Reader  in) 

    Crea un flujo de caracteres de entrada con buffer, a partir del flujo de entrada in, el buffer de entrada es

    de tamaño predeterminado.BufferedReader(Reader  in, int  sz) 

    Crea un flujo de caracteres de entrada con buffer, a partir del flujo de entrada in, el buffer de entrada es

    de tamaño sz .

    Lanza:I l l egal Ar gument Except i on – Si sz  

  • 8/17/2019 Tema 10 - Entrada y Salida

    33/102

    Tema 10 Entrada / Salida 313

    ITSON Manuel Domitsu Kono 

    Tabla 10.16 Constructor de la clase FileReader.FileReader(String fileName) t hr ows Fi l eNotFoundExcept i on 

    Crea un flujo del tipo Fi l eReader  para el archivo de nombre fileName.

    Lanza:Fi l eNotFoundExcept i on - Si el archivo no existe, si el nombre es un directorio en lugar de unarchivo o por si alguna otra razón no se puede abrir el archivo para lectura.

    •  La clase abstracta Wr i t er  es para escribir a flujos de caracteres. Los métodosde esta clase se muestran en la tabla 10.17.

    Tabla 10.17 Métodos de la clase Writer. Writer()

    Crea un flujo de caracteres de salida. void write(int c )  

    Escribe un solo caracter. El carácter del parámetro c.

    Lanza:I OExcept i on  – Si ocurre un error de entrada/salida. 

    void Write(char[] cbuf ) t hr ows I OExcept i on Escribe el arreglo de caracteres dado por el parámetro cbuf .

    Lanza:I OExcept i on  – Si ocurre un error de entrada/salida.

    abstract void Write(char[] cbuf , int off , int len) t hr ows I OExcept i on 

    Escribe len caracteres del arreglo de caracteres cbuf , a partir de la posición off .

    Lanza:I OExcept i on  – Si ocurre un error de entrada/salida. 

    void Write(String str ) t hr ows I OExcept i on Escribe la cadena dada por el parámetro str .

    Lanza:I OExcept i on  – Si ocurre un error de entrada/salida. 

    void Write(String str , int off , int len) t hr ows I OExcept i on Escribe len caracteres de la cadena str , a partir de la posición off .

    Lanza:I OExcept i on  – Si ocurre un error de entrada/salida. 

    •  La clase Buf f er edWr i t er  es para escribir a flujos de caracteres. Utiliza unbuffer para eficientar la escritura de caracteres, arreglos y líneas. Se puedeespecificar el tamaño del buffer o se puede utilizar el valor por omisión, el cuales suficientemente grande para la mayoría de los casos.

  • 8/17/2019 Tema 10 - Entrada y Salida

    34/102

    314 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Por lo general se aconseja envolver cualquier objeto de la jerarquía de clases de

    Wr i t er , por ejemplo las clases Fi l eWr i t er  e Out put St r eamWr i t erI nput St r eamReader  con un objeto del tipo Buf f er edWr i t er  para eficientarsu acceso. Por ejemplo:

    Pri nt Wr i t er out = new Pri nt Wr i t er ( newBuf f er edWr i t er ( new Fi l eWr i t er ( "dat os. t xt ") ) ) ;

    Los métodos de esta clase se muestran en la tabla 10.118.

    Tabla 10.118 Métodos de la clase BufferedWriter.BufferedWriter(Writer  out) 

    Crea un flujo de caracteres de salida con buffer a partir del flujo de entrada out. Usa un buffer de

    tamaño predeterminado.BufferedWriter(Writer  out, int  sz) 

    Crea un flujo de caracteres de salida con buffer a partir del flujo de entrada out. Usa un buffer de

    tamaño sz .

    Lanza:I l l egal Ar gument Except i on – Si sz  

  • 8/17/2019 Tema 10 - Entrada y Salida

    35/102

    Tema 10 Entrada / Salida 315

    ITSON Manuel Domitsu Kono 

    Los constructores de esta clase se muestran en la tabla 10.20.

    Tabla 10.20 Constructores de la clase FileWriter.FileWriter(String fileName) t hr ows I OExcept i on 

    Crea un flujo de salida del tipo Fi l eWr i t er  para el archivo de nombre fileName.

    Lanza:I OExcept i on - Si el archivo no existe y no puede ser escrito, si el nombre es un directorio enlugar de un archivo o por si alguna otra razón no se puede abrir el archivo para escritura.

    FileWriter(String fileName, boolean append ) t hr ows I OExcept i on 

    Crea un flujo de salida del tipo Fi l eWr i t er  para el archivo de nombre fileName. El parámetroappend indica si los datos a escribir se agregan al final del archive o no.

    Lanza:I OExcept i on - Si el archivo no existe, si el nombre es un directorio en lugar de un archivo opor si alguna otra razón no se puede abrir el archivo para lectura.

    Ejemplo de Archivos de Caracteres de AccesoSecuencial

    El siguiente ejemplo es un programa que lee un archivo texto que contiene el códigofuente de una clase de Java y cuenta el número de veces que aparecen las palabrasreservadas: i f , swi t ch, f or , whi l e y do. Los resultados los almacena en otroarchivo texto. El programa consiste de dos clases: Est adi st i cas yPr uebaEst adi st i cas. La clase Est adi st i cas contiene métodos para abrir el

    archivo con el código fuente y leerlo por líneas, contar las ocurrencias de las palabrasreservadas y escribir los resultados en otro archivo. La clase Pr uebaEst adi st i cas sólo sirve para probar los métodos de la clase Est adi st i cas.

    Estadisticas.java/ ** Estadi sti cas. j ava** Cr eada el 15 de sept i embre de 2007, 12: 21 PM

      */

    package est adi st i cas;

    i mport j ava. i o. *;

    / * ** Est e pr ogr ama l ee un archi vo text o que cont i ene el códi go f uent e de una* cl ase de J ava y cuent a el número de veces que apar ecen l as pal abr as* r eser vadas: i f , swi t ch, f or , whi l e y do. Los resul t ados l os al macena en* otr o ar chi vo text o.** @aut hor mdomi t su

  • 8/17/2019 Tema 10 - Entrada y Salida

    36/102

    316 Entrada / Salida

    ITSON Manuel Domitsu Kono

    */publ i c cl ass Est adi st i cas {

    St r i ng nomAr chi voEnt r ada;St r i ng nomAr chi voSal i da;St r i ng pal abr as[ ] ;i nt cuent aPal abr as[ ] ;

    / * ** Est e const r uctor i ni ci al i za l os at r i but os de l a cl ase e i nvoca a l os* métodos que abr en el archi vo f uent e, l o pr ocesan y escr i ben el r esul t ado* en ot r o ar chi vo.* @par am nomAr chi voEntr ada Nombre del archi vo con el códi go f uente en j ava* @par am nomAr chi voSal i da Nombr e del archi vo con l os resul t ados* @param pal abr as l i st a de l as pal abr as reser vadas a buscar.*/

    publ i c Est adi st i cas( St r i ng nomAr chi voEnt r ada, St r i ng nomAr chi voSal i da,St r i ng pal abr as[ ] ) {

    t hi s. nomAr chi voEnt r ada = nomAr chi voEnt r ada;t hi s. nomAr chi voSal i da = nomAr chi voSal i da;t hi s. pal abr as = pal abr as;

    / / Cr ea e i ni ci al i za el arr egl o donde se al macenarán el númer o de veces/ / que aparecen l as pal abr as r eservadascuent aPal abr as = new i nt [ pal abr as. l engt h] ;

    f or ( i nt i = 0; i < pal abr as. l engt h; i ++) cuent aPal abr as[ i ] = 0;

    / / Pr ocesa el ar chi vo con el códi go f uent epr ocesaAr chi vo( ) ;

    / / Escri be l os r esul t ados en un ar chi vo text oescri beResul t ados( ) ;

    }

    / * ** Est e método abr e el archi vo con el códi go f uent e, l o l ee l í nea por* l í nea, cuent a l as ocur r enci as de cada pal abr a cl ave y l as al macena en el* at r i but o cuent aPal abr as.*/

    publ i c voi d pr ocesaAr chi vo( ) {Fi l eReader f i l eReader = nul l ;Buf f eredReader buf f eredReader ;St r i ng l i nea = "" ;

    / / Abr e el ar chi vo con el códi go f uent etry {

    f i l eReader = new Fi l eReader ( nomAr chi voEntr ada) ;

    }cat ch( Fi l eNot FoundExcept i on f nf e) {

    System. out . pr i nt l n( "Er r or : No exi st e el ar chi vo " + nomAr chi voEnt r ada);r et urn;

    }

    / / Se envuel ve el archi vo con el códi go f uent e con un archi vo del t i po/ / Buf f er edReader par a ef i ci ent ar su accesobuf f eredReader = new Buf f eredReader( f i l eReader) ;

  • 8/17/2019 Tema 10 - Entrada y Salida

    37/102

    Tema 10 Entrada / Salida 317

    ITSON Manuel Domitsu Kono 

    try {whi l e( t r ue) {

    / / Obt én l a si gui ent e l í nea del archi vo con el códi go f uent el i nea = buf f er edReader . r eadLi ne( ) ;

    / / Si ya no hay l í neas, t er mi na el ci cl oi f ( l i nea == nul l ) br eak;

    / / Cuent a y acumul a l as ocur r enci as de cada pal abr a resevada en l a/ / l í neacuent aPal abr asLi nea( l i nea) ;

    }}cat ch ( I OExcept i on i oe) {

    System. out . pr i nt l n( "Er r or al pr ocesar el ar chi vo" + nomAr chi voEnt r ada);r et urn;

    }

    / / Ci err a el archi votry {

    buf f er edReader . cl ose( ) ;f i l eReader. cl ose( ) ;}cat ch ( I OExcept i on i oe) {

    System. out . pr i nt l n( "Er r or al cer r ar el archi vo" + nomAr chi voEnt r ada) ;r et urn;

    }}

    / *** Est e método escr i be en un archi vo t ext o, l as ocur r enci as de cada pal abr a* r eser vada en un ar chi vo con códi go f uent e de J ava*/

    publ i c voi d escr i beResul t ados( ) {Fi l eWri t er f i l eWri t er = nul l ;Buf f er edWr i t er buf f er edWr i t er ;

    / / Abr e el ar chi vo donde se escr i bi r án l os r esul t adostry {

    f i l eWr i t er = new Fi l eWr i t er ( nomAr chi voSal i da) ;}cat ch( I OExcept i on i oe) {

    System. out . pr i nt l n( "Er r or , no se pudo cr ear el ar chi vo" +nomAr chi voSal i da) ;

    r et urn;}

    / / Se envuel ve el archi vo donde se escr i bi r án l os r esul t ados con un/ / ar chi vo del t i po Buf f er edWr i t er par a ef i ci ent ar su accesobuf f er edWr i t er = new Buf f er edWr i t er ( ( Out put St r eamWr i t er ) ( f i l eWr i t er ) ) ;

    try {buf f er edWr i t er . wr i t e( "Fr ecuenci a de l as pal abr as reser vadas" ) ;buf f er edWr i t er . newLi ne( ) ;buf f er edWr i t er . wr i t e( "en l a cl ase: " + nomAr chi voEnt r ada) ;buf f er edWr i t er . newLi ne( ) ;buf f er edWr i t er . newLi ne( ) ;

  • 8/17/2019 Tema 10 - Entrada y Salida

    38/102

    318 Entrada / Salida

    ITSON Manuel Domitsu Kono

    / / Par a cada pal abr a reservadaf or ( i nt i = 0; i < pal abr as. l engt h; i ++) {

    / / escr i be en el ar chi vo l a pal abr a r eser vada y su ocur r enci abuf f er edWr i t er . wr i t e( pal abr as[ i ] + ": " + cuent aPal abr as[ i ] ) ;/ / Escri be en el ar chi vo un sal t o de l í neabuf f er edWr i t er . newLi ne( ) ;

    }}cat ch( I OExcept i on i oe) {

    Syst em. out . pr i nt l n( "Err or al escri bi r al ar chi vo" + nomAr chi voSal i da) ;r et urn;

    }

    / / Ci err a el archi votry {

    buf f er edWr i t er . cl ose( ) ;f i l eWr i ter . cl ose( ) ;

    }cat ch ( I OExcept i on i oe) {

    Syst em. out . pr i nt l n( "Err or al cer r ar el ar chi vo" + nomAr chi voSal i da) ;r et urn;}

    }

    / *** Est e método cuent a l as ocurr enci as de l as pal abr as reser vadas en l a* l í nea dada por el parámetr o y l as acumul a en el ar r egl o cuent aPal abr as* @param l i nea*/

    publ i c voi d cuent aPal abr asLi nea( St r i ng l i nea) {/ / Par a cada pal abr a de l as pal abr as reservadasf or ( i nt i = 0; i < pal abr as. l engt h; i ++) {

    / / Cuent a el númer o de ocur r enci as en l a l í neacuent aPal abr as[ i ] += cuent aPal abr aLi nea( l i nea, pal abr as[ i ] ) ;

    }}

    / *** Est e mét odo r egr esa el número de veces que l a pal abr a r eservada dada por* el parámetr o ocur r e en l a l í nea dada por el parámet r o* @par am l i nea Lí nea en l a que se busca l a pal abr a reser vada* @par am pal abr a Pal abr a r eser vada a buscar* @r et urn Número de veces que l a pal abra reser vada dada por el par ámet r o* ocur r e en l a l í nea dada por el parámet r o*/

    publ i c i nt cuent aPal abr aLi nea( St r i ng l i nea, St r i ng pal abr a) {

    i nt n = 0;i nt pos = 0;

    whi l e( t r ue) {/ / Busca l a pr i mer ocur r enci a de l a pal abr a en l a l í nea a par t i r/ / de l a posi ci ón pospos = l i nea. i ndexOf ( pal abr a, pos) ;

    / / Si l a pal abr a no exi st e, t er mi na

  • 8/17/2019 Tema 10 - Entrada y Salida

    39/102

    Tema 10 Entrada / Salida 319

    ITSON Manuel Domitsu Kono 

    i f ( pos

  • 8/17/2019 Tema 10 - Entrada y Salida

    40/102

    320 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Frecuenci a de l as pal abr as r eservadasen l a cl ase: src\ estadi sti cas\ Estadi sti cas. j ava

    i f : 3swi t ch: 0

    whi l e: 3for : 3do: 0

     Archivos de Acceso Secuencial de Bytes  En este caso, accederemos a los datos del archivo en forma secuencial y los datos delarchivo serán interpretados por el programa como bytes. En la figura 10.4 se muestraun diagrama parcial de las interfaces y clases que podemos utilizar en este tipo deproblemas.

    10.4 Interfaces y Clases para Archivos de Bytes de Acceso Secuencial

    •  La interfaz Dat aI nput  se encuentra en el paquete j ava. i o y provee métodospara leer bytes de un flujo binario y convertirlos a datos de los tipos primitivos.

    Los métodos declarados por esta interfaz se muestran en la tabla 10.21:

  • 8/17/2019 Tema 10 - Entrada y Salida

    41/102

    Tema 10 Entrada / Salida 321

    ITSON Manuel Domitsu Kono 

    Tabla 10.21 Métodos de la Interfaz DataInput.void readFully(byte[] b) throws IOException

     Lee algunos bytes del archivo y los almacena en el arreglo b. El número de bytes leídos es igual altamaño del arreglo b.

    Lanza: EOFExcept i on – Si se llega al final del archivo sin haber leído todos los bytes.

    I OExcept i on – Si ocurre un error de entrada/salida. Nul l Poi nt er Except i on – Si b es nul l . 

    void readFully(byte[] b , int off , int len) throws IOException

    Lee l en bytes del archivo y los almacena en el arreglo b a partir de la posición  of f .

    Lanza: EOFExcept i on – Si se llega al final del archivo sin haber leído todos los bytes.

    I OExcept i on – Si ocurre un error de entrada/salida.

    Nul l Poi nt er Except i on – Si b es nul l .

    I ndexOutOf BoundsExcept i on – Si of f  o l en es negativo o si of f +l en es mayor que lalongitud del arreglo b.

     boolean readBoolean()throws  IOException

     Lee un byte de la entrada y regresa true si el byte es diferente de cero, falso en caso contrario. Estemétodo se emplea para leer el booleano escrito por el método wr i t eBool ean( )  de la interfazDat aOut put .

    Lanza: EOFExcept i on – Si se llega al final del archivo sin haber leído todos sus bytes.I OExcept i on – Si ocurre un error de entrada/salida.

    char readChar()IOException 

    Lee y regresa un carácter   Unicode de la entrada. Este método se emplea para leer el carácter   Unicodeescrito por el método wr i t eChar ( )  de la interfaz Dat aOut put .

    Lanza: EOFExcept i on – Si se llega al final del archivo sin haber leído todos sus bytes.I OExcept i on – Si ocurre un error de entrada/salida. 

     byte  readByte( ) IOException 

    Lee y regresa un byte de la entrada. El byte es considerado como un valor signado en el rango -128 a

    127, inclusive. Este método se emplea para leer el byte escrito por el método wr i t eByt e( )  de lainterfaz Dat aOut put .

    Lanza: EOFExcept i on – Si se llega al final del archivo sin haber leído todos sus bytes.I OExcept i on – Si ocurre un error de entrada/salida. 

  • 8/17/2019 Tema 10 - Entrada y Salida

    42/102

    322 Entrada / Salida

    ITSON Manuel Domitsu Kono

    Tabla 10.21 Métodos de la Interfaz DataInput. Cont.int readUnsignedByte()IOException

     Lee un byte de la entrada y lo regresa como un i nt  en el rango de 0 a 255. Este método se emplea paraleer el byte escrito por el método wr i t eBy