Está en la página 1de 76

ITSON Manuel Domitsu Kono

Tema 8
Entrada y Salida

ARCHIVOS Y FLUJOS

Los datos almacenados en variables (ya sean simples o en arreglos) slo se conservan
mientras las variables estn dentro de su mbito. Esos datos se pierden cuando las
variables lo abandonan o el programa termina su ejecucin. Si deseamos que los datos
se conserven debemos almacenar esos datos en un dispositivo de memoria secundaria:
discos y cintas magnticas, discos compactos, discos magneto-pticos, etc. Los datos
almacenados en forma permanente en un dispositivo de memoria secundaria se conocen
como datos persistentes. Por otro lado, prcticamente todos los programas
computacionales requieren comunicarse con una serie de dispositivos de entrada/salida,
tales como el teclado, el monitor, los puertos serie y paralelo, etc.

Aunque cada dispositivo de memoria secundaria y cada dispositivo de entrada/salida es
fsicamente diferente de los otros, el sistema operativo nos oculta las diferencias entre
ellos unificndolos bajo el concepto de archivo. Un archivo es un dispositivo lgico en
el que podemos escribir informacin o del que podemos leer informacin. No todos los
archivos tienen las mismas capacidades. Por ejemplo hay archivos a los que slo
podemos escribir: monitor y puerto paralelo. Hay otros de los que slo podemos leer, por
ejemplo el teclado. En algunos, como los archivos disco, podemos acceder la informacin
en forma aleatoria, mientras que en otros slo en forma secuencial, por ejemplo el teclado
y los puertos serie y paralelo. Antes de poder leer o escribir en un archivo debemos de
abrirlo y al terminar de trabajar con un archivo debemos cerrarlo. Al abrir un archivo,
establecemos la comunicacin entre el programa y el dispositivo y al cerrar el archivo
destruimos esa comunicacin.

Adicionalmente al concepto de archivo, muchos lenguajes de programacin, incluyendo a
J ava, nos presentan una abstraccin o interfaz comn para los archivos: El flujo
(stream). Podemos considerar a un flujo como una corriente de bytes que se enva de
nuestro programa a un archivo o que nuestro programa recibe de un archivo. Esta interfaz
o intermediario nos oculta todas las diferencias que existen entre los archivos y nos
permiten concentrarnos en qu datos queremos enviar o recibir de un archivo y no en
cmo lo vamos a hacer. Al abrir un archivo se le asocia un flujo. Aunque un flujo es slo
una secuencia de bytes, la informacin que contiene puede ser interpretada por nuestro
programa de dos formas: flujos texto y flujos binarios.
206 Entrada / Salida
ITSON Manuel Domitsu Kono
Flujos Texto

Si el programa interpreta los bytes que lee o escribe a un archivo como caracteres, se
dice 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 envan a, o reciben de la computadora
bytes que representan caracteres. Por lo tanto, los flujos flujos asociados a esos
dispositivos son flujos texto. Tambin si deseamos guardar en disco informacin en forma
de una secuencia de caracteres utilizaremos los flujos texto.

Un flujo texto es una secuencia de caracteres organizada en lneas, donde cada lnea
termina en un carcter de salto de lnea, el carcter cuyo cdigo ASCII es 0xA
Flujos Binarios

Si los bytes escritos o ledos de un archivo no son interpretados como caracteres, se dice
que el flujo asociado al archivo es un flujo binario. En este caso los bytes pueden
representar cualquier cosa: valores numricos, objetos, imgenes, etc.

Clases de Entrada y Salida de Java

La API de J ava nos proporciona un gran nmero de interfaces y clases que nos permite
trabajar con archivos. Esas interfaces y clases se encuentran en el paquete:

j ava. i o

En este tema slo se ver una parte de las interfaces y clases del paquete j ava. i o y
para su estudio, se dividirn 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 el
archivo.
Archivos de Caracteres de Acceso Secuencial

En este caso, accederemos a los datos del archivo en forma secuencial, es decir del
primero al ltimo en ese orden. Para poder acceder a un dato intermedio deberemos
haber ledo los anteriores en orden. Adems en este caso los datos del archivo sern
interpretados por el programa como caracteres. En la figura 8.1 se muestra un
diagrama parcial de las interfaces y clases que podemos utilizar en este tipo de
problemas.

La interfaz Readabl e se encuentra en el paquete j ava. l ang y representa una
fuente de caracteres. Esta interfaz slo declara un mtodo que se muestra en la
tabla 8.1.
Tema 8 Entrada / Salida 207
ITSON Manuel Domitsu Kono

Figura 8.1 Interfaces y Clases para Archivos de Caracteres de Acceso Secuencial

Tabla 8.1 Mtodo Declarado en la Interfaz Readable.
int read(CharBuffer cb) throws IOException

Intenta leer caracteres y los almacena en un buffer especificado

Parmetro:
cb. El bufeer en que se escribirn los caracteres.

Regresa:
El nmero de caracteres agregados al buffer, -1 si la fuente de caracteres lleg a su final.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida
Nul l Poi nt er Except i on Si cb es nulo.
ReadOnl yBuf f er Except i on - Si cb es de solo lectura.

La interfaz Cl osabl e representa una fuente o un destino que puede cerrarse.
Esta interfaz slo declara un mtodo que se muestra en la tabla 8.2.



208 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.2 Mtodo 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 el
contenido del buffer al flujo. Esta interfaz slo declara un mtodo que se muestra
en la tabla 8.3.

Tabla 8.3 Mtodo Declarado en la Interfaz Flushable.
void flush() throws IOException

Vaca 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 representa
un objeto al que se le pueden agregar caracteres. Esta interfaz declara varios
mtodos que se muestran en la tabla 8.4.

Tabla 8.4 Mtodos Declarados en la Interfaz Appendable.
Appendable append(char c) throws IOException

Agrega un carcter al objeto.

Parmetro:
c. El carcter a ser agregado al objeto.

Regresa:
Una referencia al objeto agregable.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida
Appendable append(charSecuence csq) throws IOException

Agrega una secuencia de caracteres al objeto.

Parmetro:
csq. Secuencia de caracteres a ser agregados al objeto.

Regresa:
Una referencia al objeto agregable.

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


Tema 8 Entrada / Salida 209
ITSON Manuel Domitsu Kono
Tabla 8.4 Mtodos Declarados en la Interfaz Appendable. Cont.
Appendable append(charSecuence csq, int start, int end) throws IOException

Agrega una subsecuencia de caracteres al objeto.

Parmetros:
csq. Secuencia de la que se obtendr la secuencia de caracteres a ser agregados al objeto.
start. ndice del primer carcter de la subsecuencia.
end. ndice del ltimo carcter de la subsecuencia.

Regresa:
Una referencia al objeto agregable.

Lanza:
I ndexOut Of BoundsExcept i on - Si start o end son negativos, start > end, o end es
mayor 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 mtodos de
esta clase se muestran en la tabla 8.5.

Tabla 8.5 Mtodos de la clase Reader.
Reader()

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

Marca la posicin actual en el archivo. Las siguientes llamadas al mtodo r eset ( )
posicionaran al archivo en este punto. No todos los flujos de entrada de caracteres soportan
esta operacin.

Parmetros:
readAheadLimit. Lmite de caracteres que pueden leerse mientras se preserva la marca.
Despus de leerse este nmero de caracteres, intentar reestablecer el flujo puede fallar.

Lanza:
I OExcept i on Si el flujo no sopota el mtodo mar k( ) u ocurre un error de entrada/salida
boolean markSupported()

Establece si el flujo soporta la operacin mar k( ) .

Regresa:
t r ue si y slo si el flujo soporta la operacin mar k( ) .








210 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.5 Mtodos de la clase Reader. Cont.
int read() throws IOException

Lee un solo caracter. El mtodo se bloquea hasta que haya un carcter, ocurra un error de
entrada/salida o se llegue al final del flujo

Regresa:
El carcter ledo como un entero en el rango de 0 a 65,535 o -1 si se ha alcanzado el final del
flujo.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida
int read(char[] cbuf) throws IOException

Lee caracteres en un arreglo.

Parmetro:
cbuf: Arreglo en el que se almacenarn los caracteres.

Regresa:
El nmero de caracteres ledos 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 caracteres en una porcin de un arreglo.

Parmetro:
cbuf: Arreglo en el que se almacenarn los caracteres.
off: ndice en el arreglo del lugar en la que se empezarn a guardar los caracteres.
len: Mximo nmero de caracteres a leer.

Regresa:
El nmero de caracteres ledos 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.

Parmetro:
target: Arreglo en el que se almacenarn los caracteres.

Regresa:
El nmero de caracteres ledos o -1 si se ha alcanzado el final del flujo..

Lanza:
I OExcept i on Si ocurre un error de entrada/salida
Nul l Poi nt er Except i on Si target es nulo.
ReadOnl yBuf f er Except i on - Si target es un buffer de slo lectura.


Tema 8 Entrada / Salida 211
ITSON Manuel Domitsu Kono
Tabla 8.5 Mtodos de la clase Reader. Cont.
boolean ready() throws IOException

Prueba si el flujo est listo para ser ledo.

Regresa:
t r ue si hay garanta que la siguiente invocacin a r 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 de entrada de caracteres soportan esta operacin.

Lanza:
I OExcept i on Si el flujo no se ha marcado, si la marca se ha invalidado, si el flujo no soporta
la operacin r eset ( ) o ocurre un error de entrada/salida.
long skip(long n) throws IOException

Lee y descarta n caracteres. Este mtodo se bloquear hasta que haya varios caracteres, ocurra
un error de entrada/salida o se llegue al final del flujo

Parmetro:
n: Nmero de caracteres a leer y descartar.

Regresa:
El nmero de caracteres a ledos 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 er edReader es para leer de flujos de caracteres. Almacena los
caracteres ledos en un buffer para eficientar la lectura de caracteres, arreglos y
lneas. Se puede especificar el tamao del buffer o se puede utilizar el valor por
omisin, el cual es suficientemente grande para la mayora de los casos.

Por lo general se aconseja envolver cualquier objeto de la jerarqua de clases de
Reader , por ejemplo las clases Fi l eReader e I nput St r eamReader con un
objeto del tipo Buf f er edReader para eficientar su acceso. Por ejemplo:

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

Los mtodos de esta clase se muestran en la tabla 8.6.





212 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.6 Mtodos de la clase BufferedReader.
BufferedReader(Reader in)

Crea un flujo de caracteres de entrada con buffer que usa el buffer de entrada de tamao
predeterminado.

Parmetro:
in: Una instancia de Reader .
BufferedReader(Reader in, int sz)

Crea un flujo de caracteres de entrada con buffer que usa el buffer de entrada de tamao sz.

Parmetros:
in: Una instancia de Reader .
sz: Tamao del buffer de entrada.

Lanza:
I l l egal Ar gument Except i on Si sz <=0
String readLine()throws IOException

Lee una lnea de texto. Una lnea es una secuencia de caracteres terminada por un carcter de
salto de lnea (\n), un carcter de retorno de carro (\r), o un carcter de salto de lnea seguido
por un carcter retorno de carro.

Regresa:
Una cadena con el contenido de la lnea sin incluir los caracteres de terminacin, o nul l si se
lleg al final del flujo.

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

La clase I nput St r eamReader acta como un puente entre flujos de bytes y
flujos de caracteres: Lee bytes y los decodifica como caracteres. Cada
invocacin de uno de los mtodos read() de I nput St r eamReader causa que
se lean uno o ms bytes del flujo de entrada de bytes. Por eficiencia se aconseja
envolver el objeto I nput St r eamReader dentro de un objeto Buf f er edReader
para eficientar su acceso. Por ejemplo:

Buf f er edReader i n
= new Buf f er edReader ( new I nput St r eamReader ( Syst em. i n) ) ;

El constructor de esta clase se muestra en la tabla 8.7.

Tabla 8.7 Constructor de la clase InputStreamReader.
InputStreamReader(InputStream in)

Crea un flujo del tipo I nput St r eamReader .

Parmetro:
in: Un flujo de entrada de tipo I nput St r eam.

La clase Fi l eReader permite leer archivos de caracteres.
Tema 8 Entrada / Salida 213
ITSON Manuel Domitsu Kono
El constructor de esta clase se muestra en la tabla 8.8.

Tabla 8.8 Constructor de la clase FileReader.
FileReader(String fileName) t hr ows Fi l eNot FoundExcept i on

Crea un flujo del tipo Fi l eReader .

Parmetro:
fileName: Nombre del archivo a abrir para lectura.

Lanza:
Fi l eNot FoundExcept i on - Si el archivo no existe, si el nombre es un directorio en lugar de un
archivo o por si alguna otra razn no se puede abrir el archivo para lectura.

La clase abstracta Wr i t er es para escribir a flujos de caracteres. Los mtodos
de esta clase se muestran en la tabla 8.9.

Tabla 8.9 Mtodos de la clase Writer.
Writer()

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

Escribe un solo caracter.

Parmetro:
c - Caracter a escribir.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
void Write(char[] cbuf) t hr ows I OExcept i on

Escribe un arreglo de caracteres.

Parmetro:
cbuf - Arreglo de caracteres a escribir.

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 una porcin de un arreglo de caracteres.

Parmetros:
cbuf - Arreglo de caracteres con la porcin de caracteres a escribir.
off - ndice de la posicin en el arreglo a partir de la cual se escribir.
len - Nmero de caracteres a escribir.

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


214 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.9 Mtodos de la clase Writer. Cont.
void Write(String str) t hr ows I OExcept i on

Escribe una cadena.

Parmetro:
str - Cadena a escribir.

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 una porcin de una cadena.

Parmetro:
str Cadena con la porcin de caracteres a escribir..
off - ndice de la posicin en la cadena a partir de la cual se escribir.
len - Nmero de caracteres a escribir.

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 un
buffer para eficientar la escritura de caracteres, arreglos y lneas. Se puede
especificar el tamao del buffer o se puede utilizar el valor por omisin, el cual
es suficientemente grande para la mayora de los casos.

Por lo general se aconseja envolver cualquier objeto de la jerarqua 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 er
I nput St r eamReader con un objeto del tipo Buf f er edWr i t er para eficientar
su acceso. Por ejemplo:

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

Los mtodos de esta clase se muestran en la tabla 8.10.

Tabla 8.10 Mtodos de la clase BufferedWriter.
BufferedWriter(Writer out)

Crea un flujo de caracteres de salida con buffer que usa el buffer de entrada de tamao
predeterminado.

Parmetro:
out: Una instancia de Wr i t er .





Tema 8 Entrada / Salida 215
ITSON Manuel Domitsu Kono
Tabla 8.10 Mtodos de la clase BufferedWriter. Cont.
BufferedWriter(Writer out, int sz)

Crea un flujo de caracteres de salida con buffer que usa el buffer de entrada de tamao sz.

Parmetros:
out: Una instancia de Wr i t er .
sz: Tamao del buffer de entrada.

Lanza:
I l l egal Ar gument Except i on Si sz <=0
void newLine()throws IOException

Escribe un separadoe de lneas. Se recomienda utilizar este mtodo en lugar de escribir el
carcter directamente ya que el carcter empleado para separar lneas es dependiente de la
plataforma.

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

La clase Out put St r eamWr i t er acta como un puente entre flujos de
caracteres y flujos de bytes: Escribe caracteres codificndolos como bytes. Cada
invocacin de uno de los mtodos write() de Out put St r eamWr i t er causa que
uno o ms caracteres sean codificados como bytes y se agreguen al buffer antes
de ser enviados al flujo de salida de bytes. Por eficiencia se aconseja envolver el
objeto Out put St r eamWr i t er dentro de un objeto Buf f er edWr i t er para
eficientar su acceso .Por ejemplo:

