Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manejo de Archivos en Java
Manejo de Archivos en Java
MANEJO DE ARCHIVOS
1. Introduccin
Alejandro Reyes Marzano Pg 1
JAVA
MANEJO DE ARCHIVOS
El manejo de archi*os +persistencia,- es un tema %undamental en cual.uier len/uaje de pro/ramacin. 0ues nos permite interactuar con los dispositi*os de almacenamiento e1terno para poder mantener la in%ormacin en el tiempo. 2a*a no es una e1cepcin. Cuando se desarrollan applets para utili$ar en red- hay .ue tener en cuenta .ue la entrada3salida directa a %ichero es una *iolacin de se/uridad de acceso. 4uchos usuarios con%i/urar5n sus na*e/adores para permitir el acceso al sistema de %icheros- pero otros no. 0or otro lado- si se est5 desarrollando una aplicacin 2a*a para uso interno- probablemente ser5 necesario el acceso directo a %icheros. 2. Ficheros 0ara reali$ar operaciones sobre los %icheros- necesitamos contar con la in%ormacin re%erente sobre un %ichero +archi*o,. !a clase File proporciona muchas utilidades relacionadas con %icheros y con la obtencin de in%ormacin b5sica sobre esos %icheros.
0ara crear un objeto File nue*o- se puede utili$ar cual.uiera de los tres constructores si/uientes" Constructores de la clase File
child) ; public File(File parent, child) ; public File(URI uri) ;
ejemplo public File(String pathname) ; ne6 File+73carpeta3archi*o8,9 public File(String parent, String ne6 File+7carpeta8- 7archi*o8,9
String ne6 File+ne6 File+73carpeta8,- 7archi*e8,
El constructor utili$ado depende a menudo de otros objetos File necesarios para el acceso. 0or ejemplo- si slo se utili$a un %ichero en la aplicacin- el primer constructor es el mejor. Si en cambio- se utili$an muchos %icheros desde un mismo directorio- el se/undo o tercer constructor ser5n m5s cmodos. : si el directorio o el %ichero es una *ariable- el se/undo constructor ser5 el m5s ;til.
Una *e$ .ue se haya creado un objeto de la clase File- se puede utili$ar uno de los si/uientes m<todos para obtener in%ormacin sobre el %ichero"
Pg 2
JAVA
MANEJO DE ARCHIVOS
String getPath() String getAbsolutePath() String getParent() boolean renameTo( File nuevoNombre ) boolean exists() boolean canWrite() boolean canRead() boolean isFile() boolean isDirectory() boolean isAbsolute() long last odi!ied() long length() boolean m"dir() String#$ list()
Comprobaciones
#amos a desarrollar una pe.ue>a aplicacin .ue muestra in%ormacin sobre los %icheros pasados como ar/umentos en la l?nea de comandos"
im%ort &ava'io'() class *n!ormacionFichero + %ublic static void main( String args#$ ) thro,s *-.xce%tion + i!( args'length / 0 )+ !or( int i10) i 2 args'length) i33 )+ File ! 1 ne, File( args#i$ )) System'out'%rintln( 4Nombre5 43!'getName() )) System'out'%rintln( 46amino5 43!'getPath() )) i!( !'exists() )+ System'out'%rint( 4Fichero existente 4 )) System'out'%rint( (!'canRead() 7 4y se %uede 8eer4544))) System'out'%rint( (!'canWrite()74se %uese .scribir4544))) System'out'%rintln( 4'4 )) System'out'%rintln( 48a longitud del !ichero son 4 3!'length()34 bytes4 )) 9 else+ System'out'%rintln( 4.l !ichero no existe'4 )) 9 9 9 else System'out'%rintln( 4Debe indicar un !ichero'4 )) 9 9
%. &trea!s de Entrada @ay muchas clases dedicadas a la obtencin de entrada desde un %ichero. Este es el es.uema de la jerar.u?a de clases de entrada por %ichero"
Pg 3
JAVA
MANEJO DE ARCHIVOS
InputStream
FilterInputStream
ByteArrayInputStream
PipedInputStream
SequenceInputStream
BufferedInputStream
PushbackInputStream
ObjectInputStream
StringBufferInputStream
LineNumberInputStream
DataInputStream
FileInputStream
DataInput
ObjectInput
O jetos FileIn"ut&trea!
!a clase FileInputStream t?picamente representan %icheros de te1to accedidos en orden secuencial- byte a byte. Con FileInputStream- se puede ele/ir acceder a un byte- *arios bytes o al %ichero completo. A"ertura de un FileIn"ut&trea! 0ara abrir un FileInputStream sobre un %ichero- se le da al constructor un Strin/ o un objeto File" El ejemplo si/uiente crea dos FileInputStreams .ue est5n utili$ando el mismo archi*o de disco real. Cual.uiera de los dos constructores disponibles en esta clase puede lan$ar una File=otFoundE1ception.
*n%utStream !: 1 ne, File*n%utStream(4;archivo'txt4)) File ! 1 ne, !ile(4;archive'txt4)) *n%utStream !< 1 ne, File*n%utStream(!)) File*n%utStream !ichero1ne, File*n%utStream(4;car%eta;archive'txt4)) File !ichero 1 ne, File( 4;car%eta;archive'txt4 )) File*n%utStream !icheroSt1 ne, File*n%utStream( !ichero ))
un.ue probablemente el primer constructor es el .ue m5s se utili$a habitualmente- el se/undo permite e1aminar el archi*o m5s de cerca utili$ando sus m<todos antes de asi/narlo a un %lujo de entrada. Cuando se crea un FileInputStream- tambi<n se abre para lectura. FileInputStream sobrescribe seis de los m<todos de la clase abstracta InputStream. Si se intentan utili$ar los m<todos marA o reset en un FileInputStream se /enerar5 una IOE1ception.
Pg 4
JAVA
MANEJO DE ARCHIVOS
'ectura de un FileIn"ut&trea! Una *e$ abierto el FileInputStream- se puede leer de <l. El m<todo read() tiene muchas opciones"
int read())
!lena todo el array- si es posible. &e*uel*e el n;mero de bytes le?dos o B1 si se alcan$ el %inal del stream.
int read( byte b#$=int o!!set=int longitud )) !ee lon/itud bytes en b comen$ando por b#o!!set$. &e*uel*e
se alcan$ el %inal del stream. Cierre de FileIn"ut&trea! Cuando se termina con un %ichero- e1isten dos opciones para cerrarlo" e1pl?citamente- o impl?citamente cuando se recicla el objeto +el garbage collector se encar/a de ello,. 0ara cerrarlo e1pl?citamente- se utili$a el m<todo close()"
miFicheroSt'close())
Eje!"lo( Visuali)acin de un *ichero Si la con%i/uracin de la se/uridad de 2a*a permite el acceso a %icheros- se puede *er el contenido de un %ichero en un objeto 2Ce1t rea. El cdi/o si/uiente contiene los elementos necesarios para mostrar un %ichero"
File*n%utStream !is) >TextArea ta) %ublic void init() + byte b#$ 1 ne, byte#:0<?$) int i) ;; .l bu!!er de lectura se debe hacer lo su!icientemente grande ;; o es%erar a saber el tama@o del !ichero String s) try + !is 1 ne, File*n%utStream( 4;car%eta;archivo'txt4)) 9 catch( FileNotFound.xce%tion e ) + 9 try + i 1 !is'read( b )) 9 catch( *-.xce%tion e ) + 9
Pg 5
JAVA
s 1 ne, String( b=0 )) ta 1 ne, TextArea( s=A=?0 )) add( ta )) 9
MANEJO DE ARCHIVOS
@emos desarrollado un ejemplo- /enda.ja*a en el .ue partimos de un %ichero agenda .ue dispone de los datos .ue nosotros deseamos de nuestros ami/os- como son" nombre- tel<%ono y direccin. Si tecleamos un nombre- buscar5 en el %ichero de datos si e1iste ese nombre y presentar5 la in%ormacin .ue se haya introducido. 0ara probar- intentar .ue apare$ca la in%ormacin de 0epe.
im%ort &ava'io'() class Direccion + %rotected String nombre) %rotected String tele!ono) %rotected String direccion) Direccion( String n=String t=String d ) + nombre 1 n) tele!ono 1 t) direccion 1 d) 9 %ublic String getNombre() + return( nombre )) 9 %ublic String getTele!ono() + return( tele!ono )) 9 %ublic String getDireccion() + return( direccion )) 9 %ublic void %rint() + System'out'%rintln( nombre34Bn direccion )) 9 43tele!ono34Bn 43
class DireccionArray + %rotected Direccion lista#$) !inal int max 1 :<C) int tamano 1 0) DireccionArray() + lista 1 ne, Direccion#max$) 9 void %rintDireccion( String nombre ) +
Pg 6
JAVA
MANEJO DE ARCHIVOS
!or(int i10) i 2 tamano) i33 ) + i!( lista#i$'getNombre()'index-!( nombre ) D1 E: ) lista#i$'%rint()) 9 9
void addDireccion( Direccion direccion ) + i!( tamano 11 max ) System'exit( : )) lista#tamano33$ 1 direccion) 9 9 %ublic class Agenda + DireccionArray lista) File*n%utStream agFichero) !inal int long8inea 1 F<) %ublic static void main( String argv#$ ) + Agenda agenda 1 ne, Agenda()) agenda'bucle()) 9 Agenda() + lista 1 cargaDirecciones()) 9 void bucle() + String nombre) System'out'%rintln( 4*ntroduGca un nombre o 2.nter/4 )) try + ,hile( D44'eHuals( nombre 1 lee.ntrada( System'in ) ) ) + lista'%rintDireccion( nombre )) System'out'%rintln( 4*ntroduGca un nombre o 2.nter/4 )) 9 9 catch( .xce%tion e ) + 9 9 String lee.ntrada( *n%utStream entrada ) thro,s *-.xce%tion + byte chars#$ 1 ne, byte#long8inea$) int contador 1 0) ,hile( contador 2 long8inea II( chars#contador33$ (byte)entrada'read() ) D1 JBnJ ) i!( chars#contadorE:$ 11 E: ) return( null )) return( ne, String( chars=0=0=contadorE: ) )) 9 Direccion cargaDireccion() thro,s *-.xce%tion +
Pg
JAVA
MANEJO DE ARCHIVOS
String nombre 1 lee.ntrada( agFichero )) i!( nombre 11 null ) return( null )) String tele!ono 1 lee.ntrada( agFichero )) String direccion 1 lee.ntrada( agFichero ) 3lee.ntrada( agFichero ) 3 4Bn 4 3lee.ntrada( agFichero )) return( ne, Direccion( nombre=tele!ono=direccion ) )) 9 DireccionArray cargaDirecciones() + DireccionArray lista 1 ne, DireccionArray()) Direccion nuevaDireccion) try + agFichero 1 ne, File*n%utStream( 4agenda4 )) 9 catch( FileNotFound.xce%tion e ) + System'out'%rintln( 4No hay !ichero de Agenda4 )) return( lista )) 9 ,hile( true ) + try + nuevaDireccion 1 cargaDireccion()) i!( nuevaDireccion 11 null ) return( lista )) lista'addDireccion( nuevaDireccion )) 9 catch( .xce%tion e ) + System'out'%rintln( 4.rror cargando Agenda 4 )) System'exit( : )) 9 9 9 9
4Bn
O jetos O jectIn"ut&trea!
0ara hacer operaciones con el archi*o binario seriali$ado abierto se usa objetos de la clase ObjectInputStream- en este caso se usa para leer archi*o y se usa el m<todo readObject. Ejemplo"
%rivate A leer() thro,s *-.xce%tion= 6lassNotFound.xce%tion+ in%ut 1 ne, -b&ect*n%utStream(ne, File*n%utStream(!ila))) A ob& 1 null) i!( in%ut D1 null)+ ob& 1 (A) in%ut'read-b&ect()) 9 i! ( in%ut D1 null) in%ut'close()) return ob&) 9
O jetos +ataIn"ut&trea!
Pg !
JAVA
MANEJO DE ARCHIVOS
!os objetos &ataInputStream se comportan como los FileInputStream. !os streams de datos pueden leer cual.uiera de las *ariables de tipo nati*o- como floats- ints o chars. Deneralmente se utili$an &ataInputStream con %icheros binarios.
A"ertura # cierre de +ataIn"ut&trea!
0ara abrir y cerrar un objeto &ataInputStream- se utili$an los mismos m<todos .ue para FileInputStream"
Data*n%utStream miDStream) File*n%utStream miFStream) ;; -btiene un controlador de !ichero miFStream 1 ne, File*n%utStream 4;etc;e&em%lo'db!4 )) ;;.ncadena un !ichero de entrada de datos miDStream 1 ne, Data*n%utStream( miFStream )) ;; Ahora se %ueden utiliGar los dos streams de entrada %ara ;; acceder al !ichero (si se Huiere''') miFStream'read( b )) i 1 miDStream'read*nt()) ;; 6ierra el !ichero de datos ex%lKcitamente ;;Siem%re se cierra %rimero el !ichero stream de mayor nivel miDStream'close()) miFStream'close())
'ectura de un +ataIn"ut&trea! l acceder a un %ichero como &ataInputStream- se pueden utili$ar los mismos m<todos read() de los objetos FileInputStream. =o obstante- tambi<n se tiene acceso a otros m<todos dise>ados para leer cada uno de los tipos de datos"
byte readLyte() int readMnsignedLyte() short readShort() int readMnsignedShort() char read6har() int read*nt() long read8ong() !loat readFloat() double readDouble() String read8ine()
Cada m<todo leer5 un objeto del tipo pedido. 0ara el m<todo String readLine()- se marca el %inal de la cadena con En- Er- ErEn o con EOF. 0ara leer un long- por ejemplo"
long numeroSerie) numeroSerie 1 miDStream'read8ong())
Pg "
JAVA
MANEJO DE ARCHIVOS
dem5s del acceso a %icheros- 2a*a proporciona la posibilidad de acceder a U'!s como una %orma de acceder a objetos a tra*<s de la red. Se utili$a impl?citamente un objeto U'! al acceder a sonidos e im5/enes- con el m<todo getDocumentBase() en los applets"
String imagenFich 1 ne, String( 4imagenes;%e%e'gi!4 )) imagenes#0$ 1 get*mage( getDocumentLase()=imagenFich ))
A"ertura de un &trea! de entrada Cambi<n se puede abrir un stream de entrada a partir de un U'!. 0or ejemplo- se puede utili$ar un %ichero de datos para un applet"
*m%utStream is) byte bu!!er#$ 1 ne, byte#<?$) is 1 ne, MR8( getDocumentLase()=datos)'o%enStream())
hora se puede utili$ar is para leer in%ormacin de la misma %orma .ue se hace con un objeto FileInputStream"
is'read( bu!!er=0=bu!!er'length ))
-. &trea!s de &alida !a contrapartida necesaria de la lectura de datos es la escritura de datos. Como con los Streams de entrada- las clases de salida est5n ordenadas jer5r.uicamente"
Pg 1#
JAVA
MANEJO DE ARCHIVOS
OutputStream
ByteArrayOutputStream
FileOutputStream
FilterOutputStream
PipedOutputStream
ObjectOutputStream
BufferedOutputStream
PrintStream
DataOutputStream
ObjectOutput
DataOutput
and!mAccessFile
E1aminaremos las clases FileOut"ut&trea! y +ataOut"ut&trea! para complementar los streams de entrada .ue se han *isto.
O jetos FileOut"ut&trea!
!os objetos FileOutputStream son ;tiles para la escritura de %icheros de te1to. Como con los %icheros de entrada- primero se necesita abrir el %ichero para lue/o escribir en <l. A"ertura de un FileOut"ut&trea! 0ara abrir un objeto FileOutputStream- se tienen las mismas posibilidades .ue para abrir un %ichero stream de entrada. Se le da al constructor un Strin/ o un objeto File.
File-ut%utStream miFicheroSt) miFicheroSt 1 ne, File-ut%utStream( 4;etc;""4 ))
Pg 11
JAVA
MANEJO DE ARCHIVOS
Escritura en un FileOut"ut&trea! Una *e$ abierto el %ichero- se pueden escribir bytes de datos utili$ando el m<todo write(). Como con el m<todo read() de los streams de entrada- tenemos tres posibilidades"
void ,rite( int b )) .scribe un byte' void ,rite( byte b#$ )) .scribe todo el array= si es %osible' void ,rite( byte b#$=int o!!set=int longitud )) .scribe longitud bytes en b comenGando %or b#o!!set$'
Cierre de FileOut"ut&trea! Cerrar un stream de salida es similar a cerrar streams de entrada. Se puede utili$ar el m<todo e1pl?cito"
miFicheroSt'close())
O- se puede dejar .ue el sistema cierre el %ichero cuando se recicle miFicheroSt. Eje!"lo( Al!acena!iento de In*or!acin Este pro/rama- pre/unta al usuario una lista de nombres y n;meros de tel<%ono. Cada nombre y n;mero se a>ade a un %ichero situado en una locali$acin %ija. 0ara indicar .ue se ha introducido toda la lista- el usuario especi%ica FFinF ante la solicitud de entrada del nombre. Una *e$ .ue el usuario ha terminado de teclear la lista- el pro/rama crear5 un %ichero de salida .ue se mostrar5 en pantalla o se imprimir5. 0or ejemplo"
?OA:<F=>uanito AP?COC=8uisa :<F?AP=Pe%e F?OPQC=Antonio FA?OP<= aria
Pg 12
JAVA
MANEJO DE ARCHIVOS
brea") System'err'%rintln( 4Teclee el numero de tele!ono4 )) lee8inea( t!no )) !or( int i10) t!no#i$ D1 0) i33 ) !os',rite( t!no#i$ )) !os',rite( J=J )) !or( int i10) nombre#i$ D1 0) i33 ) !os',rite( nombre#i$ )) !os',rite( JBnJ )) 9 !os'close()) 9 %rivate static void lee8inea( byte linea#$ ) thro,s *-.xce%tion + int b 1 0) int i 1 0) ,hile( (i 2 ( long8ineaE:) ) II ( ( b 1 System'in'read() ) D1 JBnJ ) ) linea#i33$ 1 (byte)b) linea#i$ 1 (byte)0) 9
O jetos O jectOut"ut&trea!
!os objetos de la clase ObjectOutputStream nos permite escribir en el archi*o- ose proporciona un %lujo de comunicacin con los dispositi*os de almacenamiento. Ejemplo"
File !ila1ne, File(RmiArchivo'binS)) File-ut%utStream !os1ne, File-ut%utStream(!ila)) -b&ect-ut%utStream out1ne, -b&ect-ut%utStream(!os))
Si se trabaja con /ran cantidad de datos- o se escriben muchos elementos pe.ue>os- ser5 una buena idea utili$ar un stream de salida con bu%%er. !os streams con bu%%er o%recen los mismos m<todos de la clase FileOut"ut&trea!- pero toda salida se almacena en un bu%%er. Cuando se llena el bu%%er- se en*?a a disco con una ;nica operacin de escritura9 o- en caso necesario- se puede en*iar el bu%%er a disco en cual.uier momento. Creacin de &trea!s de salida con u**er 0ara crear un stream Gu%%eredOutput- primero se necesita un stream FileOutput normal9 entonces se le a>ade un bu%%er al stream"
Alejandro Reyes Marzano Pg 13
JAVA
MANEJO DE ARCHIVOS
File-ut%utStream miFileStream) Lu!!erd-ut%urStream miLu!!erStream) ;; -btiene un controlador de !ichero miFileStream 1 ne, File-ut%utStream( 4;tm%;""4 )) ;; .ncadena un stream de salida con bu!!er miLu!!erStream 1 ne, Lu!!ered-ut%utStream( miFileStream ))
Volcado # Cierre de &trea!s de salida con u**er l contrario .ue los streams FileOutput- cada escritura al bu%%er no se corresponde con una escritura en disco. menos .ue se llene el bu%%er antes de .ue termine el pro/rama- cuando se .uiera *olcar el bu%%er e1pl?citamente se debe hacer mediante una llamada a flush()"
;; Se !uerGa el volcado del bu!!er a disco miLu!!erStream'!lush()) ;; 6erramos el !ichero de datos' Siem%re se ha de cerrar %rimero el ;; !ichero stream de mayor nivel miLu!!erStream'close()) miFileStream'close())
&trea!s +ataOut"ut
2a*a tambi<n implementa una clase de salida complementaria a la clase +ataIn"ut&trea!. Con la clase &ataOutputStream- se pueden escribir datos binarios en un %ichero. A"ertura # cierre de o jetos +ataOut"ut&trea! 0ara abrir y cerrar objetos &ataOutputStream- se utili$an los mismos m<todos .ue para los objetos FileOutputStream"
Data-ut%utStream miDataStream) File-ut%utStream miFileStream) Lu!!ered-ut%utStream miLu!!erStream) ;; -btiene un controlador de !ichero miFileStream 1 ne, File-ut%utStream( 4;tm%;""4 )) ;; .ncadena un stream de salida con bu!!er (%or e!iciencia) miLu!!erStream 1 ne, Lu!!ered-ut%utStream( miFileStream )) ;; .ncadena un !ichero de salida de datos miDataStream 1 ne, Data-ut%utStream( miLu!!erStream )) ;; Ahora se %ueden utiliGar los dos streams de entrada %ara ;; acceder al !ichero (si se Huiere) miLu!!erStream',rite( b )) miDataStream',rite*nt( i )) ;; 6ierra el !ichero de datos ex%lKcitamente' Siem%re se cierra ;; %rimero el !ichero stream de mayor nivel miDataStream'close()) miLu!!erStream'close()) miFileStream'close())
Pg 14
JAVA
MANEJO DE ARCHIVOS
Escritura en un o jeto +ataOut"ut&trea! Cada uno de los m<todos write() accesibles por los FileOutputStream tambi<n lo son a tra*<s de los &ataOutputStream. Cambi<n encontrar5 m<todos complementarios a los de &ataInputStream"
void void void void void void void void void ,riteLoolean( boolean b )) ,riteLyte( int i )) ,riteShort( int i )) ,rite6har( int i )) ,rite*nt( int i )) ,riteFloat( !loat ! )) ,riteDouble( double d )) ,riteLytes( String s )) ,rite6hars( string s ))
0ara las cadenas- se tienen dos posibilidades" bytes y caracteres. @ay .ue recordar .ue los bytes son objetos de H bits y los caracteres lo son de 1I bits. Si nuestras cadenas utili$an caracteres Unicode- debemos escribirlas con writeChars(). Conta ilidad de la salida Otra %uncin necesaria durante la salida es el m<todo size(). Este m<todo simplemente de*uel*e el n;mero total de bytes escritos en el %ichero. Se puede utili$ar size() para ajustar el tama>o de un %ichero a m;ltiplo de cuatro. 0or ejemplo- de la %orma si/uiente"
int numLytes 1 miDataStream'siGe() T ?) !or( int i10) i 2 numLytes) i33 ) miDataStream',rite( 0 ))
.. Ficheros de Acceso Aleatorio menudo- no se desea leer un %ichero de principio a %in9 sino acceder al %ichero como una base de datos- donde se salta de un re/istro a otro9 cada uno en di%erentes partes del %ichero. 2a*a proporciona una clase ,ando!AccessFile para este tipo de entrada3salida.
@ay dos posibilidades para abrir un %ichero de acceso aleatorio" Con el nombre del %ichero"
miRAFile 1 ne, RandomAccessFile( String nombre=String modo ))
El ar/umento modo determina si se tiene acceso de slo lectura +r, o de lectura3escritura +r;,,. 0or ejemplo- se puede abrir un %ichero de una base de datos para actuali$acin"
Alejandro Reyes Marzano Pg 15
JAVA
MANEJO DE ARCHIVOS
Acceso a la In*or!acin
!os objetos 'andom ccessFile esperan in%ormacin de lectura3escritura de la misma manera .ue los objetos &ataInput3&ataOutput. Se tiene acceso a todas las operaciones read() y write() de las clases +ataIn"ut&trea! y +ataOut"ut&trea!. Cambi<n se tienen muchos m<todos para mo*erse dentro de un %ichero"
long getFilePointer())
Coloca el puntero del %ichero en una posicin determinada. !a posicin se da como un despla$amiento en bytes desde el comien$o del %ichero. !a posicin J marca el comien$o de ese %ichero.
long length())
&e*uel*e la lon/itud del %ichero. !a posicin length() marca el %inal de ese %ichero. Actuali)acin de In*or!acin Se pueden utili$ar %icheros de acceso aleatorio para a>adir in%ormacin a %icheros e1istentes"
miRAFile 1 ne, RandomAccessFile( 4;tm%;""'log4=4r,4 )) miRAFile'see"( miRAFile'length() )) ;; 6ualHuier ,rite() Hue hagamos a %artir de este %unto del cUdigo ;; a@adirV in!ormaciUn al !ichero
#amos a *er un pe.ue>o ejemplo- !o/.ja*a- .ue a>ade una cadena a un %ichero e1istente"
class 8og + %ublic static void main( String args#$ ) thro,s *-.xce%tion + RandomAccessFile miRAFile) String s 1 4*n!ormacion a incor%orarBnTutorial de >avaBn4) ;; Abrimos el !ichero de acceso aleatorio miRAFile 1 ne, RandomAccessFile( 4;tm%;&ava'log4=4r,4 )) ;; Nos vamos al !inal del !ichero miRAFile'see"( miRAFile'length() )) ;; *ncor%oramos la cadena al !ichero miRAFile',riteLytes( s )) ;; 6erramos el !ichero miRAFile'close()) 9 9
Pg 16
JAVA
MANEJO DE ARCHIVOS
Ejemplo J1. Crear una aplicacin usando archi*os seriali$ados con las opciones de nue*o archi*o- /uardar archi*o- /uardar como- abrir- salir- etc. Crearemos una aplicacin sencilla para poder entender mejor el uso de las clases .ue nos permite el manejo de archi*os- para ello de%inimos una clase llamado rchi*o.ja*a .ue nos permite manipular los archi*os. Esta clase es una plantilla .ue nos permite manejar cual.uier tipo de objetos seriali$ados
;( Name5 Author5 Descri%tion5 Date5 6o%yright5 ArchivoW A8.>ANDR- R.X.S ARYANes una clase Hue nos %ermite mane&ar archivos serialiGados de cualHuier ob&eto' es una %lantilla <0;0P;0Q :A5:O Z<00CE<00Q alemso!t cor%
(; %ac"age datos) im%ort &ava'io'() %ublic class Archivo 2A/+ ;((!ile sirve %ara enca%sular la interaccion de nuestros %rogramas con el sistema ( de archivos' ediante la clase File no nos limitamos a leer el contenido de un ( archivo= ademas %odemos obtener toda la in!ormacion del archivo nombre=!echa etc ((; %rivate File !ila) ;((8a clase *n%utStream nos sirve %ara leer datos del cliente(; %rivate -b&ect*n%utStream in%ut) ;((es un ob&eto Hue nos %ermite escribir en el archivo(; %rivate -b&ect-ut%utStream out%ut) ;((construye un archivo con el ob&eto !ile en la Hue se enca%sula el archivo con ( todas las %ro%iedades nombre= !echa= etc(; %ublic Archivo(File !ila) + this'!ila1!ila) 9 %rivate void escribir(A ob&) thro,s *-.xce%tion+ out%ut 1 ne, -b&ect-ut%utStream(ne, File-ut%utStream(!ila))) i! (out%ut D1 null) out%ut',rite-b&ect(ob&)) i! ( out%ut D1 null) out%ut'close()) 9 %rivate A leer() thro,s *-.xce%tion= 6lassNotFound.xce%tion+ in%ut 1 ne, -b&ect*n%utStream(ne, File*n%utStream(!ila))) A ob& 1 null) i!( in%ut D1 null)+ ob& 1 (A) in%ut'read-b&ect())
Pg 1
JAVA
9 i! ( in%ut D1 null) in%ut'close()) return ob&)
MANEJO DE ARCHIVOS
%ublic boolean salvar(A ob&etos)+ try+ i!(D!ila'exists()) !ila'createNe,File()) escribir(ob&etos)) return true) 9 catch(&ava'io'*-.xce%tion exce%cion)+ &avax's,ing'>-%tionPane'sho, essageDialog(null= 4.rror de archivo inexistenteBn43exce%cion'get essage())) return !alse) 9 9 %ublic A recu%erar()+ A aux1null) try+ aux1leer()) return aux) 9 catch(&ava'io'.-F.xce%tion eo!)+ return aux) 9 catch(&ava'io'*-.xce%tion ex)+ &avax's,ing'>-%tionPane'sho, essageDialog(null= 4.rror en la lectura de archivoBn43ex'get essage())) return aux) 9 catch (6lassNotFound.xce%tion !) + &avax's,ing'>-%tionPane'sho, essageDialog(null= 4Archivo inexistente4 3 !'get essage())) return aux) 9 9 9
.u? crearemos la clase 0ersona.ja*a- una clase seriali$ado con sus respecti*os atributos y m<todos. Es una clase sencilla pues a.u? se trata de e1plicar el uso de archi*os- ya el lector puede implementar clases mas so%isticadas de acuerdo a sus necesidades
;( Name5 Author5 Descri%tion5 Date5 PersonaW A8.>ANDR- R.X.S ARYANes una clase Hue usaremos %ara nuestra a%licacion <0;0P;0Q :A5:O
Pg 1!
JAVA
6o%yright5 (; %ac"age datos) %ublic class Persona im%lements &ava'io'SerialiGable+ %rivate String nombre) %rivate String a%ellidos) %rivate String dni) %rivate int edad) Z<00CE<00Q alemso!t cor%
MANEJO DE ARCHIVOS
;(( ([construye un ob&eto %ersona y establece los valores nulos (a los %arametros corres%ondientes(; %ublic Persona() + 9 ;(( ([construye un ob&eto %ersona y establece los atributos con los ( datos %asados como %arametro (; %ublic Persona(String nombre= String a%ellidos= String dni= int edad) + this'nombre 1 nombre) this'a%ellidos 1 a%ellidos) this'dni 1 dni) this'edad 1 edad) 9 ;(( ( [returna el nombre (; %ublic String getNombre() + return nombre) 9 ;(( ( [asigna el nombre (; %ublic void setNombre(String nombre) + this'nombre 1 nombre) 9 ;(( ( [returna las a%ellidos (; %ublic String getA%ellidos() + return a%ellidos) 9 ;(( ( [asigna los a%ellidos (; %ublic void setA%ellidos(String a%ellidos) + this'a%ellidos 1 a%ellidos) 9 ;((
Pg 1"
JAVA
( [returna el dni (; %ublic String getDni() + return dni) 9 ;(( ( [asigna el dni (; %ublic void setDni(String dni) + this'dni 1 dni) 9 ;(( ( [returna la edad (; %ublic int get.dad() + return edad) 9 ;(( ( [asigna la edad (; %ublic void set.dad(int edad) + this'edad 1 edad) 9
MANEJO DE ARCHIVOS
Clase 0ersonas.ja*a- es una clase .ue encapsula un objeto de la clase @ash4ap .ue nos permite manejar como una estructura donde se almacenaran las personas re/istradas. El lector puede implementar mas m<todos como m<todos de b;s.ueda y otros.
;( Name5 Author5 Descri%tion5 Date5 6o%yright5 PersonasW A8.>ANDR- R.X.S ARYANes una estructura de ob&etos <0;0P;0Q :A5:O Z<00CE<00Q alemso!t cor%
(; %ac"age datos) %ublic class Personas im%lements &ava'io'SerialiGable+ %rivate &ava'util'\ash a%2String =Persona/ %ersonas) %ublic Personas() + %ersonas 1ne, &ava'util'\ash a%2String =Persona/()) 9 ;(( (metodo Hue nos %ermite insertar un ob&eto %ersona a la lista de %ersonas' (recibe como %arametro un ob&eto %ersona y luego obtiene el dni como identi!icador (con ese identi!icador busca en la lista si ya se encuentra o no el ob&eto
Pg 2#
JAVA
MANEJO DE ARCHIVOS
(si lo encuentra retorna el ob&eto encontrado con ese identi!icador= si no encuentra (retorna null' .l valor se asigna en la variable aux= si es null se inserta en otro (caso no se inserta' %ara saber si inserto o se usa un boolean y se retorna ese valor(; %ublic boolean adicionarPersona(Persona %ersona)+ boolean insertado1!alse) Persona aux1getPersonas()'get(%ersona'getDni())) i!(aux11null)+ getPersonas()'%ut(%ersona'getDni()= %ersona)) insertado1true) 9 return insertado) 9 ;(( ( [returna la lista %ersonas (; %ublic &ava'util'\ash a%2String= Persona/ getPersonas() + return %ersonas) 9 ;(( ( [establece la lista %ersonas con el %arametro %asado (; %ublic void setPersonas(&ava'util'\ash a%2String= Persona/ %ersonas) + this'%ersonas 1 %ersonas) 9 %ublic void guardar(&ava'io'File !ile)+ Archivo archivo 1ne, Archivo(!ile)) archivo'salvar(%ersonas)) 9 %ublic void cargar(&ava'io'File !ile)+ Archivo archivo 1ne, Archivo(!ile)) %ersonas1(&ava'util'\ash a%2String =Persona/)archivo'recu%erar()) 9 9
;(
FrameArchivoW A8.>ANDR- R.X.S ARYANes la clase %rinci%al <0;0P;0Q :A5:O Z<00CE<00Q alemso!t cor%
(; %ac"age ventanas)
Pg 21
JAVA
im%ort datos'() im%ort &avax's,ing'() im%ort &ava'io'() %ublic class FrameArchivo extends &avax's,ing'>Frame + Personas %ersonas1ne, Personas()) %rivate >File6hooser &File6hooser-%eraciones) %rivate boolean dirty1!alse) %rivate String currFileName1null) %rivate Archivo archivo)
MANEJO DE ARCHIVOS
%ublic FrameArchivo() + su%er(4'5 ane&o de Archivos5'4)) init6om%onents()) &File6hooser-%eraciones 1 ne, >File6hooser()) this'& enu*temNuevo'addAction8istener(ne, Nuevo(this))) this'& enu*tem]uardar6'addAction8istener(ne, ]uardarArchivo(this))) this'& enu*temAbrir'addAction8istener(ne, AbrirArchivo(this))) this'& enu*temSalir'addAction8istener(ne, Salir(this))) this'& enu*tem]uardar'addAction8istener(ne, ]uardar(this))) 9 [Su%%ressWarnings(4unchec"ed4) %rivate void init6om%onents() + &Panel: 1 ne, &avax's,ing'>Panel()) &8abel: 1 ne, &avax's,ing'>8abel()) &TextFieldN-mbre 1 ne, &avax's,ing'>TextField()) &8abel< 1 ne, &avax's,ing'>8abel()) &TextFieldA%ellidos 1 ne, &avax's,ing'>TextField()) &8abelF 1 ne, &avax's,ing'>8abel()) &TextFieldDni 1 ne, &avax's,ing'>TextField()) &8abel? 1 ne, &avax's,ing'>8abel()) &TextField.dad 1 ne, &avax's,ing'>TextField()) &ScrollPane: 1 ne, &avax's,ing'>ScrollPane()) &TextArea ostrar 1 ne, &avax's,ing'>TextArea()) &LuttonAgregar 1 ne, &avax's,ing'>Lutton()) &Lutton ostrar 1 ne, &avax's,ing'>Lutton()) & enuLar: 1 ne, &avax's,ing'> enuLar()) & enu: 1 ne, &avax's,ing'> enu()) & enu*temNuevo 1 ne, &avax's,ing'> enu*tem()) & enu*temAbrir 1 ne, &avax's,ing'> enu*tem()) & enu*tem]uardar 1 ne, &avax's,ing'> enu*tem()) & enu*tem]uardar6 1 ne, &avax's,ing'> enu*tem()) &Se%arator: 1 ne, &avax's,ing'>Se%arator()) & enu*temSalir 1 ne, &avax's,ing'> enu*tem()) & enu< 1 ne, &avax's,ing'> enu()) setDe!ault6lose-%eration(&avax's,ing'Windo,6onstants'.^*T_-N_68-S.)) &Panel:'set8ayout(ne, &ava'a,t']rid8ayout(?= <= A= A))) &8abel:'setText(4Nombre4)) &Panel:'add(&8abel:)) &Panel:'add(&TextFieldN-mbre)) &8abel<'setText(4A%ellidos4))
Pg 22
JAVA
&Panel:'add(&8abel<)) &Panel:'add(&TextFieldA%ellidos)) &8abelF'setText(4Dni4)) &Panel:'add(&8abelF)) &Panel:'add(&TextFieldDni)) &8abel?'setText(4.dad4)) &Panel:'add(&8abel?)) &Panel:'add(&TextField.dad)) &TextArea ostrar'set6olumns(<0)) &TextArea ostrar'setRo,s(A)) &ScrollPane:'set`ie,%ort`ie,(&TextArea ostrar))
MANEJO DE ARCHIVOS
&LuttonAgregar'setText(4Agregar4)) &LuttonAgregar'addAction8istener(ne, &ava'a,t'event'Action8istener() + %ublic void actionPer!ormed(&ava'a,t'event'Action.vent evt) + &LuttonAgregarActionPer!ormed(evt)) 9 9)) &Lutton ostrar'setText(4 ostrar4)) &Lutton ostrar'addAction8istener(ne, &ava'a,t'event'Action8istener() + %ublic void actionPer!ormed(&ava'a,t'event'Action.vent evt) + &Lutton ostrarActionPer!ormed(evt)) 9 9)) & enu:'setText(4Archivo4)) & enu*temNuevo'setAccelerator(&avax's,ing'aeyStro"e'getaeyStro"e(&ava' a,t'event'aey.vent'`a_N= &ava'a,t'event'*n%ut.vent'6TR8_ ASa))) & enu*temNuevo'setText(4Nuevo 8ista4)) & enu:'add(& enu*temNuevo)) & enu*temAbrir'setAccelerator(&avax's,ing'aeyStro"e'getaeyStro"e(&ava' a,t'event'aey.vent'`a_A= &ava'a,t'event'*n%ut.vent'6TR8_ ASa))) & enu*temAbrir'setText(4Abrir4)) & enu:'add(& enu*temAbrir)) & enu*tem]uardar'setAccelerator(&avax's,ing'aeyStro"e'getaeyStro"e(&av a'a,t'event'aey.vent'`a_]= &ava'a,t'event'*n%ut.vent'6TR8_ ASa))) & enu*tem]uardar'setText(4]uardar4)) & enu:'add(& enu*tem]uardar)) & enu*tem]uardar6'setAccelerator(&avax's,ing'aeyStro"e'getaeyStro"e(&a va'a,t'event'aey.vent'`a_6= &ava'a,t'event'*n%ut.vent'6TR8_ ASa))) & enu*tem]uardar6'setText(4]uardar 6omo '''4)) & enu:'add(& enu*tem]uardar6)) & enu:'add(&Se%arator:)) & enu*temSalir'setText(4Salir4)) & enu:'add(& enu*temSalir)) & enuLar:'add(& enu:))
Pg 23
JAVA
MANEJO DE ARCHIVOS
& enu<'setText(4-tros4)) & enuLar:'add(& enu<)) set> enuLar(& enuLar:)) &avax's,ing']rou%8ayout layout 1 ne, &avax's,ing']rou%8ayout(get6ontentPane())) get6ontentPane()'set8ayout(layout)) layout'set\oriGontal]rou%( layout'createParallel]rou%(&avax's,ing']rou%8ayout'Alignment'8.AD* N]) 'add]rou%(layout'createSeHuential]rou%() 'add]rou%(layout'createParallel]rou%(&avax's,ing']rou%8ayout'A lignment'8.AD*N]) 'add]rou%(layout'createSeHuential]rou%() 'add6ontainer]a%() 'add6om%onent(&Panel:= &avax's,ing']rou%8ayout'PR.F.RR.D_S*Y.= <<P= &avax's,ing']rou%8ayout'PR.F.RR.D_S*Y.) 'add]a%(PO= PO= PO) 'add]rou%(layout'createParallel]rou%(&avax's,ing']rou% 8ayout'Alignment'8.AD*N]) 'add6om%onent(&Lutton ostrar) 'add6om%onent(&LuttonAgregar))) 'add]rou%(layout'createSeHuential]rou%() 'add]a%(FP= FP= FP) 'add6om%onent(&ScrollPane:= &avax's,ing']rou%8ayout'PR.F.RR.D_S*Y.= FOQ= &avax's,ing']rou%8ayout'PR.F.RR.D_S*Y.))) 'add6ontainer]a%(?:= Short' A^_`A8M.)) )) layout'set`ertical]rou%( layout'createParallel]rou%(&avax's,ing']rou%8ayout'Alignment'8.AD* N]) 'add]rou%(layout'createSeHuential]rou%() 'add6ontainer]a%() 'add]rou%(layout'createParallel]rou%(&avax's,ing']rou%8ayout'A lignment'8.AD*N]) 'add6om%onent(&Panel:= &avax's,ing']rou%8ayout'PR.F.RR.D_S*Y.= :0O= &avax's,ing']rou%8ayout'PR.F.RR.D_S*Y.) 'add]rou%(layout'createSeHuential]rou%() 'add6om%onent(&LuttonAgregar) 'add]a%(:C= :C= :C) 'add6om%onent(&Lutton ostrar))) 'add]a%(FF= FF= FF) 'add6om%onent(&ScrollPane:= &avax's,ing']rou%8ayout'PR.F.RR.D_S*Y.= <0A= &avax's,ing']rou%8ayout'PR.F.RR.D_S*Y.) 'add6ontainer]a%(&avax's,ing']rou%8ayout'D.FAM8T_S*Y.= Short' A^_`A8M.)) )) %ac"()) 9
Pg 24
JAVA
MANEJO DE ARCHIVOS
boolean !1!alse) i!(this'verString(this'datos()'getDni())) !1%ersonas'adicionarPersona(this'datos())) this'reset()) i!(D!)+ &avax's,ing'>-%tionPane'sho, essageDialog(this=4ya se encuentra registrado4)) 9 9 + %rivate void &Lutton ostrarActionPer!ormed(&ava'a,t'event'Action.vent evt) 9 this'mostrar())
%ublic static void main(String args#$) + &ava'a,t'.ventbueue'invo"e8ater(ne, Runnable() + %ublic void run() + ne, FrameArchivo()'set`isible(true)) 9 9)) 9 %rivate Persona datos()+ Persona %1ne, Persona()) String nombre1this'&TextFieldN-mbre'getText()) String a%ellidos1this'&TextFieldA%ellidos'getText()) String dni1this'&TextFieldDni'getText()) int edad1*nteger'%arse*nt(this'&TextField.dad'getText())) %'setA%ellidos(a%ellidos)) %'setDni(dni)) %'setNombre(nombre)) %'set.dad(edad)) return %) 9 %rivate boolean verString(String s)+ i!(D(s11null)) return true) return !alse) 9 %rivate void mostrar()+ String s14BnBt8ista de PersonasBn4) &ava'util'6ollection co1%ersonas'getPersonas()'values()) !or(-b&ect ob5 co)+ s31((Persona)ob)'getDni()34Bt43((Persona)ob)'getNombre()34Bt43 ((Persona)ob)'getA%ellidos()34BtBt43((Persona)ob)'get.dad()34Bn4) 9 this'&TextArea ostrar'setText(s)) 9 %rivate void reset()+
Pg 25
JAVA
this'&TextFieldA%ellidos'setText(44)) this'&TextFieldDni'setText(44)) this'&TextField.dad'setText(44)) this'&TextFieldN-mbre'setText(44)) this'&TextFieldN-mbre'reHuestFocus()) 9 %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate %rivate &avax's,ing'>Lutton &LuttonAgregar) &avax's,ing'>Lutton &Lutton ostrar) &avax's,ing'>8abel &8abel:) &avax's,ing'>8abel &8abel<) &avax's,ing'>8abel &8abelF) &avax's,ing'>8abel &8abel?) &avax's,ing'> enu & enu:) &avax's,ing'> enu & enu<) &avax's,ing'> enuLar & enuLar:) &avax's,ing'> enu*tem & enu*temAbrir) &avax's,ing'> enu*tem & enu*tem]uardar) &avax's,ing'> enu*tem & enu*tem]uardar6) &avax's,ing'> enu*tem & enu*temNuevo) &avax's,ing'> enu*tem & enu*temSalir) &avax's,ing'>Panel &Panel:) &avax's,ing'>ScrollPane &ScrollPane:) &avax's,ing'>Se%arator &Se%arator:) &avax's,ing'>TextArea &TextArea ostrar) &avax's,ing'>TextField &TextFieldA%ellidos) &avax's,ing'>TextField &TextFieldDni) &avax's,ing'>TextField &TextField.dad) &avax's,ing'>TextField &TextFieldN-mbre)
MANEJO DE ARCHIVOS
%ublic boolean saveAsFile() + this're%aint()) i! (>File6hooser'APPR-`._-PT*-N 11&File6hooser-%eraciones'sho,SaveDialog(this)) + currFileName 1 &File6hooser-%eraciones'getSelectedFile()'getPath()) this're%aint()) return saveFile()) 9 else + this're%aint()) return !alse) 9 9 ;;%ara mane&o de archivos %ublic boolean saveFile() + i!(currFileName 11 null) return saveAsFile()) try + File !ile 1 ne, File (currFileName)) this'%ersonas'guardar(!ile)) this'dirty 1 !alse) tituloA%licacion()) return true) 9
Pg 26
JAVA
catch(.xce%tion ex)+ ex'%rintStac"Trace()) 9 return !alse)
MANEJO DE ARCHIVOS
%ublic boolean cerrarA%licacion() + i!(Ddirty) return true) int value1 >-%tionPane'sho,6on!irmDialog(this= 4Desea cambios 74=4`entanita4= >-%tionPane'X.S_N-_6AN6.8_-PT*-N) ) s,itch(value) + case >-%tionPane'X.S_-PT*-N5 return saveFile()) case >-%tionPane'N-_-PT*-N5 return true) case >-%tionPane'6AN6.8_-PT*-N5 de!ault5 return !alse) 9 9 %ublic void tituloA%licacion() + String ca%tion) i! (currFileName 11 null) + ca%tion 1 48ista contactos 0:4) 9 else + ca%tion 1 currFileName) 9 i!(dirty) + ca%tion 1 4(4 3 ca%tion) 9 ca%tion 1 4contactos E 4 3 ca%tion) this'setTitle(ca%tion)) 9 %ublic void nuevo(&ava'a,t'event'Action.vent e) + i!(cerrarA%licacion()) + %ersonas1 ne, Personas()) currFileName 1 null) dirty 1 !alse) tituloA%licacion()) this'&TextArea ostrar'setText(44)) 9 9 void abrir(String !ila) + try + File !ile 1 ne, File(!ila)) this'%ersonas'cargar(!ile)) this'currFileName 1 !ila) this'dirty 1 !alse) tituloA%licacion()) 9 catch(.xce%tion ex)+
]uardar
los
Pg 2
JAVA
ex'%rintStac"Trace()) 9 9
MANEJO DE ARCHIVOS
%ublic void abrirArchivo() + i! (DcerrarA%licacion()) return) i! (>File6hooser'APPR-`._-PT*-N &File6hooser-%eraciones'sho,-%enDialog(this)) + abrir(&File6hooser-%eraciones'getSelectedFile()'getPath())) 9 this're%aint()) 9 %ublic void abre(&ava'a,t'event'Action.vent e) + abrirArchivo()) 9 %ublic void salvar6omo(&ava'a,t'event'Action.vent e) + saveAsFile()) 9 [-verride %rotected void %rocessWindo,.vent(&ava'a,t'event'Windo,.vent e) + su%er'%rocessWindo,.vent(e)) i!(e'get*D() 11 &ava'a,t'event'Windo,.vent'W*ND-W_68-S*N]) salir(null)) 9 %ublic void salir(&ava'a,t'event'Action.vent e) + i!(cerrarA%licacion()) System'exit(0)) 9 void salvar(&ava'a,t'event'Action.vent e) + saveFile()) 9 9 ;((clase %ara el mane&o de archivos(; class Nuevo im%lements &ava'a,t'event'Action8istener + FrameArchivo nuevo) %ublic Nuevo(FrameArchivo nuevo) + this'nuevo 1 nuevo) 9 [-verride %ublic void actionPer!ormed(&ava'a,t'event'Action.vent e) + nuevo'nuevo(e)) 9
11
Pg 2!
JAVA
this'abrir 1 abrir) 9
MANEJO DE ARCHIVOS
[-verride %ublic void actionPer!ormed(&ava'a,t'event'Action.vent e) + abrir'abre(e)) 9 9 class ]uardarArchivo im%lements &ava'a,t'event'Action8istener + FrameArchivo guardar) %ublic ]uardarArchivo(FrameArchivo guardar) + this'guardar 1 guardar) 9 [-verride %ublic void actionPer!ormed(&ava'a,t'event'Action.vent e)+ guardar'salvar6omo(e)) 9 9 class Salir im%lements &ava'a,t'event'Action8istener + FrameArchivo salir) %ublic Salir(FrameArchivo salir) + this'salir1salir) 9 [-verride %ublic void actionPer!ormed(&ava'a,t'event'Action.vent e) + salir'salir(e)) 9 9 class ]uardar im%lements &ava'a,t'event'Action8istener + FrameArchivo g) %ublic ]uardar(FrameArchivo g) + this'g 1 g) 9 [-verride %ublic void actionPer!ormed(&ava'a,t'event'Action.vent e) + g'salvar(e)) 9 9
0rueba" s? se *e el pro/rama
Pg 2"
JAVA
MANEJO DE ARCHIVOS
En la barra de men; ele/imos la opcin rchi*o lue/o ele/imos el men; ?tem nue*o para crear una nue*a lista de personas a re/istrar. : se creara una lista *ac?a.
. &espu<s de haber creado la lista ya podemos in/resar personas en la lista. 0ara ello ll<nanos los datos de la persona en los campos respecti*os. Como se *e en la ima/en.
Pg 3#
JAVA
MANEJO DE ARCHIVOS
!ue/o damos a/re/ar y la persona ser5 a/re/ando a la lista de personas. s? podemos se/uir in/resando mas personas a la lista.
Pg 31
JAVA
MANEJO DE ARCHIVOS
En el men; archi*o seleccionamos /uardar como es la primera *e$ puedes hacer con la opcin /uardar o /uardar como- da lo mismo pero cuando el archi*o ya e1iste y estamos trabajando con ese archi*o si .ueremos actuali$a podemos hacer con la opcin /uardar y si .ueremos /uardar con otro nombre lo hacemos con /uardar como- hay .ue tener cuidado.
Alejandro Reyes Marzano Pg 32
JAVA
MANEJO DE ARCHIVOS
!ue/o le asi/namos un nombre y seleccionamos la direccin a donde se .uiere /uardar y hacemos clicA en /uardar- si hacemos clicA en cancelar no se /uardar5.
Pg 33
JAVA
MANEJO DE ARCHIVOS
JAVA
MANEJO DE ARCHIVOS
Gueno- espero .ue les sir*a en al/o eso es todo por esta *e$.
Pg 35