630
Capítulo 14 Archivos y fl ujos
las opciones del menú (línea 119) y almacena el resultado en la variable
OpcionMenu
llamada
tipoCuenta
.
Observe que
obtenerSolicitud
traduce el número escrito por el usuario en un objeto
OpcionMenu
, usando el
número para seleccionar un objeto
OpcionMenu
del arreglo
opciones
. En las líneas 121 a 138 se itera hasta que
el usuario especifi que que el programa debe terminar. La instrucción
switch
en las líneas 123 a 134 muestra un
encabezado para imprimir el conjunto actual de registros en la pantalla. En la línea 136 se hace una llamada al
método
leerRegistros
(líneas 22 a 67), el cual itera a través del archivo y lee todos los registros.
La línea 30 del método
leerRegistros
abre el archivo en modo de lectura con un objeto
Scanner
. Observe
que el archivo se abrirá en modo de lectura con un nuevo objeto
Scanner
cada vez que se haga una llamada a este
método, para que podamos leer de nuevo desde el principio del archivo. En las líneas 34 a 37 se lee un registro.
En la línea 40 se hace una llamada al método
debeMostrar
(líneas 70 a 85), para determinar si el registro actual
cumple con el tipo de cuenta solicitado. Si
debeMostrar
devuelve
true
, el programa muestra la información de
la cuenta. Cuando se llega al marcador de fi n de archivo, el ciclo termina y en la línea 65 se hace una llamada
al método
close
de
Scanner
para cerrar el objeto
Scanner
y el archivo. Observe que esto ocurre en un bloque
finally
, el cual se ejecutará sin importar que se haya leído o no el archivo con éxito. Una vez que se hayan leído
todos los registros, el control regresa al método
procesarSolicitudes
y se hace una llamada otra vez al método
obtenerSolicitud
(línea 137) para obtener la siguiente opción de menú del usuario. La fi gura 14.15 contiene
el método
main
, y llama al método
procesarSolicitudes
en la línea 9.
14.5.4 Actualización de archivos de acceso secuencial
En muchos archivos secuenciales, los datos no se pueden modifi car sin el riesgo de destruir otros datos en el archi-
vo. Por ejemplo, si el nombre “
White
” tuviera que cambiarse a “
Worthington
”, el nombre anterior no podría
simplemente sobrescribirse, debido a que el nuevo nombre requiere más espacio. El registro para
White
se escribió
en el archivo como
300 Pam White 0.00
Si el registro se sobrescribe empezando en la misma ubicación en el archivo que utiliza el nuevo nombre, el regis-
tro será
300 Pam Worthington 0.00
El nuevo registro es más extenso (tiene más caracteres) que el registro original. Los caracteres más allá de la segun-
da “
o
” en “
Worthington
” sobrescribirán el principio del siguiente registro secuencial en el archivo. El problema
aquí es que los campos en un archivo de texto (y por ende, los registros) pueden variar en tamaño. Por ejemplo, 7,
14, -117, 2074 y 27383 son todos valores
int
almacenados en el mismo número de bytes (4) internamente, pero
son campos con distintos tamaños cuando se muestran en la pantalla, o se escriben en un archivo como texto.
Por lo tanto, los registros en un archivo de acceso secuencial comúnmente no se actualizan por partes. En vez
de ello, generalmente se sobrescribe todo el archivo. Para realizar el cambio anterior, los registros antes de
300 Pam
White 0.00
se copian a un nuevo archivo, se escribe el nuevo registro (que puede tener un tamaño distinto al que
está sustituyendo) y se copian los registros después de
300 Pam White 0.00
al nuevo archivo. Es inconveniente
actualizar sólo un registro, pero razonable si una porción substancial de los registros necesitan actualización.
14.6 Serialización de objetos
En la sección 14.5 demostramos cómo escribir los campos individuales de un objeto
RegistroCuenta
en un
archivo como texto, y cómo leer esos campos de un archivo y colocar sus valores en un objeto
RegistroCuenta
en la memoria. En los ejemplos, se usó
RegistroCuenta
para agregar la información de un registro. Cuando las
variables de instancia de un objeto
RegistroCuenta
se enviaban a un archivo en disco, se perdía cierta infor-
mación, como el tipo de cada valor. Por ejemplo, si se lee el valor
"3"
de un archivo, no hay forma de saber si el
valor proviene de un
int
, un
String
o un
double
. En un disco sólo tenemos los datos, no la información sobre
los tipos. Si el programa que va a leer estos datos “sabe” a qué tipo de objeto corresponden, entonces simplemente
se leen y se colocan en objetos de ese tipo. Por ejemplo, en la sección 14.5.2 sabemos que introduciremos un
int
(el número de cuenta), seguido de dos objetos
String
(el primer nombre y el apellido paterno) y un
double
(el
saldo). También sabemos que estos valores se separan mediante espacios, y sólo se coloca un registro en cada
línea. Algunas veces no sabremos con exactitud cómo se almacenan los datos en un archivo. En tales casos, sería
14_MAQ_CAP_14_DEITEL.indd630
4/19/081:28:19AM