Wr i t er out = new Buf f er edWr i t er ( new
Out put St r eamWr i t er ( Syst em. out ) ) ;

El constructor de esta clase se muestra en la tabla 8.11.

Tabla 8.11 Constructor de la clase OutputStreamWriter.
OutputStreamWriter(OutputStream out)

Crea un flujo del tipo Out put St r eamWr i t er .

Parmetro:
out: Un flujo de entrada de tipo OutputStream.

La clase Fi l eWr i t er permite escribir a archivos de caracteres.

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






216 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.12 Constructores de la clase FileWriter.
FileWriter(String fileName) t hr ows I OExcept i on

Crea un flujo del tipo Fi l eWr i t er .

Parmetro:
fileName: Nombre del archivo a abrir para escritura.

Lanza:
I OExcept i on - Si el archivo no existe y no puede ser escrito, si el nombre es un directorio en
lugar de un archivo o por si alguna otra razn no se puede abrir el archivo para escritura.
FileWriter(String fileName, boolean append) t hr ows I OExcept i on

Crea un flujo del tipo Fi l eWr i t er con append indicando si los datos a escribir se agregan al
final del archive o no..

Parmetro:
fileName: Nombre del archivo a abrir para escritura.

Lanza:
I OExcept i on - Si el archivo no existe, si el nombre es un directorio en lugar de un archivo o
por si alguna otra razn no se puede abrir el archivo para lectura.
Ejemplo de Archivos de Caracteres de Acceso
Secuencial

El siguiente ejemplo es un programa que lee un archivo texto que contiene el cdigo
fuente de una clase de J ava y cuenta el nmero de veces que aparecen las palabras
reservadas: i f , swi t ch, f or , whi l e y do. Los resultados los almacena en otro
archivo texto. El programa consiste de dos clases: Est adi st i cas y
Pr uebaEst adi st i cas. La clase Est adi st i cas contiene mtodos para abrir el
archivo con el cdigo fuente y leerlo por lneas, contar las ocurrencias de las palabras
reservadas y escribir los resultados en otro archivo. La clase Pr uebaEst adi st i cas
slo sirve para probar los mtodos de la clase Est adi st i cas.

Estadisticas.java
/ *
* Est adi st i cas. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package est adi st i cas;

i mpor t j ava. i o. *;

/ **
* Est e pr ogr ama l ee un ar chi vo t ext o que cont i ene el cdi go f uent e de una
* cl ase de J ava y cuent a el nmer o 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 r esul t ados l os al macena en
* ot r o ar chi vo t ext o.
Tema 8 Entrada / Salida 217
ITSON Manuel Domitsu Kono
*
* @aut hor mdomi t su
*/
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 uct or i ni ci al i za l os at r i but os de l a cl ase e i nvoca a l os
* mt odos que abr en el ar chi 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 amnomAr chi voEnt r ada Nombr e del ar chi vo con el cdi go f uent e en j ava
* @par amnomAr chi voSal i da Nombr e del ar chi vo con l os r esul t ados
* @par ampal abr as l i st a de l as pal abr as r eser 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 ar r egl o donde se al macenar n el nmer o de veces
/ / que apar ecen l as pal abr as r eser vadas
cuent 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 cdi go f uent e
pr ocesaAr chi vo( ) ;

/ / Escr i be l os r esul t ados en un ar chi vo t ext o
escr i beResul t ados( ) ;
}

/ **
* Est e mt odo abr e el ar chi vo con el cdi 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 er edReader buf f er edReader ;
St r i ng l i nea = " " ;

/ / Abr e el ar chi vo con el cdi go f uent e
t r y {
f i l eReader = new Fi l eReader ( nomAr chi voEnt r ada) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
Syst em. out . pr i nt l n( " Er r or : No exi st e el ar chi vo " + nomAr chi voEnt r ada) ;
r et ur n;
}

/ / Se envuel ve el ar chi vo con el cdi go f uent e con un ar chi vo del t i po
/ / Buf f er edReader par a ef i ci ent ar su acceso
218 Entrada / Salida
ITSON Manuel Domitsu Kono
buf f er edReader = new Buf f er edReader ( f i l eReader ) ;

t r y {
whi l e( t r ue) {
/ / Obt n l a si gui ent e l nea del ar chi vo con el cdi go f uent e
l i nea = buf f er edReader . r eadLi ne( ) ;

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

/ / Cuent a y acumul a l as ocur r enci as de cada pal abr a r esevada en l a
/ / l nea
cuent aPal abr asLi nea( l i nea) ;
}
}
cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al pr ocesar el ar chi vo" + nomAr chi voEnt r ada) ;
r et ur n;
}

/ / Ci er r a el ar chi vo
t r y {
buf f er edReader . cl ose( ) ;
f i l eReader . cl ose( ) ;
}
cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al cer r ar el ar chi vo" + nomAr chi voEnt r ada) ;
r et ur n;
}
}

/ **
* Est e mt odo escr i be en un ar chi vo t ext o, l as ocur r enci as de cada pal abr a
* r eser vada en un ar chi vo con cdi go f uent e de J ava
*/
publ i c voi d escr i beResul t ados( ) {
Fi l eWr i t er f i l eWr i 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 ados
t r y {
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) {
Syst em. 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 ur n;
}

/ / Se envuel ve el ar chi 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 acceso
buf 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 ) ) ;

t r y {
buf f er edWr i t er . wr i t e( " Fr ecuenci a de l as pal abr as r eser 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) ;
Tema 8 Entrada / Salida 219
ITSON Manuel Domitsu Kono
buf f er edWr i t er . newLi ne( ) ;
buf f er edWr i t er . newLi ne( ) ;

/ / Par a cada pal abr a r eser vada
f 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 a
buf f er edWr i t er . wr i t e( pal abr as[ i ] + " : " + cuent aPal abr as[ i ] ) ;
/ / Escr i be en el ar chi vo un sal t o de l nea
buf f er edWr i t er . newLi ne( ) ;
}
}
cat ch( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al escr i bi r al ar chi vo" + nomAr chi voSal i da) ;
r et ur n;
}

/ / Ci er r a el ar chi vo
t r y {
buf f er edWr i t er . cl ose( ) ;
f i l eWr i t er . cl ose( ) ;
}
cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al cer r ar el ar chi vo" + nomAr chi voSal i da) ;
r et ur n;
}
}

/ **
* Est e mt odo cuent a l as ocur r enci as de l as pal abr as r eser vadas en l a
* l nea dada por el par met r o y l as acumul a en el ar r egl o cuent aPal abr as
* @par aml 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 r eser vadas
f or ( i nt i = 0; i < pal abr as. l engt h; i ++) {
/ / Cuent a el nmer o de ocur r enci as en l a l nea
cuent aPal abr as[ i ] += cuent aPal abr aLi nea( l i nea, pal abr as[ i ] ) ;
}
}

/ **
* Est e mt odo r egr esa el nmer o de veces que l a pal abr a r eser vada dada por
* el par met r o ocur r e en l a l nea dada por el par met r o
* @par aml i nea L nea en l a que se busca l a pal abr a r eser vada
* @par ampal abr a Pal abr a r eser vada a buscar
* @r et ur n Nmer o de veces que l a pal abr a r eser 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 pos
pos = l i nea. i ndexOf ( pal abr a, pos) ;

220 Entrada / Salida
ITSON Manuel Domitsu Kono

/ / Si l a pal abr a no exi st e, t er mi na
i f ( pos <= - 1) r et ur n n;

/ / I ncr ement a el nmer o de ocur r enci as
n++;

/ / Se pr epar a par a cont i nuar l a bsqueda a par t i r de l a l t i ma
/ / ocur r enci a
pos += pal abr a. l engt h( ) ;
}
}
}

PruebaEstadisticas.java
/ *
* PuebaEst adi st i cas. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package est adi st i cas;

/ **
* Est a cl ase si r ve par a pr obar l a cl ase Est ad st i cas que l ee un ar chi vo
* t ext o que cont i ene el cdi go f uent e de una cl ase de J ava y cuent a el
* nmer o 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 r esul t ados l os al macena en ot r o ar chi vo t ext o.
*
* @aut hor mdomi t su
*/
*/
publ i c cl ass PuebaEst adi st i cas {

/ **
* Mt odo mai n( ) . I nvoca a l os mt odos de l a cl ase Est adi st i cas
* @par amar gs Ar gument os en l a l nea de comando
*/
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
PuebaEst adi st i cas puebaEst adi st i cas1 = new PuebaEst adi st i cas( ) ;
St r i ng pal abr asReser vadas[ ] = {" i f " , " swi t ch" , " whi l e" , " f or " , " do" };

/ / Cr ea un obj et o del t i po Est adi st i cas y l e pasa l os nombr es de l os
/ / ar chi vos con el cdi go f uent e, l os r esul t ados y l a l i st a de pal abr as
/ / r eser vadas a buscar
Est adi st i cas est adi st i cas =
new Est adi st i cas( " sr c\ \ est adi st i cas\ \ Est adi st i cas. j ava" ,
" est adi st i cas. t xt " , pal abr asReser vadas) ;
}
}
Al ejecutar el programa sobre la clase Estadisticas, tendremos el siguiente resultado:



Tema 8 Entrada / Salida 221
ITSON Manuel Domitsu Kono
Fr ecuenci a de l as pal abr as r eser vadas
en l a cl ase: sr c\ est adi st i cas\ Est adi st i cas. j ava

i f : 3
swi t ch: 0
whi l e: 3
f or : 3
do: 0
Archivos de Acceso Secuencial de Bytes
En este caso, accederemos a los datos del archivo en forma secuencial y los datos del
archivo sern interpretados por el programa como bytes. En la figura 8.2 se muestra un
diagrama parcial de las interfaces y clases que podemos utilizar en este tipo de
problemas.


8.2 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 mtodos
para leer bytes de un flujo binario y convertirlos a datos de los tipos primitivos.

Los mtodos declarados por esta interfaz se muestran en la tabla 8.13:






222 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.13 Mtodos de la Interfaz DataInput.
void readFully(byte[] b) throws IOException

Lee algunos bytes del archivo y los almacena en el arreglo b. El nmero de bytes ledos es igual
al tamao del arreglo b.

Parmetro:
b - El arreglo en el que se almacenan los bytes ledos.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo 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 posicin of f .

Parmetros:
b - El arreglo en el que se almacenan los bytes ledos.
off Un entero indicando el desplazamiento a partir del inicio del arreglo en que se
almacenarn los datos.
len - Un entero indicando el nmero de bytes a leer.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo 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 ndexOut Of BoundsExcept i on Si of f o l en es negativo o si of f +l en es mayor que la
longitud 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.
Este mtodo se emplea para leer el booleano escrito por el mtodo wr i t eBool ean( ) de la
interfaz Dat aOut put .

Regresa:
El valor booleano ledo.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo todos sus bytes.
I OExcept i on Si ocurre un error de entrada/salida.
char readChar()IOException

Lee y regresa un carcter Unicode de la entrada. Este mtodo se emplea para leer el carcter
Unicode escrito por el mtodo wr i t eChar ( ) de la interfaz Dat aOut put .

Regresa:
El char Unicode ledo.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo todos sus bytes.
I OExcept i on Si ocurre un error de entrada/salida.
Tema 8 Entrada / Salida 223
ITSON Manuel Domitsu Kono
Tabla 8.13 Mtodos de la Interfaz DataInput. Cont.
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 mtodo se emplea para leer el byte escrito por el mtodo
wr i t eByt e( ) de la interfaz Dat aOut put .

Regresa:
El valor de 8 bits ledo.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo todos sus bytes.
I OExcept i on Si ocurre un error de entrada/salida.
int readUnsignedByte()IOException

Lee byte de la entrada y lo regresa como un i nt en el rango de 0 a 255. Este mtodo se emplea
para leer el byte escrito por el mtodo wr i t eByt e( ) de la interfaz Dat aOut put si el argumento
del mtodo representaba un valor en el rango de 0 a 255.

Regresa:
El valor de 8 bits ledo como un nmero no signado.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo todos sus bytes.
I OExcept i on Si ocurre un error de entrada/salida.
short readShort( ) IOException

Lee dos bytes de la entrada y los regresa como un entero corto. Este mtodo se emplea para
leer el entero corto escrito por el mtodo wr i t eShor t ( ) de la interfaz Dat aOut put .

Regresa:
El valor de 16 bits ledo.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo todos sus bytes.
I OExcept i on Si ocurre un error de entrada/salida.
int readUnsignedShort()IOException

Lee dos bytes de la entrada y lo regresa como un entero en el rango de 0 a 65535. Este mtodo
se emplea para leer el entero corto escrito por el mtodo wr i t eShor t ( ) de la interfaz
Dat aOut put si el argumento del mtodo representaba un valor en el rango de 0 a 65535.

Regresa:
El entero ledo como un nmero no signado.

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




224 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.13 Mtodos de la Interfaz DataInput. Cont
int readInt()IOException

Lee cuatro bytes de la entrada y los regresa como un entero. Este mtodo se emplea para leer el
entero escrito por el mtodo wr i t eI nt ( ) de la interfaz Dat aOut put .

Regresa:
El entero ledo.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo todos sus bytes.
I OExcept i on Si ocurre un error de entrada/salida.
long readLong( ) IOException

Lee ocho bytes de la entrada y los regresa como un entero largo. Este mtodo se emplea para
leer el entero largo escrito por el mtodo wr i t eLong( ) de la interfaz Dat aOut put .

Regresa:
El entero largo ledo.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo todos sus bytes.
I OExcept i on Si ocurre un error de entrada/salida.
float readFloat()IOException

Lee cuatro bytes de la entrada y los regresa como un flotante. Este mtodo se emplea para leer
el flotante escrito por el mtodo wr i t eFl oat ( ) de la interfaz Dat aOut put .

Regresa:
El flotante ledo.

Lanza:
EOFExcept i on Si se llega al final del archivo sin haber ledo todos sus bytes.
I OExcept i on Si ocurre un error de entrada/salida.
double readDouble()IOException

Lee ocho bytes de la entrada y los regresa como un doble. Este mtodo se emplea para leer el
doble escrito por el mtodo wr i t eDoubl e( ) de la interfaz Dat aOut put .

Regresa:
El doble ledo.

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







Tema 8 Entrada / Salida 225
ITSON Manuel Domitsu Kono
Tabla 8.13 Mtodos de la Interfaz DataInput. Cont
int skipBytes(int n) IOException

Intenta leer y descartar n bytes de datos del archivo de entrada. Puede leer y descartar menos
bytes si se llega antes al final del archivo. El mtodo regresa el nmero de bytes ledos y
descartados.

Parmetros:
n - El nmero de bytes a leer y descartar.

Regresa:
El nmero de bytes ledos y descartados.

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

La interfaz Dat aOut put se encuentra en el paquete j ava. i o y provee
mtodos para convertir datos de los tipos primitivos a bytes y escribirlos a un
flujo binario.

Los mtodos declarados por esta interfaz se muestran en la tabla 8.14:

Tabla 8.14 Mtodos de la Interfaz DataOutput.
void write(int b)

Escribe al flujo de bytes el byte dado por el parmetro.

Parmetro:
b Contiene el carcter a escribir en el flujo de bytes.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
void write(byte[] b)

Escribe al flujo de bytes, todos los bytes del arreglo b.

Parmetro:
b - El arreglo de bytes a escribir en el flujo de bytes.

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








226 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.14 Mtodos de la Interfaz DataOutput. Cont.
void write(byte[] b, int off, int len)

Escribe l en bytes al flujo de bytes, del arreglo b a partir de la posicin of f .

