You are on page 1of 37

Unidad 14.

Archivos y Flujos
14.1 Introduccin Los datos que se almacenan en variables y arreglos son temporales; se pierden cuando una variable local
queda fuera de alcance, o cuando el programa termina. Las computadoras utilizan archivos para la retencin a largo plazo de grandes cantidades de datos, incluso despus de que los programas que crearon los datos terminan de ejecutarse. Los datos persistentes que se mantienen en archivos existen m s all de la duracin de la ejecucin del programa. Las computadoras almacenan los archivos en dispositivos de almacenamiento secundario, como los discos duros.

14.2 Jerarqua de datos !l elemento de datos m s peque"o en una computadora puede asumir el valor # o $, y se le conoce como bit.
!n %ltima instancia, una computadora procesa todos los elementos de datos como combinaciones de ceros y unos. !l conjunto de caracteres de la computadora es el conjunto de todos los caracteres que se utilizan para escribir programas y representar datos. Los caracteres en &ava son 'nicode y est n compuestos de dos bytes, cada uno de los cuales se compone de ocho bits. (s) como los caracteres est n compuestos de bits, los campos se componen de caracteres o bytes. 'n campo es un grupo de caracteres o bytes que transmite un significado. Los elementos de datos procesados por las computadoras forman una jerarqu)a de datos, la cual se vuelve m s grande y compleja en estructura, a medida que progresamos de bits a caracteres, luego a campos, y as) en lo sucesivo. *or lo general, varios campos componen un registro +que se implementa como class en &ava,. 'n registro es un grupo de campos relacionados. 'n archivo es un grupo de registros relacionados. *ara facilitar la obtencin de registros espec)ficos de un archivo, se elige por lo menos un campo en cada registro como clave. 'na clave de registro identifica que un registro pertenece a una persona o entidad espec)fica, y es %nico para cada registro. !xisten muchas formas de organizar los registros en un archivo. La m s com%n se llama archivo secuencial, en el cual los registros se almacenan en orden, en base al campo clave de registro. *or lo general, a un grupo de archivos relacionados se le denomina base de datos. 'na coleccin de programas dise"ados para crear y administrar bases de datos se conoce como sistema de administracin de bases de datos +-./0,.

14.3 Archivos y flujos &ava ve a cada archivo como un flujo secuencial de bytes. 1ada sistema operativo cuenta con un mecanismo para determinar el fi n de un archivo, como un marcador de fi
n de archivo o la cuenta de los bytes totales en el archivo, que se registra en una estructura de datos administrativa, manejada por el sistema. Los flujos basados en bytes representan datos en formato binario. Los flujos basados en caracteres representan datos como secuencias de caracteres. Los archivos que se crean usando flujos basados en bytes son archivos binarios. Los archivos que se crean usando flujos basados en caracteres son archivos de texto. Los archivos de texto se pueden leer mediante editores de texto, mientras que los archivos binarios se leen mediante un programa que convierte esos datos en un formato legible para los humanos. &ava tambin puede asociar los flujos con distintos dispositivos. 2res objetos flujo se asocian con dispositivos cuando un programa de &ava empieza a ejecutarse3 0ystem.in, yste!.out y yste!.err. !l paquete java.io incluye definiciones para las clases de flujos, como FileIn"ut trea! +para la entrada basada en bytes de un archivo,, File#ut"ut trea! +para la salida basada en bytes hacia un archivo,, File$eader +para la entrada basada en caracteres de un archivo, y File%riter +para la salida basada en caracteres hacia un archivo,. Los archivos se abren creando objetos de estas clases de flujos.

14.4 &a clase File La clase 4ile se utiliza para obtener informacin acerca de los archivos y directorios. Las operaciones de entrada y salida basadas en caracteres se pueden llevar a cabo con las clases 0canner y
For!atter. La clase For!atter permite mostrar datos con formato en la pantalla, o enviarlos a un archivo, de una manera similar a yste!.out."rintf. La ruta de un archivo o directorio especifica su ubicacin en el disco. 'na ruta absoluta contiene todos los directorios, empezando con el directorio ra)z, que conducen hacia un archivo o directorio espec)fico. 1ada archivo o directorio en una unidad de disco tiene el mismo directorio ra)z en su ruta.

*or lo general, una ruta relativa empieza desde el directorio en el que se empez a ejecutar la aplicacin. 'n car cter separador se utiliza para separar directorios y archivos en la ruta.

