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