Parmetros:
b - El arreglo del que se escribirn los bytes.
off Un entero indicando el desplazamiento a partir del inicio del arreglo del que se escribirn
los datos.
len - Un entero indicando el nmero de bytes a escribir.

Lanza:
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 ndexOut Of BoundsExcept i on Si of f o l en es negativo o si of f +l en es mayor que la
longitud del arreglo b.
void writeBoolean(boolean v)

Escribe al flujo de bytes el valor booleano de v, Si v es verdadero se escribe un 1, 0 en caso
contrario.

Parmetro:
v - El valor booleano a escribirse.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
void writeByte(int v)

Escribe al flujo de bytes un byte.

Parmetro:
v - El byte a escribirse.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
voi d writeChar( i nt v)

Escribe al flujo de bytes un carcter.

Parmetro:
v - El char a escribirse.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
void writeShort( i nt v)

Escribe al flujo de bytes un entero corto.

Parmetro:
v - El entero corto a escribirse.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
Tema 8 Entrada / Salida 227
ITSON Manuel Domitsu Kono
Tabla 8.14 Mtodos de la Interfaz DataOutput. Cont.
voi d writeInt( i nt v)

Escribe al flujo de bytes un entero.

Parmetro:
v - El entero a escribirse.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
voi d writeLong( l ong v)

Escribe al flujo de bytes un entero largo.

Parmetro:
v - El entero largo a escribirse.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
voi d writeFloat( f l oat v)

Escribe al flujo de bytes un flotante.

Parmetro:
v - El flotante a escribirse.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
voi d writeDouble( doubl e v)

Escribe al flujo de bytes un doble.

Parmetro:
v - El doble a escribirse.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
void writeBytes( St r i ng s)

Escribe al flujo de bytes una cadena. Por cada carcter de la cadena se escribe un byte.

Parmetro:
s La cadena a escribirse.

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





228 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.14 Mtodos de la Interfaz DataOutput. Cont.
void writeChars( St r i ng s)

Escribe al flujo de bytes una cadena. Por cada carcter de la cadena se escribe un caracter.

Parmetro:
s La cadena a escribirse.

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

La clase abstracta InputStream es la superclase de odas las clases usadas
para leer de flujos de bytes. Los mtodos de esta clase se muestran en la tabla
8.15.

Tabla 8.15 Mtodos de la clase InputStream.
InputStream()

Crea un flujo de bytes de entrada.
int available()throws IOException

Regresa el nmero que pueden leerse (o leers ey descartarse) del flujo de entrada sin que el flujo se
bloque en la siguiente invocacin de un mtodo de este flujo.

Regresa:
Nmero que pueden leerse (o leers ey descartarse) del flujo de entrada sin que el flujo se bloque.

Lanza:
I OExcept i on Si el flujo no sopota el mtodo mar k( ) u ocurre un error de entrada/salida
void mark(int readLimit)

Marca la posicin actual en el archivo. Las siguientes llamadas al mtodo r eset ( ) posicionaran
al archivo en este punto.

Parmetros:
readLimit. Lmite de caracteres que pueden leerse mientras se preserva la marca. Despus de
leerse este nmero de caracteres, intentar reestablecer el flujo puede fallar.
boolean markSupported()

Establece si el flujo soporta la operacin mar k( ) .

Regresa:
t r ue si y slo si el flujo soporta la operacin mar k( ) .







Tema 8 Entrada / Salida 229
ITSON Manuel Domitsu Kono
Tabla 8.15 Mtodos de la clase InputStream. Cont.
abstract int read() throws IOException

Lee el siguiente byte del flujo de entrada. El mtodo se bloquea hasta que haya un carcter,
ocurra un error de entrada/salida o se llegue al final del flujo

Regresa:
El byte ledo como un entero en el rango de 0 a 2555 o -1 si se ha alcanzado el final del flujo.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida
int read(byte[] b) throws IOException

Lee algunos bytes y los almacena en el arreglo b.

Parmetro:
b: Arreglo en el que se almacenarn los bytes.

Regresa:
El nmero de caracteres ledos o -1 si se ha alcanzado el final del flujo..

Lanza:
I OExcept i on Si ocurre un error de entrada/salida
Nul l Poi nt er Except i on Si b es nulo.
int read(byte[] b, int off, int len) throws IOException

Lee hasta len bytes en un arreglo.

Parmetro:
b: Arreglo en el que se almacenarn los bytes.
off: ndice en el arreglo del lugar en la que se empezarn a guardar los bytes.
len: Mximo nmero de caracteres a leer.

Regresa:
El nmero de caracteres ledos o -1 si se ha alcanzado el final del flujo..

Lanza:
I OExcept i on Si ocurre un error de entrada/salida
I ndexOut Of BoundsExcept i on - Si off o len son negativos, off + len > b. l engt h( )
Nul l Poi nt er Except i on Si b es nulo.
void reset() throws IOException

Restablece el flujo. Si el flujo se ha marcado se intenta reposicionar en la marca. No todos los
flujos de entrada de caracteres soportan esta operacin.

Lanza:
I OExcept i on Si el flujo no se ha marcado, si la marca se ha invalidado.






230 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.15 Mtodos de la clase InputStream. Cont.
long skip(long n) throws IOException

Lee y descarta n bytes. Este mtodo se bloquear hasta que haya varios caracteres, ocurra un
error de entrada/salida o se llegue al final del flujo

Parmetro:
n: Nmero de caracteres a leer y descartar.

Regresa:
El nmero de caracteres a ledos y descartados.

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

La clase Fi l eI nput St r eampermite leer archivos de bytes.

El constructor de esta clase se muestra en la tabla 8.16.

Tabla 8.16 Constructor de la clase FileInputStream.
FileInputStream(String fileName) t hr ows Fi l eNot FoundExcept i on

Crea un flujo del tipo Fi l eI nput St r eam.

Parmetro:
fileName: Nombre del archivo a abrir para lectura.

Lanza:
Fi l eNot FoundExcept i on - Si el archivo no existe, si el nombre es un directorio en lugar de un
archivo o por si alguna otra razn no se puede abrir el archivo para lectura.

La clase Fi l t er I nput St r eamcontiene a otro flujo de entrada, al que utiliza
como su nica fuente de datos, posiblemente transformando los datos o
agregndoles alguna funcionalidad adicional.

El constructor de esta clase se muestra en la tabla 8.17.

Tabla 8.17 Constructor de la clase FilterInputStream.
FilterInputStream(InputStream in)

Crea un flujo del tipo FilterI nput St r eamReader .

Parmetro:
in: Un flujo de entrada de tipo I nput St r eam.

La clase Dat aI nput St r eampermite leer tipos de datos primitivos de J ava del
flujo de entrada, implementando la interfaz Dat aI nput .

El constructor de esta clase se muestra en la tabla 8.18.

Tema 8 Entrada / Salida 231
ITSON Manuel Domitsu Kono
Tabla 8.18 Constructor de la clase DataInputStream.
DataInputStream(InputStream in) t hr ows Fi l eNot FoundExcept i on

Crea un flujo del tipo Dat aI nput St r eamReader .

Parmetro:
in: Un flujo de entrada de tipo I nput St r eam.

La clase abstracta Out put St r eames la superclase de todas las clases para
escribir a flujos de bytes. Los mtodos de esta clase se muestran en la tabla
8.19.

Tabla 8.19 Mtodos de la clase OutputStream.
OutputStream()

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

Escribe un solo carcter al flujo de bytes de salida.

Parmetro:
c - Caracter a escribir.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
void Write(byte[] b) t hr ows I OExcept i on

Escribe b.length bytes del arreglo de bytes b al flujo de bytes de salida.

Parmetro:
b - Arreglo de bytes a escribir.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
abstract void Write(byte[] b, int off, int len) t hr ows I OExcept i on

Escribe l en bytes bytes del arreglo de bytes b a partir de la posicin of f , al flujo de bytes de
salida.

Parmetros:
cbuf - Arreglo de bytes con la porcin de bytes a escribir.
off - ndice de la posicin en el arreglo a partir de la cual se escribir.
len - Nmero de caracteres a escribir.

Lanza:
I OExcept i on Si ocurre un error de entrada/salida.
I ndexOut Of BoundsExcept i on - Si off o len son negativos, off + len > b. l engt h( )
Nul l Poi nt er Except i on Si b es nulo.

La clase Fi l eOut put St r eampermite escribir a archivos de bytes.

Los constructores de esta clase se muestran en la tabla 8.20.
232 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.20 Constructores de la clase FileOutputStream.
FileOutputStream(String fileName) t hr ows I OExcept i on

Crea un flujo del tipo Fi l eOut put St r eam.

Parmetro:
fileName: Nombre del archivo a abrir para escritura.

Lanza:
I OExcept i on - Si el archivo no existe y no puede ser escrito, si el nombre es un directorio en
lugar de un archivo o por si alguna otra razn no se puede abrir el archivo para escritura.
FileOutputStream(String filename, boolean append) throws IOException

Crea un flujo del tipo Fi l eOut put St r eamcon append indicando si los datos a escribir se
agregan al final del archive o no..

Parmetro:
filename: Nombre del archivo a abrir para escritura.

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

La clase Fi l t er Out put St r eames la superclase de todas las clases que filtran
flujos de salida. Estos flujos envuelven a un flujo de salida existente y lo utiliza
como su sumidero bsico de bytes, posiblemente transformando los datos o
agregndoles alguna funcionalidad adicional.

El constructor de esta clase se muestra en la tabla 8.21.

Tabla 8.21 Constructor de la clase FilterOutputStream.
FilterOutputStream(OutputStream out)

Crea un flujo del tipo Fi l t er Out put St r eamWr i t er .

Parmetro:
out: Un flujo de entrada de tipo OutputStream.

La clase Dat aOut put St r eampermite que una aplicacin escriba datos de tipos
primitivos de J ava a un flujo de salida.

Los mtodos de esta clase se muestran en la tabla 8.22.

Tabla 8.22 Mtodos de la clase DataOutputStream.
Dat aOut put St r eam(OutputStream out)

Crea un flujo de salida de datos para escribir datos a un flujo de salida.

Parmetro:
out: Flujo de salida al que envuelve.

Tema 8 Entrada / Salida 233
ITSON Manuel Domitsu Kono
Tabla 8.22 Mtodos de la clase DataOutputStream. Cont.
f i nal i nt si ze( )

Regresa el nmero de bytes escritos al flujo de salida.

Regresa:
Nmero de bytes escritos al flujo de salida.

La clase Pr i nt St r eampemite escribir la representacin de varios tipos de
datos a otros flujos de salida. Si un error ocurre se invoca al mtodo interno
set Er r or ( ) que establece a true el valor de una bandera interna que puede
ser probada mediante el mtodo checker r or ( ) .

Los mtodos de esta clase se muestran en la tabla 8.23.

Tabla 8.23 Mtodos de la clase PrintStream.
Pr i nt St r eam(OutputStream out)

Crea un flujo de salida nuevo.

Parmetro:
out: Flujo de salida al que envuelve.
Pr i nt St r eam(String fileName) throws FileNotFoundException

Crea un flujo de salida nuevo con el nombre de archivo dado. Si el archivo existe su longitud se
trunca a cero.

Parmetro:
filename: nombre de archivo.

Lanza:
Fi l eNot FoundExcept i on Si no se puede crear el archivo.
bool ean checkEr r or ( )

Vaca el buffer de entrada del flujo y verifica el estado de error. El estado de error interno se
establece a verdadero cuando el flujo lanza una excepcin del tipo I OExcept i on excepto la
excepcin I nt er r upt edI OExcept i on, y cuando se invoca el mtodo set Er r or ( ) .

Regresa:
True si y slo s el flujo lanza una excepcin del tipo I OExcept i on excepto la excepcin
I nt er r upt edI OExcept i on, y cuando se invoca el mtodo set Er r or ( ) .









234 Entrada / Salida
ITSON Manuel Domitsu Kono
Tabla 8.23 Mtodos de la clase PrintStream.
print(boolean b)
print(char c)
print(int i)
print(long l)
print(float f)
print(double d)
print(Object obj)
print(char[] s)
print(String s)

Estos mtodos escriben al flujo de salida, las representaciones de un byte, un caracter, un
entero, un entero largo, un flotante, un doble, un objeto, arreglo de caracteres o una cadena,
respectivamente.

Parmetro:
La representacin del valor a escribirse.
println()
println(boolean b)
println(char c)
println(char[] s)
println(double d)
println(float f)
println(int i)
println(long l)
println(Object obj)
println(String s)

Estos mtodos escriben al flujo de salida, un separador de lnea, las representaciones de un
byte, un caracter, un entero, un entero largo, un flotante, un doble, un objeto, arreglo de
caracteres o una cadena, respectivamente, seguidas de un separador de lnea.

Parmetro:
La representacin del valor a escribirse.
Ejemplos de Archivos de Bytes de Acceso Secuencial

1. Se desea un programa que calcule como un capital inicial depositado se va
acumulando para un cierto nmero de meses y un cierto nmero de tasas de
inters, con recapitalizacin mensual. Los valores del capital inicial, nmero de
meses, tasas de inters y los capitales calculados se almacenarn en un archivo
secuencial.

El programa consiste de dos clases: Capi t al es y Pr uebaCapi t al es. La
clase Capi t al es contiene mtodos para calcular los capitales acumulados para
los diferentes meses y tasas, crear el archivo para guardar los resultados y
escribir los resultados en el archivo. La clase Pr uebaCapi t al es slo sirve para
probar los mtodos de la clase Capi t al es.



Tema 8 Entrada / Salida 235
ITSON Manuel Domitsu Kono
Capitales.java
/ *
* Capi t al es. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package capi t al ;
i mpor t j ava. i o. *;

/ **
* Est a cl ase cal cul a y al macena en un ar chi vo l os capi t al es acumul ados
* que pr oduce un capi t al i ni ci al deposi t ado a di f er ent es t asas de i nt er es
* y con r ecapi t al i zaci n mensual .
*
* @aut hor mdomi t su
*/
publ i c cl ass Capi t al es {
doubl e capi t al I ni ci al ;
i nt meses;
doubl e t asas[ ] ;
doubl e capi t al es[ ] [ ] ;
St r i ng nomAr chi vo;

/ **
* Est e const r uct or i ni ci al i za l os at r i but os de l a cl ase e i nvoca
* a l os mt odos que cal cul a l os capi t al es y l os guar dan en un ar chi vo
* @par amcapi t al I ni ci al Capi t al i ni ci al deposi t ado
* @par ammeses Nmer o de meses deposi t ados
* @par amt asas Ar r egl o con l as di f er ent es t asas de i nt er es a usar se en l os
* cl cul os
* @par amnomAr chi vo Nombr e del ar chvo en el que se al macenar n l os
* r esul t ados
*/
publ i c Capi t al es( doubl e capi t al I ni ci al , i nt meses, doubl e t asas[ ] ,
St r i ng nomAr chi vo) {
t hi s. capi t al I ni ci al = capi t al I ni ci al ;
t hi s. meses = meses;
t hi s. t asas = t asas;
t hi s. nomAr chi vo = nomAr chi vo;

/ / Cr ea el ar r egl o en el que se al macenar n l os capi t al es cal cul ados
capi t al es = new doubl e[ meses+1] [ t asas. l engt h] ;

/ / Cal cul a l os capi t al es
cal cul aCapi t al es( ) ;

/ / Al macena en el ar r egl o l os capi t al es
guar daCapi t al es( ) ;
}

/ **
* Est e mt odo cal cul a y al macena en un ar r egl o l os capi t al es acumul ados
* que pr oduce un capi t al i ni ci al deposi t ado a di f er ent es t asas de i nt er es
* y con r ecapi t al i zaci n mensual
*/
236 Entrada / Salida
ITSON Manuel Domitsu Kono
publ i c voi d cal cul aCapi t al es( ) {
/ / I ni ci al i za l os capi t al es del mes 0 al val or del capi t al i ni ci al
f or ( i nt j = 0; j < t asas. l engt h; j ++) capi t al es[ 0] [ j ] = capi t al I ni ci al ;

/ / Par a cada uno de l os meses
f or ( i nt i = 1; i <= meses; i ++)
/ / Par a cada una de l as t asas de i nt er es
f or ( i nt j = 0; j < t asas. l engt h; j ++) {
/ / Cal cul a el capi t al acumul ado a par t i r del capi t al del mes ant er i or
capi t al es[ i ] [ j ] = capi t al es[ i - 1] [ j ] * ( 1 + t asas[ j ] / 12) ;
}
}

/ **
* Al macena l os capi t al es en un ar chi vo
*/
publ i c voi d guar daCapi t al es( ) {
Fi l eOut put St r eamf i l eOut put St r eam= nul l ;
Dat aOut put St r eamdat aOut put St r eam;

/ / Abr e el ar chi vo donde se escr i bi r n l os r esul t ados
t r y {
f i l eOut put St r eam= new Fi l eOut put St r eam( nomAr chi vo) ;
}
cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or , no se pudo cr ear el ar chi vo" +
nomAr chi vo) ;
r et ur n;
}