'' Fi(. 14.4) *e!ostracionFile.java 55 -emostracin de la clase 4ile. import java.io.4ile; "u+lic class *e!ostracionFile , 55 muestra informacin acerca del archivo especificado por el usuario "u+lic void anali-ar$uta. trin( ruta / , 55 crea un objeto 4ile con base en la entrada del usuario 4ile nombre 6 ne7 4ile+ ruta ,; if + nombre.exists+, , 55 si existe el nombre, muestra informacin sobre l 8 55 muestra informacin del archivo +o directorio, 0ystem.out.printf+ 9:s:s;n:s;n:s;n:s;n:s:s;n:s:s;n:s:s;n:s:s;n:s:s9, nombre.get<ame+,, 9 existe9, + nombre.is4ile+, = 9es un archivo9 3 9no es un archivo9 ,, + nombre.is-irectory+, = 9es un directorio9 3 9no es un directorio9 ,, + nombre.is(bsolute+, = 9es ruta absoluta9 3 9no es ruta absoluta9 ,, 9'ltima modificacion3 9, nombre.last/odified+,, 92amanio3 9, nombre.length+,, 9>uta3 9, nombre.get*ath+,, 9>uta absoluta3 9, nombre.get(bsolute*ath+,, 9*adre3 9, nombre.get*arent+, ,; if + nombre.is-irectory+, , 55 muestra el listado del directorio 8 0tring directorio?@ 6 nombre.list+,; 0ystem.out.println+ 9;n;n1ontenido del directorio3;n9 ,; for + 0tring nombre-irectorio 3 directorio , 0ystem.out.printf+ 9:s;n9, nombre-irectorio ,; A 55 fin de else A 55 fin de if exterior else 55 no es archivo o directorio, muestra mensaje de error 8 0ystem.out.printf+ 9:s :s9, ruta, 9no existe.9 ,; A 55 fin de else A 55 fin del mtodo analizar>uta A 55 fin de la clase -emostracion4ile

'' Fi(. 14.0) 1rue+a*e!ostracionFile.java 1rue+a de la clase *e!ostracionFile. import java.util.0canner; import java.io.4ile; import java.net.'>B; "u+lic class 1rue+a , "u+lic static void !ain. trin( ar(s23 / , try 8 4ile test4ile 6 ne7 4ile+ 913;;booCs;;D##E;;sjhtpFe;;frame;;jhtpFG$EG4iles.fm9 ,; 0ystem.out.println+ test4ile.to'>B+,.to0tring+, ,; A catch + !xception exception , 8 0ystem.out.println+ 9exception9 ,; A A 55 end main A 55 end class *rueba

Escriba aqui el nombre del archivo o directorio: C:\Archivos de programa\Java\jdk1.6.0_01\demo\jfc jfc existe no es un archivo es un directorio es ruta absoluta Ultima modificacion: 11873244923 9 !amanio: " #uta: $:%&rchivos de 'ro(rama%)ava%jd*1+,+"-"1%demo%jfc #uta absoluta: $:%&rchivos de 'ro(rama%)ava%jd*1+,+"-"1%demo%jfc .adre: $:%&rchivos de 'ro(rama%)ava%jd*1+,+"-"1%demo $ontenido del directorio: $ode.oint/0 1ile$hooser2emo 1ont22!est )ava22 0etal3or*s 4ote'ad 5am'le!ree 5t6le'ad 53in(&''let 53in(5et2 !ableExam'le

Escriba aqui el nombre del archivo o directorio: C:\Archivos de programa\Java\jdk1.6.0_01\demo\jfc\Java2D\readme.txt readme+txt existe es un archivo no es un directorio es ruta absoluta Ultima modificacion: 11873244912"3 !amanio: 7 18 #uta: $:%&rchivos de 'ro(rama%)ava%jd*1+,+"-"1%demo%jfc%)ava22%readme+txt #uta absoluta: $:%&rchivos de 'ro(rama%)ava%jd*1+,+"-"1%demo%jfc%)ava22%readme+txt .adre: $:%&rchivos de 'ro(rama%)ava%jd*1+,+"-"1%demo%jfc%)ava22

14.0 Archivos de te4to de acceso secuencial &ava no impone una estructura en un archivo; las nociones como los registros no existen como parte del
lenguaje de &ava. !l programador debe estructurar los archivos para satisfacer los requerimientos de una aplicacin. *ara obtener datos de un archivo en forma secuencial, los programas com%nmente empiezan a leer desde el principio del archivo y leen todos los datos en forma consecutiva, hasta encontrar la informacin deseada. Los datos en muchos archivos secuenciales no se pueden modificar sin el riesgo de destruir otros datos en el archivo. *or lo tanto, los registros en un archivo de acceso secuencial normalmente no se actualizan directamente en su ubicacin. !n vez de ello, se vuelve a escribir el archivo completo.

'' Fi(. 14.0) $e(istro5uenta.java Una clase que re"resenta un re(istro de infor!acin pacCage com.deitel.jhtpF.cap$E; 55 se empaqueta para reutilizarla "u+lic class $e(istro5uenta , private int cuenta; private 0tring primer<ombre; private 0tring apellido*aterno; private double saldo; "u+lic $e(istro5uenta./ , 55 el constructor sin argumentos llama a otro constructor con valores predeterminados this+ #, 99, 99, #.# ,; 55 llama al constructor con cuatro argumentos A 55 fin del constructor de >egistro1uenta sin argumentos 55 inicializa un registro "u+lic $e(istro5uenta. int cta6 trin( no!+re6 trin( a"ellido6 dou+le sal / , establecer1uenta+ cta ,; establecer*rimer<ombre+ nombre ,; establecer(pellido*aterno+ apellido ,; establecer0aldo+ sal ,; A 55 fin del constructor de >egistro1uenta con cuatro argumentos

Figura 14.6 | #e(istro$uenta mantiene la informacin para una cuenta. (Parte 1 de 2).

55 establece el n%mero de cuenta "u+lic void esta+lecer5uenta. int cta / , cuenta 6 cta; A 55 fin del mtodo establecer1uenta 55 obtiene el n%mero de cuenta "u+lic int o+tener5uenta./ , return cuenta; A 55 fin del mtodo obtener1uenta 55 establece el primer nombre "u+lic void esta+lecer1ri!er7o!+re. trin( no!+re / , primer<ombre 6 nombre; A 55 fin del mtodo establecer*rimer<ombre 55 obtiene el primer nombre "u+lic trin( o+tener1ri!er7o!+re./ , return primer<ombre; A 55 fin del mtodo obtener*rimer<ombre 55 establece el apellido paterno "u+lic void esta+lecerA"ellido1aterno. trin( a"ellido / , apellido*aterno 6 apellido; A 55 fin del mtodo establecer(pellido*aterno 55 obtiene el apellido paterno "u+lic trin( o+tenerA"ellido1aterno./ , return apellido*aterno; A 55 fin del mtodo obtener(pellido*aterno 55 establece el saldo "u+lic void esta+lecer aldo. dou+le sal / , saldo 6 sal; A 55 fin del mtodo establecer0aldo 55 obtiene el saldo "u+lic dou+le o+tener aldo./ , return saldo; A 55 fin del mtodo obtener0aldo A 55 fin de la clase >egistro1uenta

Figura 14.6 | #e(istro$uenta mantiene la informacin para una cuenta. (Parte 2 de 2).

88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
'' Fi(. 14.9) 5rearArchivo:e4to.java 55 'so de la clase 4ormatter para escribir datos en un archivo de texto. import java.io.4ile<ot4ound!xception; import java.lang.0ecurity!xception; import java.util.4ormatter; import java.util.4ormatter1losed!xception; import java.util.<o0uch!lement!xception; import java.util.0canner; import com.deitel.jhtpF.cap$E.>egistro1uenta; "u+lic class 5rearArchivo:e4to , "rivate For!atter salida; '' o+jeto usado "ara enviar te4to al archivo

Figura 14.7 | Creacin de un archivo de texto secuencial. (Parte 1 de 2).

55 permite al usuario abrir el archivo "u+lic void a+rirArchivo./ , try , salida 6 ne7 4ormatter+ 9clientes.txt9 ,; < 55 fin de try catch . ecurity=4ce"tion security=4ce"tion / , 0ystem.err.println+ 9<o tiene acceso de escritura a este archivo.9 ,; 0ystem.exit+ $ ,; A 55 fin de catch catch . File7otFound=4ce"tion files7otFound=4ce"tion / , 0ystem.err.println+ 9!rror al crear el archivo.9 ,; 0ystem.exit+ $ ,; A 55 fin de catch A 55 fin del mtodo abrir(rchivo 55 agrega registros al archivo "u+lic void a(re(ar$e(istros./ , 55 objeto que se va a escribir en el archivo >egistro1uenta registro 6 ne7 >egistro1uenta+,; 0canner entrada 6 ne7 0canner+ 0ystem.in ,; 0ystem.out.printf+ 9:s;n:s;n:s;n:s;n;n9, 9*ara terminar la entrada, escriba el indicador de fin de archivo 9, 9cuando se le pida que escriba los datos de entrada.9, 9!n '<BH5Linux5/ac I0 H escriba JctrlK d y oprima Bntro9, 9!n Lindo7s escriba JctrlK z y oprima Bntro9 ,; 0ystem.out.printf+ 9:s;n:s9, 9!scriba el numero de cuenta +K #,, primer nombre, apellido paterno y saldo.9, 9= 9 ,; >hile . entrada.has7e4t./ / , 55 itera hasta encontrar el indicador de fin de archivo try , 55 env)a valores al archivo 55 obtiene los datos que se van a enviar registro.establecer1uenta+ entrada.nextBnt+, ,; 55 lee el n%mero de cuenta registro.establecer*rimer<ombre+ entrada.next+, ,; 55 lee el primer nombre registro.establecer(pellido*aterno+ entrada.next+, ,; 55 lee el apellido paterno registro.establecer0aldo+ entrada.next-ouble+, ,; 55 lee el saldo if . re(istro.o+tener5uenta./ ? @ / , 55 escribe el nuevo registro salida.format+ 9:d :s :s :.Df;n9, registro.obtener1uenta+,, registro.obtener*rimer<ombre+,, registro.obtener(pellido*aterno+,, registro.obtener0aldo+, ,; A 55 fin de if else , 0ystem.out.println+ 9!l numero de cuenta debe ser mayor que #.9 ,; A 55 fin de else A 55 fin de try catch . For!atter5losed=4ce"tion for!atter5losed=4ce"tion / , 0ystem.err.println+ 9!rror al escribir en el archivo.9 ,; return; A 55 fin de catch catch . 7o uch=le!ent=4ce"tion ele!ent=4ce"tion / , 0ystem.err.println+ 9!ntrada invalida. Bntente de nuevo.9 ,; entrada.nextLine+,; 55 descarta la entrada para que el usuario intente de nuevo A 55 fin de catch 0ystem.out.printf+ 9:s :s;n:s9, 9!scriba el numero de cuenta +K #,,9, 9primer nombre, apellido paterno y saldo.9, 9= 9 ,; A 55 fin de 7hile A 55 fin del mtodo agregar>egistros "u+lic void cerrarArchivo./ , if + salida M6 null , salida.close+,; A 55 fin del mtodo cerrar(rchivo A 55 fin de la clase 1rear(rchivo2exto 55 cierra el file

Figura 14.7 | Creacin de un archivo de texto secuencial. (Parte 2 de 2).

'' Fi(. 14.A) 1rue+a5rearArchivo:e4to.java

1rue+a de la clase 5rearArchivo:e4to.

"u+lic class 1rue+a5rearArchivo:e4to , "u+lic static void !ain. trin( ar(s23 / , 1rear(rchivo2exto aplicacion 6 ne7 1rear(rchivo2exto+,; aplicacion.abrir(rchivo+,; aplicacion.agregar>egistros+,; aplicacion.cerrar(rchivo+,; A 55 fin de main A 55 fin de la clase *rueba1rear(rchivo2exto

.ara terminar la entrada7 escriba el indicador de fin de archivo cuando se le 'ida que escriba los datos de entrada+ En U4/89:inux90ac ;5 8 escriba <ctrl= d 6 o'rima /ntro En >indo3s escriba <ctrl= ? 6 o'rima /ntro Escriba el numero de cuenta B 100 o! Jo"es 2#.$% Escriba el numero de cuenta B 200 &teve Doe '(#).6* Escriba el numero de cuenta B (00 +am ,hite 0.00 Escriba el numero de cuenta B #00 &am &to"e '#2.16 Escriba el numero de cuenta B )00 &-e .ich 22#.62 Escriba el numero de cuenta B /0 @= "A7 'rimer nombre7 a'ellido 'aterno 6 saldo+ @= "A7 'rimer nombre7 a'ellido 'aterno 6 saldo+ @= "A7 'rimer nombre7 a'ellido 'aterno 6 saldo+ @= "A7 'rimer nombre7 a'ellido 'aterno 6 saldo+ @= "A7 'rimer nombre7 a'ellido 'aterno 6 saldo+ @= "A7 'rimer nombre7 a'ellido 'aterno 6 saldo+

14.0.2 5!o leer datos de un archivo de te4to de acceso secuencial

'' Fi(. 14.11) &eerArchivo:e4to.java =ste "ro(ra!a lee un archivo de te4to y !uestra cada re(istro. import java.io.4ile; import java.io.4ile<ot4ound!xception; import java.lang.Bllegal0tate!xception; import java.util.<o0uch!lement!xception; import java.util.0canner; import com.deitel.jhtpF.cap$E.>egistro1uenta; "u+lic class &eerArchivo:e4to , private 0canner entrada; 55 permite al usuario abrir el archivo "u+lic void a+rirArchivo./ , try , entrada 6 ne7 0canner+ ne7 4ile+ 9clientes.txt9 , ,; A 55 fin de try catch . File7otFound=4ce"tion file7otFound=4ce"tion / , 0ystem.err.println+ 9!rror al abrir el archivo.9 ,; 0ystem.exit+ $ ,; A 55 fin de catch A 55 fin del mtodo abrir(rchivo 55 lee registro del archivo "u+lic void leer$e(istros./ , 55 objeto que se va a escribir en la pantalla >egistro1uenta registro 6 ne7 >egistro1uenta+,; 0ystem.out.printf+ 9:NOs:N$Ps:N$Qs:$#s;n9, 91uenta9, 9*rimer nombre9, 9(pellido paterno9, 90aldo9 ,; try 55 lee registros del archivo, usando el objeto 0canner 8 >hile . entrada.has7e4t./ / , registro.establecer1uenta+ entrada.nextBnt+, ,; 55 lee el n%mero de cuenta registro.establecer*rimer<ombre+ entrada.next+, ,; 55 lee el primer nombre registro.establecer(pellido*aterno+ entrada.next+, ,; 55 lee el apellido paterno registro.establecer0aldo+ entrada.next-ouble+, ,; 55 lee el saldo 55 muestra el contenido del registro 0ystem.out.printf+ 9:NOd:N$Ps:N$Qs:$#.Df;n9, registro.obtener1uenta+,, registro.obtener*rimer<ombre+,, registro.obtener(pellido*aterno+,, registro.obtener0aldo+, ,; A 55 fin de 7hile A 55 fin de try catch . 7o uch=le!ent=4ce"tion ele!ent=4ce"tion / , 0ystem.err.println+ 9!l archivo no esta bien formado.9 ,; entrada.close+,; 0ystem.exit+ $ ,; A 55 fin de catch catch . Ille(al tate=4ce"tion state=4ce"tion / , 0ystem.err.println+ 9!rror al leer del archivo.9 ,; 0ystem.exit+ $ ,; A 55 fin de catch A 55 fin del mtodo leer>egistros "u+lic void cerrarArchivo./ , 55 cierra el archivo y termina la aplicacin if + entrada M6 null , entrada.close+,; 55 cierra el archivo A 55 fin del mtodo cerrar(rchivo A 55 fin de la clase Leer(rchivo2exto

'' Fi(. 14.12) 1rue+a&eerArchivo:e4to.java

=ste "ro(ra!a "rue+a la clase &eerArchivo:e4to.

"u+lic class 1rue+a&eerArchivo:e4to , "u+lic static void !ain. trin( ar(s23 / , Leer(rchivo2exto aplicacion 6 ne7 Leer(rchivo2exto+,; aplicacion.abrir(rchivo+,; aplicacion.leer>egistros+,; aplicacion.cerrar(rchivo+,; A 55 fin de main A 55 fin de la clase *ruebaLeer(rchivo2exto

1uenta $## D## R## E## P##

*rimer nombre .ob 0teve *am 0am 0ue

(pellido paterno &ones -oe Lhite 0tone >ich

0aldo DE.OQ NREP.SF #.## NED.$S DDE.SD

14.0.3 =je!"lo "rBctico) un "ro(ra!a de solicitud de crCdito

'' Fi(. 14.13) #"cionDenu.java

*efine un ti"o enu! "ara las o"ciones del "ro(ra!a de consulta de crCdito.

"u+lic enu! #"cionDenu , 55 declara el contenido del tipo enum 0(L-IG1!>I+ $ ,, 0(L-IG1>!-B2I+ D ,, 0(L-IG-!.B2I+ R ,, 4B<+ E ,; private final int valor; 55 opcin actual del men% #"cionDenu. int valor#"cion / , valor 6 valorIpcion; A 55 fin del constructor del tipo enum Ipcion/enu "u+lic int o+tenerEalor./ , return valor; A 55 fin del mtodo obtenerTalor A 55 fin del tipo enum Ipcion/enu

'' Fi(. 14.14) 5onsulta5redito.java !ste programa lee un archivo secuencialmente y muestra su contenido con base en el tipo 55de cuenta que solicita el usuario +saldo con crdito, saldo con dbito o saldo de cero,. import java.io.4ile; import java.io.4ile<ot4ound!xception; import java.lang.Bllegal0tate!xception; import java.util.<o0uch!lement!xception; import java.util.0canner; import com.deitel.jhtpF.cap$E.>egistro1uenta; public class 1onsulta1redito 8 private Ipcion/enu tipo1uenta; private 0canner entrada; private Ipcion/enu opciones?@ 6 8 Ipcion/enu.0(L-IG1!>I, Ipcion/enu.0(L-IG1>!-B2I, Ipcion/enu.0(L-IG-!.B2I, Ipcion/enu.4B< A;

Figura 14.14 | Programa de consulta de crdito. (Parte 1 de 3).

55 lee los registros del archivo y muestra slo los registros del tipo apropiado "rivate void leer$e(istros./ , 55 objeto que se va a escribir en el archivo >egistro1uenta registro 6 ne7 >egistro1uenta+,; try 8 55 lee registros 55 abre el archivo para leer desde el principio entrada 6 ne7 0canner+ ne7 4ile+ 9clientes.txt9 , ,; >hile . entrada.has7e4t./ / , 55 recibe los valores del archivo registro.establecer1uenta+ entrada.nextBnt+, ,; 55 lee n%mero de cuenta registro.establecer*rimer<ombre+ entrada.next+, ,; 55 lee primer nombre registro.establecer(pellido*aterno+ entrada.next+, ,; 55 lee apellido paterno registro.establecer0aldo+ entrada.next-ouble+, ,; 55 lee saldo 55 si el tipo de cuenta es apropiado, muestra el registro if + debe/ostrar+ registro.obtener0aldo+, , , 0ystem.out.printf+ 9:N$#d:N$Ds:N$Ds:$#.Df;n9, registro.obtener1uenta+,, registro.obtener*rimer<ombre+,, registro.obtener(pellido*aterno+,, registro.obtener0aldo+, ,; A 55 fin de 7hile A 55 fin de try catch . 7o uch=le!ent=4ce"tion ele!ent=4ce"tion / , 0ystem.err.println+ 9!l archivo no esta bien formado.9 ,; entrada.close+,; 0ystem.exit+ $ ,; A 55 fin de catch catch . Ille(al tate=4ce"tion state=4ce"tion / , 0ystem.err.println+ 9!rror al leer del archivo.9 ,; 0ystem.exit+ $ ,; A 55 fin de catch catch . File7otFound=4ce"tion file7otFound=4ce"tion / , 0ystem.err.println+ 9<o se puede encontrar el archivo.9 ,; 0ystem.exit+ $ ,; A 55 fin de catch finally 8 if + entrada M6 null , entrada.close+,; 55 cierra el objeto 0canner y el archivo A 55 fin de finally A 55 fin del mtodo leer>egistros 55 usa el tipo de registro para determinar si el registro debe mostrarse "rivate +oolean de+eDostrar. dou+le saldo / , if + + tipo1uenta 66 Ipcion/enu.0(L-IG1>!-B2I , UU + saldo J # , , return true; else if + + tipo1uenta 66 Ipcion/enu.0(L-IG-!.B2I , UU + saldo K # , , return true; else if + + tipo1uenta 66 Ipcion/enu.0(L-IG1!>I , UU + saldo 66 # , , return true; return false; A 55 fin del mtodo debe/ostrar 55 obtiene solicitud del usuario "rivate #"cionDenu o+tener olicitud./ , 0canner texto!nt 6 ne7 0canner+ 0ystem.in ,; int solicitud 6 $;

Figura 14.14 | Programa de consulta de crdito. (Parte 2 de 3).

55 muestra opciones de solicitud 0ystem.out.printf+ 9;n:s;n:s;n:s;n:s;n:s;n9, 9!scriba solicitud9, 9 $ N Lista de cuentas con saldos de cero9, 9 D N Lista de cuentas con saldos con credito9, 9 R N Lista de cuentas con saldos con debito9, 9 E N 4inalizar ejecucion9 ,; try 55 trata de recibir la opcin del men% 8 do 55 recibe solicitud del usuario 8 0ystem.out.print+ 9;n= 9 ,; solicitud 6 texto!nt.nextBnt+,; A 7hile + + solicitud J $ , VV + solicitud K E , ,; A 55 fin de try catch . 7o uch=le!ent=4ce"tion ele!ent=4ce"tion / , 0ystem.err.println+ 9!ntrada invalida.9 ,; 0ystem.exit+ $ ,; A 55 fin de catch return opciones? solicitud N $ @; 55 devuelve valor de enum para la opcin A 55 fin del mtodo obtener0olicitud "u+lic void "rocesar olicitudes./ , 55 obtiene la solicitud del usuario +saldo de cero, con crdito o con dbito, tipo1uenta 6 obtener0olicitud+,; >hile . ti"o5uenta FG #"cionDenu.FI7 / , s>itch . ti"o5uenta / , case 0(L-IG1!>I3 0ystem.out.println+ 9;n1uentas con saldos de cero3;n9 ,; breaC; case 0(L-IG1>!-B2I3 0ystem.out.println+ 9;n1uentas con saldos con credito3;n9 ,; breaC; case 0(L-IG-!.B2I3 0ystem.out.println+ 9;n1uentas con saldos con debito3;n9 ,; breaC; A 55 fin de s7itch leer>egistros+,; tipo1uenta 6 obtener0olicitud+,; A 55 fin de 7hile A 55 fin del mtodo procesar0olicitudes A 55 fin de la clase 1onsulta1redito

55 4ig. $E.$P3 *rueba1onsulta1redito.java 55 !ste programa prueba la clase 1onsulta1redito. "u+lic class 1rue+a5onsulta5redito , "u+lic static void !ain. trin( ar(s23 / , 1onsulta1redito aplicacion 6 ne7 1onsulta1redito+,; aplicacion.procesar0olicitudes+,; A 55 fin de main A 55 fin de la clase *rueba1onsulta1redito

<

Escriba solicitud 1 C :ista de cuentas con saldos de cero 2 C :ista de cuentas con saldos con credito 3 C :ista de cuentas con saldos con debito 4 C 1inali?ar ejecuciDn B 1 $uentas con saldos de cero: 3"" .am >hite "+"" Escriba solicitud 1 C :ista de cuentas con saldos de cero 2 C :ista de cuentas con saldos con credito 3 C :ista de cuentas con saldos con debito 4 C 1inali?ar ejecuciDn B 2 $uentas con saldos con credito: 2"" 5teve 2oe C34 +,7 4"" 5am 5tone C42+1, Escriba solicitud 1 C :ista de cuentas con saldos de cero 2 C :ista de cuentas con saldos con credito 3 C :ista de cuentas con saldos con debito 4 C 1inali?ar ejecuciDn B ( $uentas con saldos con debito: 1"" Eob )ones 24+98 "" 5ue #ich 224+,2 B #

14.H eriali-acin de o+jetos

&ava cuenta con un mecanismo llamado 0erializacin de objetos, el cual permite escribir o leer objetos completos mediante un flujo. 'n objeto serializado es un objeto que se representa como una secuencia de bytes, e incluye los datos del objeto, as) como informacin acerca del tipo del objeto y los tipos de datos almacenados en el mismo. 'na vez que se escribe un objeto serializado en un archivo, se puede leer del archivo y deserializarse; es decir, se puede utilizar la informacin de tipo y los bytes que representan al objeto para recrearlo en la memoria. Las clases #+jectIn"ut trea! y #+ject#ut"ut trea!, que implementan en forma respectiva a las interfaces #+jectIn"ut y #+ject#ut"ut, permiten leer o escribir objetos completos de5a un flujo +posiblemente un archivo,. 0lo las clases que implementan a la interfaz 0erializable pueden serializarse y deserializarse con objetos #+ject#ut"ut trea! y #+jectIn"ut trea!.

'' Fi(. 14.19) $e(istro5uenta eriali-a+le.java Una clase que re"resenta un re(istro de infor!acin. pacCage com.deitel.jhtpF.cap$E; 55 empaquetada para reutilizarla import java.io.0erializable; "u+lic class $e(istro5uenta eriali-a+le i!"le!ents eriali-a+le , private int cuenta; private 0tring primer<ombre; private 0tring apellido*aterno; private double saldo; 55 el constructor sin argumentos llama al otro constructor con valores predeterminados "u+lic $e(istro5uenta eriali-a+le./ , this+ #, 99, 99, #.# ,; A 55 fin del constructor de >egistro1uenta0erializable sin argumentos

14.H.1 5reacin de un archivo de acceso secuencial !ediante el uso de la eriali-acin de o+jetos

Figura 14.17 | a clase #e(istro$uenta5eriali?able para los o!"etos seriali#a!les. (Parte 1 de 2).

55 el constructor con cuatro argumentos inicializa un registro "u+lic $e(istro5uenta eriali-a+le. int cta6 trin( no!+re6 trin( a"ellido6 dou+le sal / , establecer1uenta+ cta ,; establecer*rimer<ombre+ nombre ,; establecer(pellido*aterno+ apellido ,; establecer0aldo+ sal ,; A 55 fin del constructor de >egistro1uenta0erializable con cuatro argumentos "u+lic void esta+lecer5uenta. int cta / , cuenta 6 cta; A 55 fin del mtodo establecer1uenta 55 establece el n%mero de cuenta

"u+lic int o+tener5uenta./ , 55 obtiene el n%mero de cuenta return cuenta; A 55 fin del mtodo obtener1uenta "u+lic void esta+lecer1ri!er7o!+re. trin( no!+re / , primer<ombre 6 nombre; A 55 fin del mtodo establecer*rimer<ombre "u+lic trin( o+tener1ri!er7o!+re./ , return primer<ombre; A 55 fin del mtodo obtener*rimer<ombre 55 establece el primer nombre

55 obtiene el primer nombre

"u+lic void esta+lecerA"ellido1aterno. trin( a"ellido / , apellido*aterno 6 apellido; A 55 fin del mtodo establecer(pellido*aterno "u+lic trin( o+tenerA"ellido1aterno./ , return apellido*aterno; A 55 fin del mtodo obtener(pellido*aterno "u+lic void esta+lecer aldo. dou+le sal / , saldo 6 sal; A 55 fin del mtodo establecer0aldo

55 establece el apellido paterno

55 obtiene el apellido paterno

55 establece el saldo

"u+lic dou+le o+tener aldo./ , 55 obtiene el saldo return saldo; A 55 fin del mtodo obtener0aldo A 55 fin de la clase >egistro1uenta0erializable

Figura 14.17 | a clase #e(istro$uenta5eriali?able para los o!"etos seriali#a!les. (Parte 2 de 2). 88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
'' Fi(. 14.1I) 5rearArchivo ecuencial.java =scritura de o+jetos en for!a secuencial a un archivo6 con la clase #+ject#ut"ut trea!. import java.io.4ileIutput0tream; import java.io.BI!xception; import java.io.IbjectIutput0tream; import java.util.<o0uch!lement!xception; import java.util.0canner; import com.deitel.jhtpF.cap$E.>egistro1uenta0erializable; "u+lic class 5rearArchivo ecuencial , private IbjectIutput0tream salida; 55 env)a los datos a un archivo

4igura $E.$Q V (rchivo secuencial creado mediante IbjectIutput0tream. +*arte $ de D,.

"u+lic void a+rirArchivo./ , 55 permite al usuario especificar el nombre del archivo try 8 55 abre el archivo salida 6 ne7 IbjectIutput0tream+ ne7 4ileIutput0tream+ 9clientes.ser9 , ,; A 55 fin de try catch . I#=4ce"tion io=4ce"tion / , 0ystem.err.println+ 9!rror al abrir el archivo.9 ,; A 55 fin de catch A 55 fin del mtodo abrir(rchivo "u+lic void a(re(ar$e(istros./ , 55 agrega registros al archivo >egistro1uenta0erializable registro; 55 objeto que se va a escribir al archivo int numero1uenta 6 #; 55 n%mero de cuenta para el objeto registro 0tring primer<ombre; 55 primer nombre para el objeto registro 0tring apellido*aterno; 55 apellido paterno para el objeto registro double saldo; 55 saldo para el objeto registro 0canner entrada 6 ne7 0canner+ 0ystem.in ,; 0ystem.out.printf+ 9:s;n:s;n:s;n:s;n;n9, 9*ara terminar de introducir datos, escriba el indicador de fin de archivo 9, 91uando se le pida que introduzca los datos.9, 9!n '<BH5Linux5/ac I0 H escriba JctrlK d y oprima Bntro9, 9!n Lindo7s escriba JctrlK z y oprima Bntro9 ,; 0ystem.out.printf+ 9:s;n:s9, 9!scriba el numero de cuenta +K #,, primer nombre, apellido y saldo.9, 9= 9 ,; >hile . entrada.has7e4t./ / , 55 itera hasta el indicador de fin de archivo try , 55 env)a los valores al archivo numero1uenta 6 entrada.nextBnt+,; 55 lee el n%mero de cuenta primer<ombre 6 entrada.next+,; 55 lee el primer nombre apellido*aterno 6 entrada.next+,; 55 lee el apellido paterno saldo 6 entrada.next-ouble+,; 55 lee el saldo if . nu!ero5uenta ? @ / , 55 crea un registro nuevo registro 6 ne7 >egistro1uenta0erializable+ numero1uenta, primer<ombre, apellido*aterno, saldo ,; salida.7riteIbject+ registro ,; 55 env)a el registro como salida A 55 fin de if else 8 0ystem.out.println+ 9!l numero de cuenta debe ser mayor de #.9 ,; A 55 fin de else A 55 fin de try catch . I#=4ce"tion io=4ce"tion / , 0ystem.err.println+ 9!rror al escribir en el archivo.9 ,; return; A 55 fin de catch catch . 7o uch=le!ent=4ce"tion ele!ent=4ce"tion / , 0ystem.err.println+ 9!ntrada invalida. Bntente de nuevo.9 ,; entrada.nextLine+,; 55 descarta la entrada para que el usuario intente de nuevo A 55 fin de catch 0ystem.out.printf+ 9:s :s;n:s9, 9!scriba el numero de cuenta +K#,,9, 9primer nombre, apellido y saldo.9, 9= 9 ,; A 55 fin de 7hile A 55 fin del mtodo agregar>egistros "u+lic void cerrarArchivo./ , 55 cierra el archivo y termina la aplicacin try 8 55 cierra el archivo if + salida M6 null , salida.close+,; A 55 fin de try catch . I#=4ce"tion io=4ce"tion / , 0ystem.err.println+ 9!rror al cerrar el archivo.9 ,; 0ystem.exit+ $ ,; A 55 fin de catch A 55 fin del mtodo cerrar(rchivo A 55 fin de la clase 1rear(rchivo0ecuencial

'' Fi(. 14.1A) 1rue+a5rearArchivo ecuencial.java '' 1rue+a de la clase 5rearArchivo ecuencial. public class *rueba1rear(rchivo0ecuencial 8 public static void main+ 0tring args?@ , 8 1rear(rchivo0ecuencial aplicacion 6 ne7 1rear(rchivo0ecuencial+,; aplicacion.abrir(rchivo+,; aplicacion.agregar>egistros+,; aplicacion.cerrar(rchivo+,; A 55 fin de main A 55 fin de la clase *rueba1rear(rchivo0ecuencial

.ara terminar de introducir datos7 escriba el indicador de que introdu?ca los datos+ En U4/89:inux90ac ;5 8 escriba <ctrl= d 6 o'rima /ntro En >indo3s escriba <ctrl= ? 6 o'rima /ntro Escriba el numero de cuenta @= "A7 'rimer nombre7 a'ellido B 100 o! Jo"es 2#.$% Escriba el numero de cuenta @= "A7 'rimer nombre7 a'ellido B 200 &teve Doe '(#).6* Escriba el numero de cuenta @= "A7 'rimer nombre7 a'ellido B (00 +am ,hite 0.00 Escriba el numero de cuenta @= "A7 'rimer nombre7 a'ellido B #00 &am &to"e '#2.16 Escriba el numero de cuenta @= "A7 'rimer nombre7 a'ellido B )00 &-e .ich 22#.62 Escriba el numero de cuenta @= "A7 'rimer nombre7 a'ellido B /0

fin de archivo cuando se le 'ida

6 saldo+ 6 saldo+ 6 saldo+ 6 saldo+ 6 saldo+ 6 saldo+

14.H.2 &ectura y deseriali-acin de datos de un archivo de acceso ecuencial

'' Fi(. 14.2@) &eerArchivo ecuencial.java 55 !ste programa lee un archivo de objetos en forma secuencial y muestra cada registro. import java.io.!I4!xception; import java.io.4ileBnput0tream; import java.io.BI!xception; import java.io.IbjectBnput0tream; import com.deitel.jhtpF.cap$E.>egistro1uenta0erializable; "u+lic class &eerArchivo ecuencial , private IbjectBnput0tream entrada; 55 permite al usuario seleccionar el archivo a abrir "u+lic void a+rirArchivo./ , try , 55 abre el archivo entrada 6 ne7 IbjectBnput0tream+ ne7 4ileBnput0tream+ 9clientes.ser9 , ,; A 55 fin de try catch . I#=4ce"tion io=4ce"tion / , 0ystem.err.println+ 9!rror al abrir el archivo.9 ,; A 55 fin de catch A 55 fin del mtodo abrir(rchivo 55 lee el registro del archivo "u+lic void leer$e(istros./ , >egistro1uenta0erializable registro; 0ystem.out.printf+ 9:N$#s:N$Ps:N$Ps:$#s;n9, 91uenta9, 9*rimer nombre9, 9(pellido paterno9, 90aldo9 ,;

Figura 14.20 | ectura de un archivo secuencial$ usando un o!"eto ;bject/n'ut5tream. (Parte 1 de 2).

try , 55 recibe los valores del archivo >hile . true / , registro 6 + >egistro1uenta0erializable , entrada.readIbject+,; 55 muestra el contenido del registro 0ystem.out.printf+ 9:N$#d:N$Ps:N$Ps:$$.Df;n9, registro.obtener1uenta+,, registro.obtener*rimer<ombre+,, registro.obtener(pellido*aterno+,, registro.obtener0aldo+, ,; A 55 fin de 7hile A 55 fin de try catch . =#F=4ce"tion end#fFile=4ce"tion / , return; 55 se lleg al fin del archivo A 55 fin de catch catch . 5lass7otFound=4ce"tion class7otFound=4ce"tion / , 0ystem.err.println+ 9<o se pudo crear el objeto.9 ,; A 55 fin de catch catch . I#=4ce"tion io=4ce"tion / , 0ystem.err.println+ 9!rror al leer del archivo.9 ,; A 55 fin de catch A 55 fin del mtodo leer>egistros 55 cierra el archivo y termina la aplicacin "u+lic void cerrarArchivo./ , try , 55 cierra el archivo y sale if + entrada M6 null , entrada.close+,; 0ystem.exit+ # ,; A 55 fin de try catch . I#=4ce"tion io=4ce"tion / , 0ystem.err.println+ 9!rror al cerrar el archivo.9 ,; 0ystem.exit+ $ ,; A 55 fin de catch A 55 fin del mtodo cerrar(rchivo A 55 fin de la clase Leer(rchivo0ecuencial

Figura 14.20 | ectura de un archivo secuencial$ usando un o!"eto ;bject/n'ut5tream. (Parte 2 de 2).
55 4ig. $E.D$3 *ruebaLeer(rchivo0ecuencial.java 55 !ste programa prueba la clase >ead0equential4ile. "u+lic class 1rue+a&eerArchivo ecuencial , "u+lic static void !ain. trin( ar(s23 / , Leer(rchivo0ecuencial aplicacion 6 ne7 Leer(rchivo0ecuencial+,; aplicacion.abrir(rchivo+,; aplicacion.leer>egistros+,; aplicacion.cerrar(rchivo+,; A 55 fin de main A 55 fin de la clase *ruebaLeer(rchivo0ecuencial

14.9 5lases adicionales de java.io La interfaz #+ject#ut"ut contiene el mtodo >rite#+ject, el cual recibe un objeto #+ject que
implementa a la interfaz 0erializable como argumento y escribe su informacin en un objeto #ut"ut trea!. La interfaz #+jectIn"ut contiene el mtodo read#+ject, que lee y devuelve una referencia a un objeto #+ject de un objeto In"ut trea!. 'na vez que se ha le)do un objeto, su referencia puede convertirse al tipo actual del objeto. !l uso de b%fer es una tcnica para mejorar el rendimiento de !50. 1on un objeto Juffered#ut"ut trea!, cada instruccin de salida no necesariamente produce una transferencia f)sica real de datos al dispositivo de salida. !n vez de ello, cada operacin de salida se dirige hacia una regin en memoria llamada b%fer, la cual es lo bastante grande como para contener los datos de muchas operaciones de salida. La

transferencia actual al dispositivo de salida se realiza entonces en una sola operacin de salida f)sica extensa cada vez que se llena el b%fer. 1on un objeto JufferedIn"ut trea!, muchos trozos WlgicosX de datos de un archivo se leen como una sola operacin de entrada f)sica extensa y se colocan en un b%fer de memoria. ( medida que un programa solicita cada nuevo trozo de datos, se obtiene del b%fer. 1uando el b%fer est vac)o, se lleva a cabo la siguiente operacin de entrada f)sica real desde el dispositivo de entrada, para leer el nuevo grupo de trozos WlgicosX de datos.

14.I A+rir archivos con JFile5hooser La clase JFile5hooser se utiliza para mostrar un cuadro de di logo, que permite a los usuarios de un
programa seleccionar archivos con facilidad, mediante una Y'B.
'' Fi(. 14.22) *e!ostracionFile.java import java.a7t..orderLayout; import java.a7t.event.(ction!vent; import java.a7t.event.(ctionListener; import java.io.4ile; import javax.s7ing.&4ile1hooser; import javax.s7ing.&4rame; import javax.s7ing.&Iption*ane; import javax.s7ing.&0croll*ane; import javax.s7ing.&2ext(rea; import javax.s7ing.&2ext4ield; *e!ostracin de la clase File.

"u+lic class *e!ostracionFile e4tends JFra!e , private &2ext(rea area0alida; 55 se utiliza para salida private &0croll*ane panel-espl; 55 se utiliza para que la salida pueda desplazarse 55 establece la Y'B "u+lic *e!ostracionFile./ , super+ 9*rueba de la clase 4ile9 ,; area0alida 6 ne7 &2ext(rea+,; 55 agrega area0alida a panel-espl panel-espl 6 ne7 &0croll*ane+ area0alida ,; add+ panel-espl, .orderLayout.1!<2!> ,; 55 agrega panel-espl a la Y'B set0ize+ E##, E## ,; 55 establece el tama"o de la Y'B setTisible+ true ,; 55 muestra la Y'B analizar>uta+,; 55 crea y analiza un objeto 4ile A 55 fin del constructor de -emostracion4ile 55 permite al usuario especificar el nombre del archivo "rivate File o+tenerArchivo./ , 55 muestra el cuadro de di logo de archivos, para que el usuario pueda elegir el archivo a abrir &4ile1hooser selector(rchivos 6 ne7 &4ile1hooser+,; selector(rchivos.set4ile0election/ode+ &4ile1hooser.4BL!0G(<-G-B>!12I>B!0 ,;

Figura 14.22 | %emostracin de )1ile$hooser. (Parte 1 de 2).

int resultado 6 selector(rchivos.sho7Ipen-ialog+ this ,; 55 si el usuario hizo clic en el botn 1ancelar en el cuadro de di logo, regresa if + resultado 66 &4ile1hooser.1(<1!LGI*2BI< , 0ystem.exit+ $ ,; 4ile nombre(rchivo 6 selector(rchivos.get0elected4ile+,; 55 obtiene el archivo seleccionado 55 muestra error si es inv lido if . . no!+reArchivo GG null / KK . no!+reArchivo.(et7a!e./.equals. LL / / / , &Iption*ane.sho7/essage-ialog+ this, 9<ombre de archivo inv lido9, 9<ombre de archivo inv lido9, &Iption*ane.!>>I>G/!00(Y! ,; 0ystem.exit+ $ ,; A 55 fin de if return nombre(rchivo; A 55 fin del mtodo obtener(rchivo 55 muestra informacin acerca del archivo que especifica el usuario "u+lic void anali-ar$uta./ , 55 crea un objeto 4ile basado en la entrada del usuario 4ile nombre 6 obtener(rchivo+,; if . no!+re.e4ists./ / , 55 si el nombre existe, muestra informacin sobre l 55 muestra la informacin sobre el archivo +o directorio, area0alida.set2ext+ 0tring.format+ 9:s:s;n:s;n:s;n:s;n:s:s;n:s:s;n:s:s;n:s:s;n:s:s9, nombre.get<ame+,, 9 existe9, + nombre.is4ile+, = 9es un archivo9 3 9no es un archivo9 ,, + nombre.is-irectory+, = 9es un directorio9 3 9no es un directorio9 ,, + nombre.is(bsolute+, = 9es una ruta absoluta9 3 9no es una ruta absoluta9 ,, 9'ltima modificacion3 9, nombre.last/odified+,, 92amanio3 9, nombre.length+,, 9>uta3 9, nombre.get*ath+,, 9>uta absoluta3 9, nombre.get(bsolute*ath+,, 9*adre3 9, nombre.get*arent+, , ,; if . no!+re.is*irectory./ / , 55 imprime el listado del directorio 0tring directorio?@ 6 nombre.list+,; area0alida.append+ 9;n;n1ontenido del directorio3;n9 ,; for + 0tring nombre-irectorio 3 directorio , area0alida.append+ nombre-irectorio Z 9;n9 ,; A 55 fin de else A 55 fin de if exterior else 55 no es archivo ni directorio, imprime mensaje de error 8 &Iption*ane.sho7/essage-ialog+ this, nombre Z 9 no existe.9, 9!>>I>9, &Iption*ane.!>>I>G/!00(Y! ,; A 55 fin de else A 55 fin del mtodo analizar>uta A 55 fin de la clase -emostracion4ile

'' Fi(. 14.23) 1rue+a*e!ostracionFile.java import javax.s7ing.&4rame;

1rue+a de la clase *e!ostracionFile.

"u+lic class 1rue+a*e!ostracionFile , "u+lic static void !ain. trin( ar(s23 / , -emostracion4ile aplicacion 6 ne7 -emostracion4ile+,; aplicacion.set-efault1loseIperation+ &4rame.!HB2GI<G1LI0! ,; A 55 fin de main A 55 fin de la clase *rueba-emostracion4ile