/ / Se envuel ve el ar chi vo donde se escr i bi r n l os r esul t ados con un
/ / ar chi vo del t i po Dat aOut put St r eampar a escr i bi r val or es de dat os de
/ / t i pos pr i mi t i vos
dat aOut put St r eam= new Dat aOut put St r eam( f i l eOut put St r eam) ;

t r y {
/ / Escr i be el capi t al i ni ci al
dat aOut put St r eam. wr i t eDoubl e( capi t al I ni ci al ) ;

/ / Escr i be el nmer o de meses
dat aOut put St r eam. wr i t eI nt ( meses) ;

/ / Escr i be el nmer o de t asas de i nt er s
dat aOut put St r eam. wr i t eI nt ( t asas. l engt h) ;

/ / Escr i be l as t asas de i nt er s
f or ( i nt i = 0; i < t asas. l engt h; i ++)
dat aOut put St r eam. wr i t eDoubl e( t asas[ i ] ) ;

/ / Par a cada mes
f or ( i nt i = 1; i <= meses; i ++)
/ / Par a cada t asa de i nt er es
f or ( i nt j = 0; j < t asas. l engt h; j ++)
/ / Escr i be el capi t al acumul ado
dat aOut put St r eam. wr i t eDoubl e( capi t al es[ i ] [ j ] ) ;
}
cat ch( I OExcept i on i oe) {
Tema 8 Entrada / Salida 237
ITSON Manuel Domitsu Kono
Syst em. out . pr i nt l n( " Er r or al escr i bi r al ar chi vo" + nomAr chi vo) ;
r et ur n;
}

/ / Ci er r a el ar chi vo
t r y {
dat aOut put St r eam. cl ose( ) ;
f i l eOut put St r eam. cl ose( ) ;
}
cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al cer r ar el ar chi vo" + nomAr chi vo) ;
r et ur n;
}
}

publ i c voi d t abul aCapi t al es( ) {
Syst em. out . pr i nt l n( " Tasas" ) ;
Syst em. out . pr i nt ( " Meses " ) ;
f or ( i nt j = 0; j < t asas. l engt h; j ++)
Syst em. out . pr i nt ( " " + t asas[ j ] ) ;
Syst em. out . pr i nt l n( ) ;

f or ( i nt i = 1; i <= meses; i ++) {
Syst em. out . pr i nt ( " " + i ) ;
f or ( i nt j = 0; j < t asas. l engt h; j ++) {
Syst em. out . pr i nt ( " " + capi t al es[ i ] [ j ] ) ;
}
Syst em. out . pr i nt l n( ) ;
}
}
}

PruebaCapitales.java
/ *
* Pr uebaCapi t al es. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package capi t al ;

/ **
* Est a cl ase si r ve par a pr obar l a cl ase Capi t al es que cal cul a y al macena
* en un ar chi vo l os capi t al es acumul ados que pr oduce un capi t al i ni ci al
* deposi t ado a di f er ent es t asas de i nt er es y con r ecapi t al i zaci n mensual .
*
* @aut hor mdomi t su
*/
publ i c cl ass Pr uebaCapi t al es {
/ **
* Mt odo mai n( ) . I nvoca a l os mt odos de l a cl ase Capi t al es
* @par amar gs Ar gument os en l a l nea de comando
*/
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Pr uebaCapi t al es pr uebaCapi t al es1 = new Pr uebaCapi t al es( ) ;

238 Entrada / Salida
ITSON Manuel Domitsu Kono
/ / Ar r egl o con l as t asas de i nt er s a usar
doubl e t asas[ ] = {0. 1, 0. 15, 0. 2};

/ / Cr ea un obj et o del t i po Capi t al es y l e pasa el capi t al i ni ci al ,
/ / el nmer o de meses a t abul ar , el ar r egl o con l as t asas de i nt er s
/ / y el nombr e del ar chi vo en el que se guar dar n l os r esul t ados
Capi t al es capi t al es = new Capi t al es( 100. 0, 20, t asas, " capi t al es. dat " ) ;
}
}

2. Se desea un programa que lea los capitales almacenados en el archivo del
ejemplo anterior y los tabule.

El programa consiste de dos clases: Tabul aCapi t al es y
Pr uebaTabul aCapi t al es. La clase Tabul aCapi t al es contiene mtodos
para leer los capitales acumulados para los diferentes meses y tasas del archivo
y para tabular los resultados. La clase Pr uebaTabul aCapi t al es slo sirve
para probar los mtodos de la clase Tabul aCapi t al es.

TabulaCapitales.java
/ *
* TabulaCapi t al es. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package capi t al ;

i mpor t j ava. i o. *;
i mpor t j ava. t ext . Deci mal For mat ;

/ **
* Est a cl ase l ee de un ar chi vo l os capi t al es acumul ados que pr oduce
* un capi t al i ni ci al deposi t ado a di f er ent es t asas de i nt er es
* y con r ecapi t al i zaci n mensual y l os t abul a.
*
* @aut hor mdomi t su
*/
publ i c cl ass Tabul aCapi t al es {
St r i ng nomAr chi vo;
doubl e capi t al I ni ci al ;
i nt meses;
doubl e t asas[ ] ;
doubl e capi t al es[ ] [ ] ;

/ **
* Est e const r uct or i ni ci al i za l os at r i but os de l a cl ase e i nvoca
* a l os mt odos que l ee l os capi t al es y l os t abul a
* @par amnomAr chi vo Nombr e del ar chi vo con l os capi t al es
*/
publ i c Tabul aCapi t al es( St r i ng nomAr chi vo) {
t hi s. nomAr chi vo = nomAr chi vo;

/ / l ee l os capi t al es del ar chi vo
Tema 8 Entrada / Salida 239
ITSON Manuel Domitsu Kono
l eeCapi t al es( ) ;

/ / Tabul a l os capi t al es
t abul aCapi t al es( ) ;
}

/ **
* Est e mt odo l ee l os capi t al es de un ar chi vo
*/
publ i c voi d l eeCapi t al es( ) {
Fi l eI nput St r eamf i l eI nput St r eam= nul l ;
Dat aI nput St r eamdat aI nput St r eam;
i nt numTasas;

/ / Abr e el ar chi vo con l os capi t al es
t r y {
f i l eI nput St r eam= new Fi l eI nput St r eam( nomAr chi vo) ;
}
cat ch ( Fi l eNot FoundExcept i on f nf e) {
Syst em. out . pr i nt l n( " Er r or : No exi st e el ar chi vo " + nomAr chi vo) ;
r et ur n;
}

/ / Se envuel ve el ar chi vo con l os capi t al es con un ar chi vo del t i po
/ / Dat aI nput St r eampar a l eer val or es de t i pos de dat os pr i mi t i vos
dat aI nput St r eam= new Dat aI nput St r eam( f i l eI nput St r eam) ;

t r y {
/ / Lee el capi t al i ni ci al
capi t al I ni ci al = dat aI nput St r eam. r eadDoubl e( ) ;

/ / Lee el nmer o de meses
meses = dat aI nput St r eam. r eadI nt ( ) ;

/ / Lee el nmer o de t asas de i nt er s
numTasas = dat aI nput St r eam. r eadI nt ( ) ;

/ / Cr ea el ar r egl o par a al macenar l as t asas de i nt er es
t asas = new doubl e[ numTasas] ;

/ / Cr ea el ar r egl o par a al macenar l os capi t al es
capi t al es = new doubl e[ meses] [ numTasas] ;

/ / Lee l as t asas de i nt er s
f or ( i nt i = 0; i < numTasas; i ++)
t asas[ i ] = dat aI nput St r eam. r eadDoubl e( ) ;

/ / Lee l os capi t al es
/ / Par a cada mes
f or ( i nt i = 0; i < meses; i ++)
/ / Par a cada t asa de i nt er es
f or ( i nt j = 0; j < t asas. l engt h; j ++)
/ / Lee el capi t al acumul ado
capi t al es[ i ] [ j ] = dat aI nput St r eam. r eadDoubl e( ) ;
}
cat ch( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al l eer del ar chi vo" + nomAr chi vo) ;
240 Entrada / Salida
ITSON Manuel Domitsu Kono
r et ur n;
}

/ / Ci er r a el ar chi vo
t r y {
dat aI nput St r eam. cl ose( ) ;
f i l eI nput St r eam. cl ose( ) ;
}
cat ch ( I OExcept i on i oe) {
Syst em. out . pr i nt l n( " Er r or al cer r ar el ar chi vo" + nomAr chi vo) ;
r et ur n;
}
}

/ **
* Est e modo t abul a l os capi t al es
*/
publ i c voi d t abul aCapi t al es( ) {
/ / For mat e par a escr i bi r l os meses
Deci mal For mat t r esDi gi t os = new Deci mal For mat ( " 000" ) ;

/ / For mat o par a escr i bi r l os capi t al es
Deci mal For mat dosDeci mal es = new Deci mal For mat ( " #, ##0. 00" ) ;

/ / Escr i be el encabezado de l a t abl a
Syst em. out . pr i nt l n( " Tasas" ) ;
Syst em. out . pr i nt ( " Meses" ) ;
f or ( i nt j = 0; j < t asas. l engt h; j ++)
Syst em. out . pr i nt ( " " + dosDeci mal es. f or mat ( t asas[ j ] ) ) ;
Syst em. out . pr i nt l n( ) ;

/ / Escr i be l os r engl ones de l a t abl a
f or ( i nt i = 0; i < meses; i ++) {
/ / Escr i be el mes
Syst em. out . pr i nt ( " " + t r esDi gi t os. f or mat ( i +1) ) ;

/ / Escr i be l os capi t al es de ese mes
f or ( i nt j = 0; j < t asas. l engt h; j ++) {
Syst em. out . pr i nt ( " " + dosDeci mal es. f or mat ( capi t al es[ i ] [ j ] ) ) ;
}
Syst em. out . pr i nt l n( ) ;
}
}
}

PruebaTabulaCapitales.java
/ *
* Pr uebaTabulaCapi t al es. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package capi t al ;

/ **
* Est a cl ase si r ve par a pr obar l a cl ase Tabul aCapi t al es l ee
Tema 8 Entrada / Salida 241
ITSON Manuel Domitsu Kono
* de un ar chi vo l os capi t al es acumul ados que pr oduce un capi t al i ni ci al
* deposi t ado a di f er ent es t asas de i nt er es y con r ecapi t al i zaci n mensual
* y l os t abul a
*
* @aut hor Manuel Domi t su Kono
*/
publ i c cl ass Pr uebaTabul aCapi t al es {

/ **
* Mt odo mai n( ) . I nvoca a l os mt odos de l a cl ase Tabul aCapi t al es
* @par amar gs Ar gument os en l a l nea de comando
*/
publ i c st at i c voi d mai n( St r i ng[ ] ar gs) {
Pr uebaTabul aCapi t al es pr uebaTabul aCapi t al es1 =
new Pr uebaTabul aCapi t al es( ) ;

/ / Cr ea un obj et o del t i po Tabul aCapi t al es y l e pasa el nombr e del
/ / ar chi vo en el que est n guar dados l os r esul t ados
Tabul aCapi t al es t abul aCapi t al es = new Tabul aCapi t al es( " capi t al es. dat " ) ;
}
}

La corrida del programa anterior se muestra a continuacin:

Tasas
Meses 0. 10 0. 15 0. 20
001 100. 83 101. 25 101. 67
002 101. 67 102. 52 103. 36
003 102. 52 103. 80 105. 08
004 103. 38 105. 09 106. 84
005 104. 24 106. 41 108. 62
. . .
Archivos de Acceso Aleatorio

En este caso, accederemos a los datos del archivo en forma aleatorial y los datos del
archivo sern interpretados por el programa como bytes. Por acceso aleatorio
entendemos que podemos posicionarnos en cualquier lugar del archivo en forma
directa sin tener que leer y descartar los bytes anteriores del archivo. En la figura 8.3 se
muestra un diagrama parcial de las interfaces y clases que podemos utilizar en este
tipo de problemas.

Si el archivo se crea en el modo de lectura/escritura, las operaciones de
escritura tambin estn disponibles; las operaciones de escritura escriben bytes
a partir del apuntador de archivo y adelantan ese apuntador de archivo para que
apunten al siguiente byte despus del ltimo byte escrito. Las operaciones que
escriben ms all del fin actual del archivo extendiendo el tamao del archivo. El
valor del apuntador de archivo puede leerse mediante el mtodo
get Fi l ePoi nt er ( ) y establecerse mediante el mtodo seek( ) .
242 Entrada / Salida
ITSON Manuel Domitsu Kono

8.3 Interfaces y Clases para Archivos de Acceso Aleatorio

Los mtodos de esta clase se muestran en la tabla 8.24.

Tabla 8.24 Mtodos de la clase RandomAccessFile.
RandomAccessFile(String fileName, String mode) throws FileNotFoundException

Crea un flujo para un archivo de acceso aleatorio con el nombre de archivo y modo de acceso
dados. Los valores permitidos para el mtodo de acceso son:

o " r " Abre el archivo para lectura solamente.
o " r w" Abre el archivo para lectura y escritura. Si el archivo no existe se intenta crear
uno.

Parmetros:
fileName Nombre del archivo a abrirse o crearse.
mode Modo de apertura.

Lanza:
Fi l eNot FoundExcept i on Si el modo de apertura es "r" y el nombre de archivo no
corresponde a un archivo regular. Si el modo de apertura es " r w" y el nombre de archivo no
corresponde a un archivo escribible existente y no puede crearse uno nuevo o si ocurre un error
de entrada/salida.
I l l egal Ar gument Except i on Si el modo de acceso no corresponde a ningulo de los
modos vlidos.
long getFilePointer()throws IOException

Regresa el valor actual del apuntador de archivo.

Regresa:
El desplazamiento con respecto al inicio del archivo en bytes de la posicin en la que ocurrir la
siguiente lectura o escritura.

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


Tema 8 Entrada / Salida 243
ITSON Manuel Domitsu Kono
Tabla 8.24 Mtodos de la clase RandomAccessFile.
long length()throws IOException

Regresa el tamao de este archivo.

Regresa:
Tamao de este archivo en bytes.

Lanza:
I OExcept i on - Si ocurre un error de entrada/salida.
void seek(long pos) IOException

Establece el desplazamiento con respecto al inicio del archivo en bytes de la posicin en la que
ocurrir la siguiente lectura o escritura. El desplazamiento puede estar ms all del final del
archivo. En este caso el tamao del archivo no cambia hasta que ocurra una escritura en esta
posicin.

Parmetro:
pos - El desplazamiento con respecto al inicio del archivo en bytes de la posicin en la que
establecer el apuntador de archivo.

Lanza:
I OExcept i on - Si pos es menor que cero u ocurre un error de entrada/salida.
void setLeght(long length) IOException

Establece el tamao del archivo.

Si el tamao actual del archivo, como lo reporta el mtodo l engh( ) , es mayor que el valor
deseado el archivo ser truncado. En este caso, si el apuntador de archivo es mayor que el
nuevo tamao del archivo, el valor del apuntador de archivo ser igual al tamao del archivo
despus del truncamiento.

Si el tamao actual del archivo, como lo reporta el mtodo l engh( ) , es menor que el valor
deseado el archivo ser extendido. en este caso, el contenido de la porcin extendida no est
definida.

Parmetro:
Valor deseado del tamao de archivo.

Lanza:
I OExcept i on - Si ocurre un error de entrada/salida.
Ejemplo de Archivos de Acceso Aleatorio

En el Tema 4: Arreglos y Cadenas se implement un mecanismo de persistencia
basado en arreglos para almacenar los datos de las canciones y pelculas del programa
sobre el amante de la msica y el cine. Sin embargo, este mecanismo no es en
realidad un mecanismo de persistencia ya que los datos se almacenan en arreglos y
estos datos se pierden en cuanto el programa termina su ejecucin. En este ejemplo
implantaremos un verdadero mecanismo de persistencia basado en archivos.
Tendremos tres archivos de acceso aleatorio llamados canciones.dat, peliculas.dat y
generos.dat para almacenar los datos de las canciones, pelculas y gneros. Los
244 Entrada / Salida
ITSON Manuel Domitsu Kono
mtodos para agregar, actualizar y borrar canciones, pelculas y gneros, as como
para realizar consultas estarn en las clases Canci ones, Pel i cul as y Gener os.

Cada uno de los registros de los archivos canciones.dat, peliculas.dat y generos.dat
contendr los datos de una cancin, de una pelcula o de un gnero. A fin de poder
acceder a los registros de las canciones o de las pelculas en forma aleatoria, es
necesario que todos los registros de las canciones sean del mismo tamao y lo mismo
debemos tener con los registros de las pelculas y de los gneros. Por tal motivo los
datos a almacenar que sean cadenas debern convertirse a arreglos de tamao fijo al
momento de almacenarse y reconvertirse a cadenas al momento de recuperarse de los
archivos. Los mtodos que nos permiten guardar y recuperar cadenas en un archivo
como arreglos de tamao fijo, as como los mtodos que nos permiten guardar y
recuperar fechas y borrar registros se implementan en la clase AccesoAl eat or i o la
cual ser la superclase de las clases Canci ones, Pel i cul as y Gener os. El
diagrama de clases de las clases AccesoAl eat or i o, Canci ones, Pel i cul as y
Gener os se muestra en la figura 8.4.

Figura 8.4 Diagrama de Clases del Mecanismo de Persistencia Basado en
Archivos del Programa Amante Msica.
Tema 8 Entrada / Salida 245
ITSON Manuel Domitsu Kono
El listado de la clase AccesoAl eat or i o es el siguiente:

AccesoAleatorio.java
/ *
* AccesoAl eat or i o. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package per si st enci a;

i mpor t j ava. i o. *;

i mpor t obj et osSer vi ci o. *;

/ **
* Est a cl ase cont i ene r ut i nas par a t r abaj ar con ar chi vos de acceso al eat or i o
*
* @aut hor mdomi t su
*/
publ i c cl ass AccesoAl eat or i o {
pr ot ect ed RandomAccessFi l e ar chi vo;
pr ot ect ed St r i ng nomAr chi vo;
pr ot ect ed i nt t amRegi st r o;
pr ot ect ed byt e bl ancos[ ] ;

/ **
* Const r uct or de l a cl ase. Est abl ece el nombr e del ar chi vo, el t amao de
* cada uno de l os r egi st r os del ar chi vo y cr ea un ar r egl o de byt es en
* cer os par a bor r ar un r egi st r o
* @par amnomAr chi vo Nombr e del ar chi vo
* @par amt amRegi st r o Tamao del r egi st r o
*/
publ i c AccesoAl eat or i o( St r i ng nomAr chi vo, i nt t amRegi st r o) {
t hi s. nomAr chi vo = nomAr chi vo;
t hi s. t amRegi st r o = t amRegi st r o;

/ / Cr ea un ar r egl o de byt es en cer os
bl ancos = new byt e[ t amRegi st r o] ;
f or ( i nt i = 0; i < t amRegi st r o; i ++) bl ancos[ i ] = 0;
}

/ **
* Lee una secuenci a de car act er es de un ar chi vo de acceso al eat or i o y l os
* r egr esa en un St r i ng
* @par amt amNmer o de car act er es a l eer del ar chi vo
* @r et ur n Un St r i ng con l os car act er es l e dos
* @t hr ows I OExcept i on Si hay un er r or de ent r ada o sal i da.
*/
publ i c St r i ng l eeSt r i ng( i nt t am) t hr ows I OExcept i on {
char cadena[ ] = new char [ t am] ;

/ / Lee t amcar act er es del ar chi vo y l os al macena en un ar r egl o
f or ( i nt i = 0; i < t am; i ++) cadena[ i ] = ar chi vo. r eadChar ( ) ;

/ / Convi er t e el ar r egl o en un St r i ng
246 Entrada / Salida
ITSON Manuel Domitsu Kono
St r i ng sCadena = new St r i ng( cadena) ;

/ / Reempl aza l os car act er es ' \ u0000' por espaci os
sCadena = sCadena. r epl ace( ' \ u0000' , ' ' ) ;

/ / El i mi na l os espaci os en bl anco
sCadena = sCadena. t r i m( ) ;

r et ur n sCadena;
}

/ **
* Escr i be una secuenci a de car act er es en un ar chi vo. El nmer o de
* car act er es a escr i bi r est dado por t amy l os car act er es est n en
* sCadena.
* @par amsCadena St r i ng con l os car act er es a escr i bi r
* @par amt amNmer o de car act er es a escr i bi r .
* @t hr ows I OExcept i on Si hay un er r or de ent r ada o sal i da.
*/
publ i c voi d escr i beSt r i ng( St r i ng sCadena, i nt t am) t hr ows I OExcept i on {
St r i ngBuf f er cadena;

i f ( sCadena ! = nul l ) {
/ / Cr ea un St r i ngBuf f er a par t i r de l a cadena
cadena = new St r i ngBuf f er ( sCadena) ;
}
el se
/ / Cr ea una cadena vac a de t amao t am
cadena = new St r i ngBuf f er ( t am) ;

/ / Hace el St r i ngBuf f er de t amao t am
cadena. set Lengt h( t am) ;

/ / Convi er t e el st r i ngbuf f er a una cadena
sCadena = cadena. t oSt r i ng( ) ;

/ / escr i be l a cadena al ar chi vo
ar chi vo. wr i t eChar s( sCadena) ;
}

/ **
* Lee una f echa de un ar chi vo como t r es ent er os: d a, mes, ao
* @r et ur n La f echa l e da
* @t hr ows I OExcept i on Si hay un er r or de ent r ada o sal i da.
*/
publ i c Fecha l eeFecha( ) t hr ows I OExcept i on {
/ / Lee el d a del ar chi vo
i nt di a = ar chi vo. r eadI nt ( ) ;

/ / Lee el mes del ar chi vo
i nt mes = ar chi vo. r eadI nt ( ) ;

/ / Lee ao del ar chi vo
i nt anho = ar chi vo. r eadI nt ( ) ;

/ / Cr ea una f echa a par t i r del d a, mes y ao
Fecha f echa = new Fecha( di a, mes, anho) ;
Tema 8 Entrada / Salida 247
ITSON Manuel Domitsu Kono

r et ur n f echa;
}

/ **
* Escr i be una f echa a un ar chi vo como t r es ent er os: d a, mes, ao
* @par amf echa Fecha a escr i bi r
* @t hr ows I OExcept i on Si hay un er r or de ent r ada o sal i da.
*/
publ i c voi d escr i beFecha( Fecha f echa) t hr ows I OExcept i on {
i f ( f echa ! = nul l ) {
/ / Escr i be el d a
ar chi vo. wr i t eI nt ( f echa. get Di a( ) ) ;

/ / Escr i be el mes
ar chi vo. wr i t eI nt ( f echa. get Mes( ) ) ;

/ / Escr i be el ao
ar chi vo. wr i t eI nt ( f echa. get Anho( ) ) ;
}
el se {
ar chi vo. wr i t eI nt ( 0) ;
ar chi vo. wr i t eI nt ( 0) ;
ar chi vo. wr i t eI nt ( 0) ;
}
}

/ **
* Escr i be un r egi st r o con t amRegi st r o byt es en 0 en el ar chi vo
* @t hr ows I OExcept i on Si hay un er r or de ent r ada o sal i da.
*/
publ i c voi d bor r aRegi st r o( ) t hr ows I OExcept i on {
/ / Escr i be en el ar chi vo t amRegi st r o byt es en 0
ar chi vo. wr i t e( bl ancos) ;
}

/ **
* Regr esa t r ue si el ar r egl o de byt es dado por r egi st r o cont i ene pur os
* cer os
* @par amr egi st r o Ar r egl o a pr obar
* @r et ur n t r ue si el ar r egl o cont i ene pur os cer os, f al se en caso
* cont r ar i o.
*/
publ i c bool ean est aRegi st r oBor r ado( byt e r egi st r o[ ] ) {
/ / r egr esa f al se al pr i mer byt e di f er ent e de cer os
f or ( i nt i = 0; i < t amRegi st r o; i ++)
i f ( r egi st r o[ i ] ! = 0) r et ur n f al se;

/ / Si son pur os cer os r egr esa t r ue
r et ur n t r ue;
}

/ **
* Est e mt odo el i mi na f i si cament e l os r egi st r os bor r ados de un ar chi vo
* @t hr ows I OExcept i on
*/
publ i c voi d empaca( ) t hr ows I OExcept i on {
248 Entrada / Salida
ITSON Manuel Domitsu Kono
byt e r egi st r o[ ] = new byt e[ t amRegi st r o] ;
i nt r egi st r osBor r ados = 0;

/ / Cal cul a el nmer o de r egi st r os en el ar chi vo
i nt numRegi st r os = ( i nt ) ar chi vo. l engt h( ) / t amRegi st r o;

/ / Par a cada r egi st r o del ar chi vo
f or ( i nt i =0; i < numRegi st r os; i ++) {
/ / Posi ci ona en el i - esi mo r egi st r o del ar chi vo
ar chi vo. seek( i * t amRegi st r o) ;
/ / l ee el r egi st r o
ar chi vo. r ead( r egi st r o) ;

/ / Si el r egi st r o est bor r ado
i f ( est aRegi st r oBor r ado( r egi st r o) ) {
/ / Recor r e t odas l os r egi st r os una posi ci on haci a
/ / ar r i ba par a r ecuper ar el espaci o
f or ( i nt j =i ; j < numRegi st r os- 1; j ++) {
/ / Posi ci ona en el j - esi mo + 1 r egi st r o del ar chi vo
ar chi vo. seek( ( j + 1) * t amRegi st r o) ;
/ / l ee el r egi st r o
ar chi vo. r ead( r egi st r o) ;

/ / Posi ci ona en el j - esi mo l ugar del ar chi vo
ar chi vo. seek( j * t amRegi st r o) ;
/ / escr i be el r egi st r o
ar chi vo. wr i t e( r egi st r o) ;
}
/ / Decr ement a el nmer o de r egi st r os al el i mi nar un r egi st r o
numRegi st r os- - ;
/ / Cont abi l i za el nmer o de r egi st r os el i mi nados
r egi st r osBor r ados++;
}
}

/ / Tr unca el ar chi vo par a el i mi nar el espaci o l i ber ado por l os r egi st r os
/ / el i mi nados
ar chi vo. set Lengt h( ar chi vo. l engt h( ) - r egi st r osBor r ados * t amRegi st r o) ;
}
}

El siguiente es el listado parcial de la clase Canci ones que implementa los mtodos
que nos permiten obtener, consultar, insertar, actualizar y eliminar registros en el
archivo canciones.dat. Cada registro proviene de o se convierte en un objeto del tipo
Canci on. Los mtodos de esta clase lanzan excepciones del tipo
Per si st enci aExcept i on, la cual fue vista en el tema 5: Arreglos y Cadenas.

Canciones.java
/ *
* Canci ones. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package per si st enci a;
Tema 8 Entrada / Salida 249
ITSON Manuel Domitsu Kono

i mpor t j ava. i o. *;
i mpor t j ava. ut i l . Vect or ;

i mpor t obj et osSer vi ci o. *;
i mpor t obj et osNegoci o. *;
i mpor t excepci ones. Per si st enci aExcept i on;

/ **
* Est a cl ase per mi t e agr egar , act ual i zar , el i mi nar y consul t ar canci ones
* del pr ogr ama Amant eMusi ca en su ver si n que usa ar chi vos
*
* @aut hor mdomi t su
*/
publ i c cl ass Canci ones ext ends AccesoAl eat or i o {

/ / Tamao de un r egi st r o ( dat os de una canci n)
/ / cl ave 7 car act er es 14 byt es
/ / t i t ul o 35 car act er es 70 byt es
/ / cveGener o 7 car act er es 14 byt es
/ / i nt er pr et e 35 car act er es 70 byt es
/ / aut or 35 car act er es 70 byt es
/ / al bum 35 car act er es 70 byt es
/ / dur aci on i nt 4 byt es
/ / f echa 3 i nt 12 byt es
/ / Tot al 324 byt es

publ i c Canci ones( St r i ng nomAr chi vo) {
super ( nomAr chi vo, 324) ;
}

/ **
* Lee una canci n de un ar chi vo
* @r et ur n La canci n l e da
* @t hr ows I OExcept i on Si hay un er r or de ent r ada / sal i da.
*/
pr i vat e Canci on l eeCanci on( ) t hr ows I OExcept i on {
Canci on canci on = new Canci on( ) ;

/ / Lee de el ar chi vo cada unos de l os at r i but os de l a canci n
canci on. set Cl ave( l eeSt r i ng( 7) ) ;
canci on. set Ti t ul o( l eeSt r i ng( 35) ) ;
Gener o gener o = new Gener o( l eeSt r i ng( 7) ) ;
canci on. set Gener o( gener o) ;
canci on. set I nt er pr et e( l eeSt r i ng( 35) ) ;
canci on. set Aut or ( l eeSt r i ng( 35) ) ;
canci on. set Al bum( l eeSt r i ng( 35) ) ;
canci on. set Dur aci on( ar chi vo. r eadI nt ( ) ) ;
canci on. set Fecha( l eeFecha( ) ) ;

r et ur n canci on;
}

/ **
* Escr i be una canci n a un ar chi vo
* @par amcanci on Canci n a escr i bi r
* @t hr ows I OExcept i on Si hay un er r or de ent r ada / sal i da.
250 Entrada / Salida
ITSON Manuel Domitsu Kono
*/
pr i vat e voi d escr i beCanci on( Canci on canci on) t hr ows I OExcept i on {
escr i beSt r i ng( canci on. get Cl ave( ) , 7) ;
escr i beSt r i ng( canci on. get Ti t ul o( ) , 35) ;
escr i beSt r i ng( canci on. get Gener o( ) . get CveGener o( ) , 7) ;
escr i beSt r i ng( canci on. get I nt er pr et e( ) , 35) ;
escr i beSt r i ng( canci on. get Aut or ( ) , 35) ;
escr i beSt r i ng( canci on. get Al bum( ) , 35) ;
ar chi vo. wr i t eI nt ( canci on. get Dur aci on( ) ) ;
escr i beFecha( canci on. get Fecha( ) ) ;
}

/ **
* Regr esa l a canci on del ar r egl o que coi nci da con l a canci on del
* par amet r o.
* Las cl aves de l as canci ones del ar r egl o y del par amet r o deben coi nci di r
* Est e mt odo obt i ene una canci n de un ar chi vo cuya cl ave es i gual a l a
* cl ave de l a canci n dada por el par met r o.
* @par amcanci on Obj et o de t i po Canci on con l a cl ave de l a canci n a
* buscar
* @r et ur n La Canci on si l a encuent r a. nul l en caso cont r ar i o.
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da
* o el ar chi vo no exi st e.
*/
publ i c Canci on obt en( Canci on canci on) t hr ows Per si st enci aExcept i on {
Canci on canci onLei da;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya canci ones en el ar chi vo
whi l e( t r ue) {
/ / Lee una canci n
canci onLei da = l eeCanci on( ) ;
/ / Si es l a canci n buscada, r egr sal a
i f ( canci on. equal s( canci onLei da) ) {
r et ur n canci onLei da;
}
}
}
/ / Si se l l eg al f i nal del ar chi vo si n encont r ar l a canci n
cat ch ( EOFExcept i on eof e) {
r et ur n nul l ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
Tema 8 Entrada / Salida 251
ITSON Manuel Domitsu Kono
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e agr egar una canci n a un ar chi vo.
* @par amcanci on Canci on a agr egar en l a t abl a canci ones
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da,
* el ar chi vo no exi st e.
*/
publ i c voi d agr ega( Canci on canci on) t hr ows Per si st enci aExcept i on {
/ / Abr e el ar chi vo de escr i t ur a/ l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r w" ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Se posi ci ona al f i nal del ar chi vo
ar chi vo. seek( ar chi vo. l engt h( ) ) ;

/ / Escr i be l a canci n
escr i beCanci on( canci on) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Act ual i za l a canci n del ar chi vo que coi nci da con l a canci on del
* par amet r o.
* Las cl aves de l as canci ones del ar chi vo y del par amet r o deben coi nci di r
* @par amcanci on La canci n a modi f i car
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da,
* el ar chi vo no exi st e o no se puede act ual i zar l a canci n.
*/
publ i c voi d act ual i za( Canci on canci on) t hr ows Per si st enci aExcept i on {
Canci on canci onLei da;
252 Entrada / Salida
ITSON Manuel Domitsu Kono

/ / Abr e el ar chi vo de escr i t ur a/ l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r w" ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya canci ones en el ar chi vo
whi l e( t r ue) {
/ / Lee una canci n
canci onLei da = l eeCanci on( ) ;

/ / Si es l a canci n buscada
i f ( canci on. equal s( canci onLei da) ) {
/ / Se posi ci ona al pr i nci pi o del r egi st r o
ar chi vo. seek( ar chi vo. get Fi l ePoi nt er ( ) - t amRegi st r o) ;

/ / Escr i be l a canci n modi f i cada
escr i beCanci on( canci on) ;

/ / Ter mi na l a bsqueda
br eak;
}
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " La canci n no exi st e" ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* El i mi na l a canci n del ar chi vo que coi nci da con l a canci on del
* par amet r o.
* Las cl aves de l as canci ones del ar chi vo y del par amet r o deben coi nci di r
* Est e mt odo per mi t e bor r ar una canci n del ar chi vo canci ones
* @par amcanci on Canci on a bor r ar
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da,
* el ar chi vo no exi st e o no se puede el i mi nar l a canci n.
*/
Tema 8 Entrada / Salida 253
ITSON Manuel Domitsu Kono
publ i c voi d el i mi na( Canci on canci on) t hr ows Per si st enci aExcept i on {
Canci on canci onLei da;

/ / Abr e el ar chi vo de escr i t ur a/ l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r w" ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya canci ones en el ar chi vo
whi l e( t r ue) {
/ / Lee una canci n
canci onLei da = l eeCanci on( ) ;

/ / Si es l a canci n buscada
i f ( canci on. equal s( canci onLei da) ) {
/ / Se posi ci ona al pr i nci pi o del r egi st r o
ar chi vo. seek( ar chi vo. get Fi l ePoi nt er ( ) - t amRegi st r o) ;

/ / Escr i be un r egi st r o en bl anco y empaca
bor r aRegi st r o( ) ;
empaca( ) ;

/ / Ter mi na l a bsqueda
br eak;
}
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " La canci n no exi st e" ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e consul t ar l as canci ones del ar chi vo canci ones.
* @r et ur n Un vect or con l a l i st a de l as canci ones del ar chi vo canci ones
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da o
* el ar chi vo no exi st e.
*/
254 Entrada / Salida
ITSON Manuel Domitsu Kono
publ i c Vect or l i st a( ) t hr ows Per si st enci aExcept i on {
Vect or l i st a = new Vect or ( ) ;
Canci on canci on;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya canci ones en el ar chi vo
whi l e ( t r ue) {
/ / Lee una canci n
canci on = l eeCanci on( ) ;

/ / Agr ega l a canci n al vect or de canci ones
l i st a. add( canci on) ;
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
/ / Regr esa l a l i st a de canci ones
r et ur n l i st a;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e consul t ar l as canci ones del ar chi vo canci ones
* y que t i enen el mi smo t t ul o.
* @par amt i t ul o T t ul o de l a canci n a buscar
* @r et ur n Un vect or con l a l i st a de l as canci ones del ar chi vo canci ones
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da o
* el ar chi vo no exi st e.
*/
publ i c Vect or l i st aTi t ul o( St r i ng t i t ul o) t hr ows Per si st enci aExcept i on {
Vect or l i st a = new Vect or ( ) ;
Canci on canci on;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
Tema 8 Entrada / Salida 255
ITSON Manuel Domitsu Kono
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya canci ones en el ar chi vo
whi l e( t r ue) {
/ / Lee una canci n
canci on = l eeCanci on( ) ;

/ / Si es l a canci n buscada
i f ( t i t ul o. equal s( canci on. get Ti t ul o( ) ) )
/ / Agr ega l a canci n al vect or de canci ones
l i st a. add( canci on) ;
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
/ / Regr esa l a l i st a de canci ones
r et ur n l i st a;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

. . .

/ **
* Est e mt odo per mi t e consul t ar l as canci ones del ar chi vo canci ones
* y que t i enen el mi smo gener o.
* @par amcveGener o Cl ave del gner o de l a canci n a buscar
* @r et ur n Un vect or con l a l i st a de l as canci ones del ar chi vo canci ones
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da o
* el ar chi vo no exi st e.
*/
publ i c Vect or l i st aGener o( St r i ng cveGener o) t hr ows Per si st enci aExcept i on {
Vect or l i st a = new Vect or ( ) ;
Canci on canci on;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
256 Entrada / Salida
ITSON Manuel Domitsu Kono
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya canci ones en el ar chi vo
whi l e( t r ue) {
/ / Lee una canci n
canci on = l eeCanci on( ) ;

/ / Si es l a canci n buscada
i f ( cveGener o. equal s( canci on. get Gener o( ) . get CveGener o( ) ) )
/ / Agr ega l a canci n al vect or de canci ones
l i st a. add( canci on) ;
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
/ / Regr esa l a l i st a de canci ones
r et ur n l i st a;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e consul t ar l as canci ones del ar chi vo canci ones
* y que t i enen el mi smo per i odo.
* @par amper i odo Per i odo de l a canci n a buscar
* @r et ur n Un vect or con l a l i st a de l as canci ones del ar chi vo canci ones
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da o
* el ar chi vo no exi st e.
*/
publ i c Vect or l i st aPer i odo( Per i odo per i odo) t hr ows Per si st enci aExcept i on {
Vect or l i st a = new Vect or ( ) ;
Canci on canci on;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

Tema 8 Entrada / Salida 257
ITSON Manuel Domitsu Kono
t r y {
/ / Mi ent r as haya canci ones en el ar chi vo
whi l e( t r ue) {
/ / Lee una canci n
canci on = l eeCanci on( ) ;

/ / Si es l a canci n buscada
i f ( per i odo. cont i ene( canci on. get Fecha( ) ) )
/ / Agr ega l a canci n al vect or de canci ones
l i st a. add( canci on) ;
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
/ / Regr esa l a l i st a de canci ones
r et ur n l i st a;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}
}

El siguiente es el listado parcial de la clase Pel i cul as que implementa los mtodos
que nos permiten obtener, consultar, insertar, actualizar y eliminar registros en el
archivo peliculas.dat. Cada registro proviene de o se convierte en un objeto del tipo
Pelicula. Los mtodos de esta clase lanzan excepciones del tipo
Per si st enci aExcept i on, la cual fue vista en el tema 5: Arreglos y Cadenas.

Peliculas
/ *
* Pel i cul as. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package per si st enci a;

i mpor t j ava. i o. *;
i mpor t j ava. ut i l . Vect or ;

i mpor t obj et osSer vi ci o. *;
i mpor t obj et osNegoci o. *;
i mpor t excepci ones. Per si st enci aExcept i on;
258 Entrada / Salida
ITSON Manuel Domitsu Kono

/ **
* Est a cl ase per mi t e agr egar , act ual i zar , el i mi nar y consul t ar pel cul as
* del pr ogr ama Amant eMusi ca en su ver si n que usa ar chi vos
*
* @aut hor mdomi t su
*/
publ i c cl ass Pel i cul as ext ends AccesoAl eat or i o {

/ / Tamao de un r egi st r o ( dat os de una pel cul a)
/ / cl ave 7 car act er es 14 byt es
/ / t i t ul o 35 car act er es 70 byt es
/ / cveGener o 7 car act er es 14 byt es
/ / act or 1 35 car act er es 70 byt es
/ / act or 2 35 car act er es 70 byt es
/ / di r ect or 35 car act er es 70 byt es
/ / dur aci on i nt 4 byt es
/ / f echa 3 i nt 12 byt es
/ / Tot al 324 byt es


publ i c Pel i cul as( St r i ng nomAr chi vo) {
super ( nomAr chi vo, 324) ;
}

/ **
* Lee una pel cul a de un ar chi vo
* @r et ur n La pel cul a l e da
* @t hr ows I OExcept i on Si hay un er r or de ent r ada / sal i da.
*/
pr i vat e Pel i cul a l eePel i cul a( ) t hr ows I OExcept i on {
Pel i cul a pel i cul a = new Pel i cul a( ) ;

/ / Lee de el ar chi vo cada unos de l os at r i but os de l a pel cul a
pel i cul a. set Cl ave( l eeSt r i ng( 7) ) ;
pel i cul a. set Ti t ul o( l eeSt r i ng( 35) ) ;
pel i cul a. set Gener o( new Gener o( l eeSt r i ng( 7) ) ) ;
pel i cul a. set Act or 1( l eeSt r i ng( 35) ) ;
pel i cul a. set Act or 2( l eeSt r i ng( 35) ) ;
pel i cul a. set Di r ect or ( l eeSt r i ng( 35) ) ;
pel i cul a. set Dur aci on( ar chi vo. r eadI nt ( ) ) ;
pel i cul a. set Fecha( l eeFecha( ) ) ;

r et ur n pel i cul a;
}

/ **
* Escr i be una pel cul a a un ar chi vo
* @par ampel i cul a Canci n a escr i bi r
* @t hr ows I OExcept i on Si hay un er r or de ent r ada / sal i da.
*/
pr i vat e voi d escr i bePel i cul a( Pel i cul a pel i cul a) t hr ows I OExcept i on {
escr i beSt r i ng( pel i cul a. get Cl ave( ) , 7) ;
escr i beSt r i ng( pel i cul a. get Ti t ul o( ) , 35) ;
escr i beSt r i ng( pel i cul a. get Gener o( ) . get CveGener o( ) , 7) ;
escr i beSt r i ng( pel i cul a. get Act or 1( ) , 35) ;
escr i beSt r i ng( pel i cul a. get Act or 2( ) , 35) ;
Tema 8 Entrada / Salida 259
ITSON Manuel Domitsu Kono
escr i beSt r i ng( pel i cul a. get Di r ect or ( ) , 35) ;
ar chi vo. wr i t eI nt ( pel i cul a. get Dur aci on( ) ) ;
escr i beFecha( pel i cul a. get Fecha( ) ) ;
}

/ **
* Regr esa l a pel i cul a del ar r egl o que coi nci da con l a pel i cul a del
* par amet r o.
* Las cl aves de l as pel i cul as del ar r egl o y del par amet r o deben coi nci di r
* @par ampel i cul a Obj et o de t i po Pel i cul a con l a cl ave de l a pel cul a a
* buscar
* @r et ur n La Pel i cul a si l a encuent r a. nul l en caso cont r ar i o.
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da
* o el ar chi vo no exi st e.
*/
publ i c Pel i cul a obt en( Pel i cul a pel i cul a) t hr ows Per si st enci aExcept i on {
Pel i cul a pel i cul aLei da;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya pel cul as en el ar chi vo
whi l e( t r ue) {
/ / Lee una pel cul a
pel i cul aLei da = l eePel i cul a( ) ;

/ / Si es l a pel cul a buscada
i f ( pel i cul a. equal s( pel i cul aLei da) ) {

/ / Regr esa l a pel cul a buscada
r et ur n pel i cul aLei da;
}
}
}
/ / Si se l l eg al f i nal del ar chi vo si n encont r ar l a pel cul a
cat ch ( EOFExcept i on eof e) {
r et ur n nul l ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
260 Entrada / Salida
ITSON Manuel Domitsu Kono
}
}

/ **
* Est e mt odo per mi t e agr egar una pel cul a al ar chi vo pel i cul as.
* @par ampel i cul a Pel i cul a a agr egar en l a t abl a pel cul as.
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da,
* el ar chi vo no exi st e.
*/
publ i c voi d agr ega( Pel i cul a pel i cul a) t hr ows Per si st enci aExcept i on {
/ / Abr e el ar chi vo de escr i t ur a/ l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r w" ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Se posi ci ona al f i nal del ar chi vo
ar chi vo. seek( ar chi vo. l engt h( ) ) ;

/ / Escr i be l a pel cul a
escr i bePel i cul a( pel i cul a) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Act ual i za l a pel cul a del ar chi vo que coi nci da con l a pel cul a del
* par amet r o.
* Las cl aves de l as pel cul as del ar chi vo y del par amet r o deben coi nci di r
* @par ampel i cul a La pel cul a a modi f i car
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da,
* el ar chi vo no exi st e o no se puede act ual i zar l a pel cul a.
*/
publ i c voi d act ual i za( Pel i cul a pel i cul a) t hr ows Per si st enci aExcept i on {
Pel i cul a pel i cul aLei da;

/ / Abr e el ar chi vo de l ect ur a/ escr i t ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r w" ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
Tema 8 Entrada / Salida 261
ITSON Manuel Domitsu Kono
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya pel cul as en el ar chi vo
whi l e( t r ue) {
/ / Lee una pel cul a
pel i cul aLei da = l eePel i cul a( ) ;

/ / Si es l a pel cul a buscada
i f ( pel i cul a. equal s( pel i cul aLei da) ) {
/ / Se posi ci ona al pr i nci pi o del r egi st r o
ar chi vo. seek( ar chi vo. get Fi l ePoi nt er ( ) - t amRegi st r o) ;

/ / Escr i be l a pel cul a modi f i cada
escr i bePel i cul a( pel i cul a) ;

/ / Ter mi na l a bsqueda
br eak;
}
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " La pel cul a no exi st e" ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* El i mi naa l a pel cul a del ar chi vo que coi nci da con l a pel cul a del
* par amet r o.
* Las cl aves de l as pel cul as del ar chi vo y del par amet r o deben coi nci di r
* @par ampel i cul a Pel i cul a a bor r ar
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da,
* el ar chi vo no exi st e o no se puede el i mi nar l a pel cul a.
*/
publ i c voi d el i mi na( Pel i cul a pel i cul a) t hr ows Per si st enci aExcept i on {
Pel i cul a pel i cul aLei da;

/ / Abr e el ar chi vo de escr i t ur a/ l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r w" ) ;
}
262 Entrada / Salida
ITSON Manuel Domitsu Kono
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya pel cul as en el ar chi vo
whi l e( t r ue) {
/ / Lee una pel cul a
pel i cul aLei da = l eePel i cul a( ) ;

/ / Si es l a pel cul a buscada
i f ( pel i cul a. equal s( pel i cul aLei da) ) {
/ / Se posi ci ona al pr i nci pi o del r egi st r o
ar chi vo. seek( ar chi vo. get Fi l ePoi nt er ( ) - t amRegi st r o) ;

/ / Escr i be un r egi st r o en bl anco y empaca
bor r aRegi st r o( ) ;
empaca( ) ;

/ / Ter mi na l a bsqueda
br eak;
}
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " La pel cul a no exi st e" ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e consul t ar l as pel cul as del ar chi vo pel cul as.
* @r et ur n Un vect or con l a l i st a de l as pel cul as del ar chi vo pel cul as
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da o
* el ar chi vo no exi st e.
*/
publ i c Vect or l i st a( ) t hr ows Per si st enci aExcept i on {
Vect or l i st a = new Vect or ( ) ;
Pel i cul a pel i cul a;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
Tema 8 Entrada / Salida 263
ITSON Manuel Domitsu Kono
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya pel cul as en el ar chi vo
whi l e( t r ue) {
/ / Lee una pel cul a
pel i cul a = l eePel i cul a( ) ;

/ / Agr ega l a pel cul a al vect or de pel cul as
l i st a. add( pel i cul a) ;
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
/ / Regr esa l a l i st a de pel cul as
r et ur n l i st a;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e consul t ar l as pel cul as del ar chi vo pel cul as
* y que t i enen el mi smo t t ul o.
* @par amt i t ul o T t ul o de l a pel cul a a buscar
* @r et ur n Un vect or con l a l i st a de l as pel cul as del ar chi vo pel cul as
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da o
* el ar chi vo no exi st e.
*/
publ i c Vect or l i st aTi t ul o( St r i ng t i t ul o) t hr ows Per si st enci aExcept i on {
Vect or l i st a = new Vect or ( ) ;
Pel i cul a pel i cul a;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
264 Entrada / Salida
ITSON Manuel Domitsu Kono
/ / Mi ent r as haya pel cul as en el ar chi vo
whi l e( t r ue) {
/ / Lee una pel cul a
pel i cul a = l eePel i cul a( ) ;

/ / Si es l a pel cul a buscada
i f ( t i t ul o. equal s( pel i cul a. get Ti t ul o( ) ) )
/ / Agr ega l a pel cul a al vect or de pel cul as
l i st a. add( pel i cul a) ;
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
/ / Regr esa l a l i st a de pel cul as
r et ur n l i st a;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e consul t ar l as pel cul as del ar chi vo pel cul as
* y que t i enen el mi smo act or
* @par amact or Act or de l a pel cul a a buscar
* @r et ur n Un vect or con l a l i st a de l as pel cul as del ar chi vo pel cul as
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da o
* el ar chi vo no exi st e.
*/
publ i c Vect or l i st aAct or ( St r i ng act or ) t hr ows Per si st enci aExcept i on {
Vect or l i st a = new Vect or ( ) ;
Pel i cul a pel i cul a;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya pel cul as en el ar chi vo
whi l e( t r ue) {
/ / Lee una pel cul a
pel i cul a = l eePel i cul a( ) ;
Tema 8 Entrada / Salida 265
ITSON Manuel Domitsu Kono

/ / Si es l a pel cul a buscada
i f ( act or . equal s( pel i cul a. get Act or 1( ) ) | |
act or . equal s( pel i cul a. get Act or 2( ) ) )
/ / Agr ega l a pel cul a al vect or de pel cul as
l i st a. add( pel i cul a) ;
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
/ / Regr esa l a l i st a de pel cul as
r et ur n l i st a;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

. . .

}

El siguiente es el listado de la clase Gener os que implementa los mtodos que nos
permiten obtener, consultar, insertar, actualizar y eliminar registros en el archivo
generos.dat. Cada registro proviene de o se convierte en un objeto del tipo Gener o.
Los mtodos de esta clase lanzan excepciones del tipo Per si st enci aExcept i on, la
cual fue vista en el tema 5: Arreglos y Cadenas.

Generos
/ *
* Gener os. j ava
*
* Cr eada el 15 de sept i embr e de 2007, 12: 21 PM
*/

package per si st enci a;

i mpor t j ava. i o. EOFExcept i on;
i mpor t j ava. i o. Fi l eNot FoundExcept i on;
i mpor t j ava. i o. I OExcept i on;
i mpor t j ava. i o. RandomAccessFi l e;
i mpor t j ava. ut i l . Vect or ;

i mpor t obj et osNegoci o. Gener o;
266 Entrada / Salida
ITSON Manuel Domitsu Kono
i mpor t excepci ones. Per si st enci aExcept i on;

/ **
* Est a cl ase per mi t e agr egar , act ual i zar , el i mi nar y consul t ar gner os de
* gener os o pel cul as del pr ogr ama Amant eMusi ca en su ver si n que usa
* ar chi vos.
*
* @aut hor mdomi t su
*/
publ i c cl ass Gener os ext ends AccesoAl eat or i o {

/ / Tamao de un r egi st r o ( dat os de una gner o)
/ / cveGener o 7 car act er es 14 byt es
/ / nombr e 20 car act er es 40 byt es
/ / t i poMedi o Char 2 byt es
/ / Tot al 56 byt es

publ i c Gener os( St r i ng nomAr chi vo) {
super ( nomAr chi vo, 56) ;
}

/ **
* Lee un gner o de un ar chi vo
* @r et ur n El gner o l e do
* @t hr ows I OExcept i on Si hay un er r or de ent r ada / sal i da.
*/
pr i vat e Gener o l eeGener o( ) t hr ows I OExcept i on {
Gener o gener o = new Gener o( ) ;

/ / Lee del ar chi vo cada uno de l os at r i but os del gner o
gener o. set CveGener o( l eeSt r i ng( 7) ) ;
gener o. set Nombr e( l eeSt r i ng( 20) ) ;
gener o. set Ti poMedi o( ar chi vo. r eadChar ( ) ) ;

r et ur n gener o;
}

/ **
* Escr i be un gner o a un ar chi vo
* @par amgener o Gner o a escr i bi r
* @t hr ows I OExcept i on Si hay un er r or de ent r ada / sal i da.
*/
pr i vat e voi d escr i beGener o( Gener o gener o) t hr ows I OExcept i on {
escr i beSt r i ng( gener o. get CveGener o( ) , 7) ;
escr i beSt r i ng( gener o. get Nombr e( ) , 20) ;
ar chi vo. wr i t eChar ( gener o. get Ti poMedi o( ) ) ;
}

/ **
* Regr esa el gener o del ar chi vo que coi nci da con el gener o del par amet r o.
* Las cl aves de l os gener os del ar chi vo y del par amet r o deben coi nci di r
* @par amgener o Obj et o de t i po Gener o con l a cl ave del gner o a buscar
* @r et ur n El Gener o si l o encuent r a. nul l en caso cont r ar i o.
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da
* o el ar chi vo no exi st e.
*/
publ i c Gener o obt en( Gener o gener o) t hr ows Per si st enci aExcept i on {
Tema 8 Entrada / Salida 267
ITSON Manuel Domitsu Kono
Gener o gener oLei do;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya gener os en el ar chi vo
whi l e( t r ue) {
/ / Lee un gner o
gener oLei do = l eeGener o( ) ;
/ / Si es el gner o buscado, r egr sal o
i f ( gener o. equal s( gener oLei do) ) {
r et ur n gener oLei do;
}
}
}
/ / Si se l l eg al f i nal del ar chi vo si n encont r ar el gner o
cat ch ( EOFExcept i on eof e) {
r et ur n nul l ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e agr egar un gner o a un ar chi vo.
* @par amgener o Gner o a agr egar en el ar chi vo gner os
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da,
* el ar chi vo no exi st e.
*/
publ i c voi d agr ega( Gener o gener o) t hr ows Per si st enci aExcept i on {
/ / Abr e el ar chi vo de escr i t ur a/ l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r w" ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
268 Entrada / Salida
ITSON Manuel Domitsu Kono
/ / Se posi ci ona al f i nal del ar chi vo
ar chi vo. seek( ar chi vo. l engt h( ) ) ;

/ / Escr i be el gner o
escr i beGener o( gener o) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Act ual i za el gener o del ar chi vo que coi nci da con el gener o del
* par amet r o.
* Las cl aves de l os gener os del ar chi vo y del par amet r o deben coi nci di r
* @par amgener o El gner o a modi f i car
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da,
* el ar chi vo no exi st e o no se puede act ual i zar el gner o.
*/
publ i c voi d act ual i za( Gener o gener o) t hr ows Per si st enci aExcept i on {
Gener o gener oLei do;

/ / Abr e el ar chi vo de escr i t ur a/ l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r w" ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya gner os en el ar chi vo
whi l e( t r ue) {
/ / Lee una gner o
gener oLei do = l eeGener o( ) ;

/ / Si es el gner o buscado
i f ( gener o. get CveGener o( ) . equal s( gener oLei do. get CveGener o( ) ) ) {
/ / Se posi ci ona al pr i nci pi o del r egi st r o
ar chi vo. seek( ar chi vo. get Fi l ePoi nt er ( ) - t amRegi st r o) ;

/ / Escr i be el gner o modi f i cado
escr i beGener o( gener o) ;

/ / Ter mi na l a bsqueda
br eak;
Tema 8 Entrada / Salida 269
ITSON Manuel Domitsu Kono
}
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " El gner o no exi st e" ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* El i mi na el gener o del ar chi vo que coi nci da con el gener o del par amet r o.
* Las cl aves de l os gener os ar chi vo y del par amet r o deben coi nci di r
* @par amgener o Gener o a bor r ar
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da,
* el ar chi vo no exi st e o no se puede el i mi nar el gner o.
*/
publ i c voi d el i mi na( Gener o gener o) t hr ows Per si st enci aExcept i on {
Gener o gener oLei do;

/ / Abr e el ar chi vo de escr i t ur a/ l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r w" ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya gener os en el ar chi vo
whi l e( t r ue) {
/ / Lee un gner o
gener oLei do = l eeGener o( ) ;

/ / Si es el gner o buscado
i f ( gener o. get CveGener o( ) . equal s( gener oLei do. get CveGener o( ) ) ) {
/ / Se posi ci ona al pr i nci pi o del r egi st r o
ar chi vo. seek( ar chi vo. get Fi l ePoi nt er ( ) - t amRegi st r o) ;

/ / Escr i be un r egi st r o en bl anco y empaca
bor r aRegi st r o( ) ;
empaca( ) ;

/ / Ter mi na l a bsqueda
270 Entrada / Salida
ITSON Manuel Domitsu Kono
br eak;
}
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " La gner o no exi st e" ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e consul t ar l os gner os del ar chi vo gener os.
* @r et ur n Un vect or con l a l i st a de l os obj et os del t i po Gener o del
* ar chi vo gener os
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da o
* el ar chi vo no exi st e.
*/
publ i c Vect or l i st a( ) t hr ows Per si st enci aExcept i on {
Vect or l i st a = new Vect or ( ) ;
Gener o gener o;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya gener os en el ar chi vo
whi l e ( t r ue) {
/ / Lee un gner o
gener o = l eeGener o( ) ;

/ / Agr ega el gner o al vect or de gner os
l i st a. add( gener o) ;
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
/ / Regr esa l a l i st a de gener os
r et ur n l i st a;
Tema 8 Entrada / Salida 271
ITSON Manuel Domitsu Kono
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}

/ **
* Est e mt odo per mi t e consul t ar l os gner os del ar chi vo gener os
* que t i enen el mi smo t i po de medi o.
* @par amnombr e Ti po de medi o a buscar
* @r et ur n Un vect or con l a l i st a de gner os del ar chi vo gener os que
* t i enen el mi smo t i po de medi o.
* @t hr ows Per si st enci aExcept i on Si hay un er r or de ent r ada / sal i da o
* el ar chi vo no exi st e.
*/
publ i c Vect or l i st aMedi o( char t i poMedi o) t hr ows Per si st enci aExcept i on {
Vect or l i st a = new Vect or ( ) ;
Gener o gener o;

/ / Abr e el ar chi vo de sl o l ect ur a
t r y {
ar chi vo = new RandomAccessFi l e( nomAr chi vo, " r " ) ;
}
cat ch( Fi l eNot FoundExcept i on f nf e) {
t hr ow new Per si st enci aExcept i on( " Ar chi vo i nexi st ent e" ) ;
}

t r y {
/ / Mi ent r as haya gener os en el ar chi vo
whi l e( t r ue) {
/ / Lee una gner o
gener o = l eeGener o( ) ;

/ / Si es l a gner o buscada
i f ( t i poMedi o == gener o. get Ti poMedi o( ) )
/ / Agr ega l a gner o al vect or de gener os
l i st a. add( gener o) ;
}
}
/ / Si se l l eg al f i nal del ar chi vo
cat ch ( EOFExcept i on eof e) {
/ / Regr esa l a l i st a de gener os
r et ur n l i st a;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
272 Entrada / Salida
ITSON Manuel Domitsu Kono
t hr ow new Per si st enci aExcept i on( " Er r or al acceder al ar chi vo" ) ;
}
f i nal l y {
t r y {
/ / Ci er r a el ar chi vo
ar chi vo. cl ose( ) ;
}
/ / Si ocur r i un er r or de ent r ada sal i da
cat ch ( I OExcept i on eof e) {
t hr ow new Per si st enci aExcept i on( " Er r or al cer r ar el ar chi vo" ) ;
}
}
}
}

Como ya se mencion en el Tema 5: Arreglos y Cadenas, por encima de las clases
Canci ones, Pel i cul as y Gener os que nos permiten el acceso a los archivos
canciones.dat, peliculas.dat y generos.dat , se tendr una clase de fachada
FachadaAr chi vos. Para asegurarnos que podamos sustituir un mecanismo de
persistencia por otro, la clase FachadaAr chi vos implementa la interfaz I Fachada,
como se muestra en la figura 8.5:

Figura 8.5. Diagrama de clases de FachadaArchivos
Tema 8 Entrada / Salida 273
ITSON Manuel Domitsu Kono
Los mtodos de la clase FachadaAr chi vos lanzan excepciones de la clase
FachadaExcept i on vista en Tema 5: Arreglos y Cadenas. El cdigo parcial de la
clase FachadaAr chi vos es:

FachadaArchivos.java
/ *
* FachadaAr chi vos. j ava
*
* Cr eat ed on 15 de sept i embr e de 2007, 12: 21 PM
*
* @aut hor mdomi t su
*/

package f achadas;

i mpor t j ava. ut i l . Vect or ;

i mpor t obj et osSer vi ci o. *;
i mpor t obj et osNegoci o. *;
i mpor t per si st enci a. *;
i mpor t i nt er f aces. I Fachada;
i mpor t excepci ones. *;

/ **
* Est a cl ase i mpl ement a l a i nt er f az I Fachada del mecani smo de per si st enci a
* de ar chi vos del pr ogr ama Amant eMusi ca
*/
publ i c cl ass FachadaAr chi vos i mpl ement s I Fachada {
pr i vat e Canci ones cat al ogoCanci ones;
pr i vat e Pel i cul as cat al ogoPel i cul as;
pr i vat e Gener os cat al ogoGener os;

/ **
* Const r uct or pr edet er mi nado
*/
publ i c FachadaAr chi vos( ) {
/ / Cr ea un obj et o del t i po cat al ogoCanci ones par a accesar al ar chi vo
/ / canci ones
cat al ogoCanci ones = new Canci ones( " canci ones. dat " ) ;

/ / Cr ea un obj et o del t i po cat al ogoPel i cul as par a accesar al ar chi vo
/ / pel i cul as
cat al ogoPel i cul as = new Pel i cul as( " pel i cul as. dat " ) ;

/ / Cr ea un obj et o del t i po cat al ogoGener os par a accesar al ar chi vo
/ / gner os
cat al ogoGener os = new Gener os( " gener os. dat " ) ;
}

/ **
* Obt i ene una canci n del cat l ogo de canci ones
* @par amcanci on Canci on a obt ener
* @r et ur n La canci n si exi st e, nul l en caso cont r ar i o
* @t hr ows FachadaExcept i on Si no se puede obt ener l a canci n.
*/
274 Entrada / Salida
ITSON Manuel Domitsu Kono
publ i c Canci on obt en( Canci on canci on) t hr ows FachadaExcept i on {
Canci on canci onBuscada;

/ / Obt en l a canci n
t r y {
/ / Obt en l a canci n
canci onBuscada = cat al ogoCanci ones. obt en( canci on) ;
i f ( canci onBuscada ! = nul l ) {
/ / Obt en el gner o
Gener o gener o = cat al ogoGener os. obt en( canci onBuscada. get Gener o( ) ) ;
/ / Agr gasel o a l a canci n
canci onBuscada. set Gener o( gener o) ;
}

r et ur n canci onBuscada;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede obt ener l a canci n" , pe) ;
}
}

/ **
* Agr ega una canci n al cat l ogo de canci ones. No se per mi t en canci ones
* con cl aves r epet i das
* @par amcanci on Canci on a agr egar
* @t hr ows FachadaExcept i on Si l a canci n est r epet i da o no se puede
* agr egar l a canci n al cat l ogo de canci ones.
*/
publ i c voi d agr ega( Canci on canci on) t hr ows FachadaExcept i on {
Canci on canci onBuscada;

/ / Busca l a canci n en el ar r egl o con l a mi sma cl ave.
t r y {
canci onBuscada = cat al ogoCanci ones. obt en( canci on) ;

/ / Si l o hay, no se agr ega al ar r egl o
i f ( canci onBuscada ! = nul l )
t hr ow new FachadaExcept i on( " Canci n r epet i da" ) ;
}
cat ch ( Per si st enci aExcept i on pe) {
/ / Si el ar chi vo no exi st e no se hace nada
}

/ / Agr ega l a nueva canci n al cat l ogo
t r y {
cat al ogoCanci ones. agr ega( canci on) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede agr egar l a canci n" , pe) ;
}
}

/ **
* Act ual i za una canci n del cat l ogo de canci ones
* @par amcanci on Canci on a act ual i zar
* @t hr ows FachadaExcept i on Si no se puede act ual i zar l a canci n del
* cat l ogo de canci ones.
Tema 8 Entrada / Salida 275
ITSON Manuel Domitsu Kono
*/
publ i c voi d act ual i za( Canci on canci on) t hr ows FachadaExcept i on {
/ / Act ual i za l a canci n del cat l ogo
t r y {
cat al ogoCanci ones. act ual i za( canci on) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede act ual i zar l a canci n" , pe) ;
}
}

/ **
* El i mi na una canci n del cat l ogo de canci ones
* @par amcanci on Canci on a el i mi nar
* @t hr ows FachadaExcept i on Si no se puede el i mi nar l a canci n del
* cat l ogo de canci ones.
*/
publ i c voi d el i mi na( Canci on canci on) t hr ows FachadaExcept i on {
/ / El i mi na l a canci n del cat l ogo
t r y {
cat al ogoCanci ones. el i mi na( canci on) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede el i mi nar l a canci n" , pe) ;
}
}

/ **
* Obt i ene una pel cul a del cat l ogo de pel i cul as
* @par ampel i cul a Pel i cul a a obt ener
* @r et ur n La pel cul a si exi st e, nul l en caso cont r ar i o
* @t hr ows FachadaExcept i on Si no se puede obt ener l a pel cul a.
*/
publ i c Pel i cul a obt en( Pel i cul a pel i cul a) t hr ows FachadaExcept i on {
Pel i cul a pel i cul aBuscada;

t r y {
/ / Obt en l a pel cul a
pel i cul aBuscada = cat al ogoPel i cul as. obt en( pel i cul a) ;
i f ( pel i cul aBuscada ! = nul l ) {
/ / Obt en el gner o
Gener o gener o = cat al ogoGener os. obt en( pel i cul aBuscada. get Gener o( ) ) ;
/ / Agr gasel o a l a canci n
pel i cul aBuscada. set Gener o( gener o) ;
}

r et ur n pel i cul aBuscada;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede obt ener l a pel cul a" , pe) ;
}
}

/ **
* Agr ega una pel cul a al cat l ogo de pel i cul as. No se per mi t en pel i cul as
* con cl aves r epet i das
* @par ampel i cul a Pel cul a a agr egar
276 Entrada / Salida
ITSON Manuel Domitsu Kono
* @t hr ows FachadaExcept i on Si l a pel cul a est r epet i da o no se puede
* agr egar l a pel cul a al cat l ogo de pel cul as.
*/
publ i c voi d agr ega( Pel i cul a pel i cul a) t hr ows FachadaExcept i on {
Pel i cul a pel i cul aBuscada;

/ / Busca l a canci n en el ar r egl o con l a mi sma cl ave.
t r y {
pel i cul aBuscada = cat al ogoPel i cul as. obt en( pel i cul a) ;

/ / Si l o hay, no se agr ega al ar r egl o
i f ( pel i cul aBuscada ! = nul l )
t hr ow new FachadaExcept i on( " Pel cul a r epet i da" ) ;
}
cat ch ( Per si st enci aExcept i on pe) {
/ / Si el ar chi vo no exi st e no se hace nada
}

/ / Agr ega l a nueva pel cul a al cat l ogo
t r y {
cat al ogoPel i cul as. agr ega( pel i cul a) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede agr egar l a pel cul a" , pe) ;
}
}

/ **
* Act ual i za una pel cul a del cat l ogo de pel i cul as
* @par ampel i cul a Pel i cul a a act ual i zar
* @t hr ows FachadaExcept i on Si no se puede act ual i zar l a pel cul a del
* cat l ogo de pel cul as.
*/
publ i c voi d act ual i za( Pel i cul a pel i cul a) t hr ows FachadaExcept i on {
/ / Act ual i za l a pel cul a del cat l ogo
t r y {
cat al ogoPel i cul as. act ual i za( pel i cul a) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede act ual i zar l a pel cul a" , pe) ;
}
}

/ **
* El i mi na una pel cul a del cat l ogo de pel i cul as
* @par ampel i cul a Pel i cul a a el i mi nar
* @t hr ows FachadaExcept i on Si no se puede el i mi nar l a pel cul a del
* cat l ogo de pel cul as.
*/
publ i c voi d el i mi na( Pel i cul a pel i cul a) t hr ows FachadaExcept i on {
/ / El i mi na l a pel cul a del cat l ogo
t r y {
cat al ogoPel i cul as. el i mi na( pel i cul a) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede el i mi nar l a pel cul a" , pe) ;
}
Tema 8 Entrada / Salida 277
ITSON Manuel Domitsu Kono
}

/ **
* Obt i ene un gner o del cat l ogo de gner os
* @par amgener o Gner o a obt ener
* @r et ur n El gner o si exi st e, nul l en caso cont r ar i o
* @t hr ows FachadaExcept i on Si no se puede obt ener el gner o.
*/
publ i c Gener o obt en( Gener o gener o) t hr ows FachadaExcept i on {
/ / Obt en el gner o
t r y {
r et ur n cat al ogoGener os. obt en( gener o) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede obt ener el gner o" , pe) ;
}
}

/ **
* Agr ega un gner o al cat l ogo de gner os. No se per mi t en gner os
* con cl aves r epet i das
* @par amgener o Gner o a agr egar
* @t hr ows FachadaExcept i on Si el gner o est r epet i do o no se puede
* agr egar el gner o al cat l ogo de gner os.
*/
publ i c voi d agr ega( Gener o gener o) t hr ows FachadaExcept i on {
Gener o gener oBuscado;

/ / Busca el gner o en el ar chi vo con l a mi sma cl ave.
t r y {
gener oBuscado = cat al ogoGener os. obt en( gener o) ;

/ / Si l o hay, no se agr ega al ar chi vo
i f ( gener oBuscado ! = nul l )
t hr ow new FachadaExcept i on( " Gner o r epet i do" ) ;
}
cat ch ( Per si st enci aExcept i on pe) {
/ / Si el ar chi vo no exi st e no se hace nada
}

/ / Agr ega el nuevo gner o al cat l ogo
t r y {
cat al ogoGener os. agr ega( gener o) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede agr egar el gner o" , pe) ;
}
}

/ **
* Act ual i za un gner o del cat l ogo de gner os
* @par amgener o Gner o a act ual i zar
* @t hr ows FachadaExcept i on Si no se puede act ual i zar el gner o del
* cat l ogo de gner os.
*/
publ i c voi d act ual i za( Gener o gener o) t hr ows FachadaExcept i on {
/ / Act ual i za el gner o del cat l ogo
278 Entrada / Salida
ITSON Manuel Domitsu Kono
t r y {
cat al ogoGener os. act ual i za( gener o) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede act ual i zar el gner o" , pe) ;
}
}

/ **
* El i mi na un gner o del cat l ogo de gner os
* @par amgener o Gner o a el i mi nar
* @t hr ows FachadaExcept i on Si no se puede el i mi nar el gner o del
* cat l ogo de gner os.
*/
publ i c voi d el i mi na( Gener o gener o) t hr ows FachadaExcept i on {
/ / El i mi na el gner o del cat l ogo
t r y {
cat al ogoGener os. el i mi na( gener o) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede el i mi nar el gner o" , pe) ;
}
}

/ **
* Le agr ega l os at r i but os del gner o a cada canci n de l a l i st a
* @par aml i st aCanci ones Li st a de l as canci ones a l as que se l es
* agr egar l os at r i but os del gner o
* @r et ur n Vect or con l a l i st a de canci ones
* @t hr ows FachadaExcept i on Si hay un pr obl ema al conect ar se a l a
* base de dat os
*/
pr i vat e Vect or agr egaGener oCanci ones( Vect or l i st aCanci ones)
t hr ows FachadaExcept i on {
Gener o gener o;
Canci on canci on;

t r y {
/ / Par a cada canci n de l a l i st a
f or ( i nt i = 0; i < l i st aCanci ones. si ze( ) ; i ++) {
/ / Obt n l a canci n de l a l i st a
canci on = ( Canci on) l i st aCanci ones. el ement At ( i ) ;

/ / Obt en el gner o de l a canci n del cat l ogo de gner os
gener o = cat al ogoGener os. obt en( canci on. get Gener o( ) ) ;

/ / Agr ega el gner o a l a canci n
canci on. set Gener o( gener o) ;
l i st aCanci ones. set El ement At ( canci on, i ) ;
}

/ / Regr esa el vect or con l a l i st a canci ones
r et ur n l i st aCanci ones;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede obt ener l a l i st a de canci ones" ,
pe) ;
Tema 8 Entrada / Salida 279
ITSON Manuel Domitsu Kono
}
}

/ **
* Obt i ene una l i st a t odas l as canci ones
* @r et ur n Vect or con l a l i st a de t odas l as canci ones
* @t hr ows FachadaExcept i on Si no se puede obt ener l a l i st a de canci ones
*/
publ i c Vect or consul t aCanci ones( ) t hr ows FachadaExcept i on {
/ / Regr esa el vect or con l a l i st a de canci ones
t r y {
r et ur n agr egaGener oCanci ones( cat al ogoCanci ones. l i st a( ) ) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede obt ener l a l i st a de canci ones" ,
pe) ;
}
}

/ **
* Obt i ene una l i st a de t odas l as canci ones con el mi smo t t ul o.
* @par amt i t ul o Ti t ul o de l as canci ones de l a l i st a
* @r et ur n Vect or con l a l i st a de t odas l as canci ones con el mi smo
* t t ul o.
* @t hr ows FachadaExcept i on Si no se puede obt ener l a l i st a de canci ones
*/
publ i c Vect or consul t aCanci onesTi t ul o( St r i ng t i t ul o)
t hr ows FachadaExcept i on {
/ / Regr esa el vect or con l a l i st a de canci ones
t r y {
r et ur n agr egaGener oCanci ones( cat al ogoCanci ones. l i st aTi t ul o( t i t ul o) ) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede obt ener l a l i st a de canci ones" ,
pe) ;
}
}

. . .

/ **
* Obt i ene una l i st a de l os gner os de canci ones
* @r et ur n Vect or con l a l i st a de l os gner os canci ones
*/
publ i c Vect or consul t aGener osCanci ones( ) t hr ows FachadaExcept i on {
/ / Regr esa el vect or con l a l i st a de gner os de canci ones
t r y {
r et ur n cat al ogoGener os. l i st aMedi o( ' C' ) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede obt ener l a l i st a de gner os" ,
pe) ;
}
}

/ **
* Obt i ene una l i st a de l os gner os de pel cul as
280 Entrada / Salida
ITSON Manuel Domitsu Kono
* @r et ur n Vect or con l a l i st a de l os gner os pel cul as
*/
publ i c Vect or consul t aGener osPel i cul as( ) t hr ows FachadaExcept i on {
/ / Regr esa el vect or con l a l i st a de gner os de pel cul as
t r y {
r et ur n cat al ogoGener os. l i st aMedi o( ' P' ) ;
}
cat ch ( Per si st enci aExcept i on pe) {
t hr ow new FachadaExcept i on( " No se puede obt ener l a l i st a de gner os" ,
pe) ;
}
}

. . .

}

Para probar la clase FachadaBD y las clases Canci ones y Pel i cul as en su versin
que encapsulan las tablas de base de datos podemos usar la clase de prueba
Pr ueba3 vista en el Tema 5: Arreglos y Cadenas modificando slo dos lneas:

Cambiar la lnea:

i mpor t f achadas. FachadaAr r egl os;

por sta:

i mpor t f achadas. FachadaAr chi vos;

Cambiar la lnea:

I Fachada f achada = new FachadaAr r egl os( ) ;

por sta:

I Fachada f achada = new FachadaAr chi vos( ) ;

Estos dos cambios son tambin los nicos que hay que hacerle a la clase de control
Control vista en el Tema 7: Desarrollo de Aplicaciones para cambiar el mecanismo de
persistencia, obviamente tambin es necesario sustituir la clase de fachada y las clases
Canci ones, Pel i cul as y Gener os a sus versiones de archivos.

También podría gustarte