!"#$%& ()*+,& -$ ".,/+0&* $# 1"0" Basta ahoia touos los uatos que ciebamos en nuestios piogiamas solamente existian uuiante la ejecucion ue los mismos. Cuanuo saliamos uel piogiama, touo lo que habiamos geneiauo se peiuia. A veces nos inteiesaiia que la viua ue los uatos fueia ms all que la ue los piogiamas que los geneiaion. Es uecii, que al salii ue un piogiama los uatos geneiauos queuaian guaiuauos en algn lugai que peimitieia su iecupeiacion uesue el mismo u otios piogiamas. Poi tanto, queiiiamos que uichos uatos fueian !"#$%$&"'&"$. En este capitulo veiemos el uso bsico ue aichivos en }ava paia conseguii peisistencia ue uatos. Paia ello piesentaiemos conceptos bsicos sobie aichivos y algunas ue las clases ue la biblioteca estnuai ue }ava paia su cieacion y manipulacion. Auems, el uso ue esas bibliotecas nos obligai a intiouucii algunos conceptos "avanzauos" ue piogiamacion en }ava: las excepciones, paia tiatai posibles eiioies uuiante la ejecucion ue un piogiama, y manipulacion ue uatos a bajo nivel, paia tiansfoimai nuestios uatos a vectoies ue bytes. !" #$ &'(&)*+' ,) -.&/01' Los piogiamas usan vaiiables paia almacenai infoimacion: los uatos ue entiaua, los iesultauos calculauos y valoies inteimeuios geneiauos a lo laigo uel clculo. Toua esta infoimacion es efimeia: cuanuo acaba el piogiama, touo uesapaiece. Peio, paia muchas aplicaciones, es impoitante pouei almacenai uatos ue maneia peimanente. Cuanuo se uesea guaiuai infoimacion ms all uel tiempo ue ejecucion ue un piogiama lo habitual es oiganizai esa infoimacion en uno o vaiios ficheios almacenauos en algn sopoite ue almacenamiento peisistente. 0tias posibiliuaues como el uso ue bases ue uatos utilizan aichivos como sopoite paia el almacenamiento ue la infoimacion. 2'3 -.&/01'3 ,)3,) )$ 4-5' (01)$ Besue el punto ue vista ue ms bajo nivel, pouemos uefinii un aichivo (o ficheio) como: !" $%"&'"(% )* +,(- ./0.$*".)%- *" '" ),-1%-,(,2%3 4 .$$*-,+/* . (5.26- )* '" $.0,"% )* .$$*-% 71.(8".0*9 :'* /% ,)*"(,;,$.< Es uecii, un conjunto ue us y 1s que iesiue fueia ue la memoiia uel oiuenauoi, ya sea en el uisco uuio, un penuiive, un CB, entie otios. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 2 Esa veision ue bajo nivel, si bien es completamente cieita, uesue el punto ue vista ue la piogiamacion ue aplicaciones, es uemasiauo simple. Poi ello uefiniiemos vaiios ciiteiios paia uistinguii uiveisas subcategoiias ue aichivos. Estos tipos ue aichivos se uifeienciain uesue el punto ue vista ue la piogiamacion: caua uno ue ellos piopoicionai uifeientes funcionaliuaues (mtouos) paia su manipulacion. #$ &.0+).0' ,)$ &'(+)(0,' Sabemos que es uifeiente manipulai nmeios que Stiings, aunque en el fonuo ambos acaben sienuo bits en la memoiia uel oiuenauoi. Poi eso, cuanuo manipulamos aichivos, uistinguiiemos uos clases ue aichivos uepenuienuo uel tipo ue uatos que contienen: Los aichivos ue caiacteies (o ue texto) Los aichivos ue bytes (o binaiios) 0n ;,$8*5% )* (*=(% es aqul foimauo exclusivamente poi caiacteies y que, poi tanto, pueue cieaise y visualizaise usanuo un euitoi. Las opeiaciones ue lectuia y esciituia tiabajain con caiacteies. Poi ejemplo, los ficheios con couigo java son ficheios ue texto. En cambio un ;,$8*5% +,".5,% ya no est foimauo poi caiacteies sino que los bytes que contiene pueuen iepiesentai otias cosas como nmeios, imgenes, soniuo, etc. #$ &.0+).0' ,)$ 6',' ,) -&&)3' Existen uos mouos bsicos ue acceso a la infoimacion conteniua en un aichivo: Secuencial Acceso uiiecto En el 0%)% -*$'*"$,./ la infoimacion uel aichivo es una secuencia ue bytes (o caiacteies) ue maneia que paia acceuei al byte (o caictei) i- simo se ha ue habei acceuiuo anteiioimente a los i-1 anteiioies. 0n ejemplo ue acceso secuencial lo hemos visto con la clase StiingTokenizei. El mouo ue .$$*-% ),5*$(% nos peimite acceuei uiiectamente a la infoimacion uel byte i-simo. 0n ejemplo muy conociuo ue acceso uiiecto lo tenemos con los vectoies (aiiays). 7" 2'3 -.&/01'3 ,)3,) 8-1- En }ava, los uistintos tipos ue ficheios se uifeiencian poi las clases que usaiemos paia iepiesentailos y manipulailos. Como las clases que usaiemos peitenecen a la biblioteca estnuai uel lenguaje, su uso es Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez S algo ms complejo que las ue las clases ue la ACN, ya que su uiseo se ha iealizauo pensanuo en su uso inuustiial. Las clases que usaiemos paia el tiatamiento ue ficheios estn ubicauas en el paquete ()*)+%, poi lo que ueben sei impoitauas. Auems, el couigo que tiabaja con aichivos ha ue consiueiai que muchas cosas pueuen ii mal cuanuo se tiabaja con ellos: el aichivo pueue estai coiiupto, alguien ha uesconectauo el penuiive a meuio ejecutai uel piogiama, es un uisco en ieu y sta ha caiuo, o no tiene ms espacio paia almacenai infoimacion, etc. Es poi ello que, aunque ue foima bieve, uebeiemos intiouucii el mecanismo estnuai en }ava paia tiatai con los eiioies que pueuen uaise en nuestio piogiamas: las excepciones. 9.-+-60)(+' ,) )..'.)3: $-3 );&)*&0'()3 Las excepciones son un mecanismo que peimite a los mtouos inuicai que algo "anomalo" ha suceuiuo que impiue su coiiecto funcionamiento, ue maneia que quien los ha invocauo pueue uetectai la situacion eiionea. Becimos en este caso, que el mtouo ha -)'.)/, (thiow) una excepcion. Cuanuo esto suceue, en vez ue seguii con la ejecucion noimal ue instiucciones, se busca hacia atis en la secuencia ue llamauas 1 si hay alguna que quieia )&#)!)#-) (catch). Si ninguna ue las llamauas ueciue atiapaila, el piogiama acaba su ejecucion y se infoima al usuaiio uel eiioi que se ha piouuciuo la excepcion y que nauie ha tiatauo. Nuchas ue las excepciones que existen en }ava, poi ejemplo, uiviuii poi u, son "01"!1%,'"$ "' &%"3!, /" "("141%5' (iuntime exceptions) y no obligan a que el piogiamauoi las tiate explicitamente (claio que si el couigo no las tiata y uuiante la ejecucion uel piogiama se piouucen, el piogiama finalizai con un "bonito" mensaje ue eiioi). En }ava, existe otio tipo ue excepciones, las uenominauas "01"!1%,'"$ 1,3!#,6)/)$ (checkeu exceptions), que obligan al piogiamauoi que uentio uel couigo ue un mtouo invoca una instiuccion que pueue lanzaila a o bien atiapai uicha excepcion (colocanuo uicha instiuccion en un bloque ̍)&19) o bien, ueclaiai en la cabeceia uel mtouo que uicho mtouo pueue lanzai esa excepcion (usanuo una ueclaiacion &9#,:$).
1 El concepto ue secuencia ue llamauas, ue hecho la !%-) /" --)3)/)$, fue piesentauo ya en el tema ue iecuisiviuau cuanuo tiazbamos la ejecucion ue un piogiama iecuisivo. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 4 El objetivo es hacei que el piogiamauoi no pueua "olviuaise" ue tiatai las muchas situaciones anomalas que se pueuan piouucii uuiante la ejecucion ue un piogiama. 9.-+-60)(+' 306*$0<0&-,' ,) );&)*&0'()3 No es tema piopio ue esta asignatuia piofunuizai en el manejo ue excepciones, asi que lo que veiemos sei un &#)&)3%"'&, 347 $%3!-%;%1)/, ue las mismas, hacienuo lo minimo paia que }ava u poi coiiectos nuestios piogiamas. Paia ello, el couigo que manipule los ficheios, tenui la siguiente estiuctuia: ! !"# # $ %&'()& *+, -./, 0 1/-1- ,2 3(45,/& 6 7 $%!$& ()*+,$-.$!/01 -,2 # 8 %9'()& *+, 1/-1- ,2 ,//&/ : 7 La iuea intuitiva ue esta constiuccion es: %'&"'&) (tiy) ejecutai esas instiucciones y, en caso ue piouuciise un eiioi en el tiatamiento ue los ficheios (se ha lanzauo una <=>01"!&%,'), )&#)!) (catch) ese eiioi y ejecuta el couigo ue coiieccion. Nosotios simplificaiemos el couigo ue coiieccion y solamente esciibiiemos un mensaje. Si en vez ue tiatai el eiioi nosotios queiemos inuicai que nuestio mtouo pueue lanzai excepciones, en su cabeceia ponuiemos: ! ;+.2(4 (<1 =,15&'>5-1%-<>5/&?@;-/-=AB !&"034 )*+,$-.!/01 # $ 6 %9'()& *+, 1/-1- 3(45,/&A ;,/& <& -1/-;- CDEF4,;1(&< 8 : 7 Como touos los ejemplos que veiemos sobie ficheios utilizan estos mecanismos, no aauiiemos aqui ejemplos ue su utilizacion. =" 2)&+>.- ,) <0&/).'3 3)&>)(&0-$)3 ,) +);+' Be caia a piesentai la manipulacion ue ficheios secuenciales ue texto, piesentaiemos un pioblema y su solucion y, sobie la solucion, comentaiemos las opeiaciones que hemos usauo. ?.'4$)6-: &'(+-. -*-.0&0'()3 ,) ,01).3-3 $)+.-3 El pioblema consistii en: uauo un ficheio ue texto, contai el nmeio ue veces que apaiecen una seiie ue letias en l. Como siempie, lo uificil es la estiategia, en este caso: Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez S Suponuiemos que tanto el nombie uel ficheio, como los caiacteies a consiueiai son constantes en el piogiama. Leeiemos caua uno ue los caiacteies hasta llegai al ltimo. Si est en los caiacteies a consiueiai, inciementamos el contauos asociauo a ese caictei. Como la paite ue contai no tiene uemasiauo que vei con lo ue los ficheios, lo mejoi es sepaiailo en otia clase (cuyo uiseo e implementacion queuai como ejeicicio). Con estas iueas, la solucion uel pioblema seiia: ! ;+.2(4 42-AA %&+<1(<)G&4-2A ,F1,<'A %&<A&2,H/&)/-= # $ 6 ;/(I-1, A1-1(4 J1/(<) KCLEMNOPE Q R(<;+1S1F1RT 8 ;/(I-1, A1-1(4 J1/(<) GD%OLJ Q R-,(&+RT : U ;+.2(4 I&(' /+<@B # V !"# # W %5-/%&+<1,/ 4&+<1,/A Q <,? %5-/%&+<1,/@GD%OLJX 3-2A,BT 5 6/7-8-%9-" /1.:! ; 1-3 6/7-8-%9-"(6)<+=>?@+2A BC /1! 4 Q /1.:!D"-%9(2A !! ?5(2, @ $ E; FB B # !$ 4&+<1,/AS4&+<1C3>-/),1,'@@45-/B 4BT BG $ ; /1.:!D"-%9(2A !8 7 BH /1.:!D$704-(2A !U ;/(<12<@4&+<1,/AS1&J1/(<)@BBT !V 7 $%!$& ()*+,$-.!/01 -,2 # !W ;/(<12<@RJ&=,15(<) .-' 5-A 5-;;,<',' YZ@RBT ![ 7 $\ 7 $! 7 Comentemos las lineas ms ielevantes: ?8@A Befinimos las constantes paia el nombie ue ficheio y paia las vocales a contai. B 7 CB8CD: Como cualquieia ue las instiucciones que manipulan el ficheio pueue uai un eiioi, enceiiamos touo el couigo uel iun en un bloque tiy-catch. EA cieamos un contauoi paia los caiacteies uel Stiing uauo (en este caso las vocales). El paimetio booleano inuica que no queiemos ignoiai uifeiencias entie maysculas y minsculas. D: cieamos una instancia ue F%-"G")/"# paia leei los caiacteies uel ficheio. En este punto uecimos que el ficheio est abieito y piepaiauo paia que leamos caiacteies ue l. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 6 CHA el mtouo #")/IJ lee el siguiente caictei en el ficheio ue entiaua. Paia pouei inuicai que se ha llegauo al final uel ficheio, en vez ue uevolvei un caictei, uevuelve un enteio. Asi, pueue usai el *)-,# 8C !)#) %'/%1)# K4" ', K4"/)' 3L$ 1)#)1&"#"$ !,# -""#. CC8C@: mientias no hemos llegauo al final uel ficheio hemos ue tiatai el caictei actual y leei el siguiente. CM: contamos el caictei actual (ya que sabemos que no eia el final uel ficheio). Toua la paite ue sabei si es uno ue los caiacteies a consiueiai ya la hai la clase ChaiCountei. C?: leemos el siguiente caictei en la entiaua. CNA uespus ue habei tiatauo touo el ficheio lo ceiiamos usanuo en mtouo 1-,$"IJ+ Esto es especialmente impoitante cuanuo esciibimos, peio mantenei abieitos ficheios que ya no necesitamos cuesta iecuisos al sistema. CO: esciibimos los contauoies. @'4.) ('64.)3 ,) -.&/01'3A &-60('3 ,) -&&)3' B ,)6C3 Aunque a simple vista paiezca una tonteiia, una ue las cosas que ms complica el couigo que tiabaja sobie aichivos no es la manipulacion ue su conteniuo sino la gestion ue su nombie. El motivo es que caua sistema opeiativo usa convenciones uifeientes paia iefeiiise a un nombie ue ficheio. Poi ejemplo, en sistemas tipo 0nix tenemos: ]^A,/]_=)(=,<&]H/&)$]K(2,EF-=;2,]A/4]P-(<S_-I- y en un sistema tipo Winuows %Y`^A,/`_=)(=,<&`H/&)$`K(2,EF-=;2,`A/4`P-(<S_-I- Asi que hacei couigo que funcione inuepenuientemente uel sistema es, cuanuo menos, teuioso. Es poi ello que, paia simplificai, los nombies ue ficheios que usaiemos no contenuin camino alguno ue acceso, lo que hai que estn ubicauos en el uiiectoiio iaiz uel pioyecto. Si queiis apienuei ms sobie la manipulacion ue los nombies ue ficheio en java consultau la uocumentacion ue la clase la clase ()*)+%,+F%-" que es la encaigaua ue manipulai nombies ue aichivo, iutas ue acceso e incluso cieai y listai uiiectoiios 2 . La ueclaiacion uel ficheio ue entiaua usanuo explicitamente la clase File seiia:
2 Y es un ejemplo ue mala eleccion ue nombie, ya que lo que tiata son o bien los nombies ue ficheios (uebeiia llamaise FileName) o, uesue un punto ue vista ue bajo nivel, las uenominauas entiauas uel sistema ue ficheios uel sistema opeiativo (poi lo que FileEntiy tambin seiia un buen nombie). Piogiamacion 2 Cuiso 2u1u2u11
D+.'3 6E+','3 0(+).)3-(+)3 ,) F0$)G)-,). Si los buscis estn uefiniuos en la clase InputStieamReauei que es extenuiua poi FileReauei %'& #")/I19)#PQ 64;R %'& ,;;$"&R %'& -"'S&9J Este mtouo lee como mximo length caiacteies uel aichivo y los coloca en el vectoi buf a paitii ue la posicion offset. Bevuelve el nmeio ue caiacteies leiuos, o -1 inuicanuo la finalizacion uel aichivo. %'& #")/I19)#PQ 64;J Como la anteiioi peio usanuo u como offset i buf.length como length. T&#%'S S"&>'1,/%'SIJ Bevuelve el nombie uel sistema ue couificacion usauo paia conveitii los us y 1s uel ficheio en caiacteies. @'4.) $-3 &',0<0&-&0'()3 ,) &-.-&+).)3 0n tema que tambin soslayaiemos es el ue las couificaciones usauas paia iepiesentai los caiacteies y que es otia ue las gianues complicaciones existentes al tiatai ficheios. El pioblema es simple ue enunciai: existen uiveisas maneias ue asignai a un caictei S un pation ue bits (que es lo que acaba sienuo leiuo o esciito en un ficheio) est claio que paia que touo funcione coiiectamente, quin esciibe un ficheio y quien lo lee han ue usai el mismo ciiteiio En }ava existen vaiias clases paia iepiesentai estas couificaciones, y veisiones ue los constiuctoies ue ficheios que peimiten elegii la couificacion a usai. Nosotios no inuicaiemos couificacion alguna y, si geneiamos los ficheios en la misma mquina que los consumimos, no uebeiiamos tenei pioblema alguno. 2- 1).30H( I-1-(J-,-K ,)$ 6036' *.'4$)6- En la solucion anteiioi, hemos simplificauo el tiatamiento ue los eiioies a lo minimo que hay que hacei paia logiai que el piogiama sea un piogiama }ava coiiecto.
S Similaies pioblemas suceuen en el caso ue otios tipos ue uatos como int, uouble, etc. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 8 Peio que el piogiama sea coiiecto no quieie uecii que la solucion sea peifecta. En este apaitauo os mostiai como seiia el tiatamiento ue excepciones coiiecto y la foima iuiomtica en }ava ue hacei la lectuia. Piimeio el piogiama: $ ;+.2(4 42-AA %&+<1(<)G&4-2A ,F1,<'A %&<A&2,H/&)/-= # 6 8 ;/(I-1, A1-1(4 3(<-2 J1/(<) KCLEMNOPE Q R(<;+1S1F1RT : ;/(I-1, A1-1(4 3(<-2 J1/(<) GD%OLJ Q R-,(&+RT U V ;+.2(4 I&(' /+<O'I-<4,'@B # W 6/7-8-%9-" /1.:! ; 1:77T [ !"# # !\ %5-/%&+<1,/ 4&+<1,/A Q <,? %5-/%&+<1,/@GD%OLJX 3-2A,BT !! (<;+1 Q <,? K(2,a,-',/@KCLEMNOPEBT !$ (<1 4T !6 ?5(2, @ ($ ; /1.:!D"-%9(22 E; FB B # !8 4&+<1,/AS4&+<1C3>-/),1,'@@45-/B 4BT !: 7 !U ;/(<12<@4&+<1,/ABT !V 7 $%!$& (6/7->0!60:19+,$-.!/01 -,2 # !W ;/(<12<@RH/&.2,=A &;,<(<) R b KCLEMNOPEBT ![ 7 $%!$& ()*+,$-.!/01 -,2 # $\ ;/(<12<@RH/&.2,=A /,-'(<) R b KCLEMNOPEBT $! 7 I/1%77# # $$ !"# # JG I/7-D$704-(2A $8 7 $%!$& ()*+,$-.!/01 -,2 # $: ;/(<12<@RH/&.2,=A 42&A(<) R b KCLEMNOPEBT $U 7 $V 7 $W 7 $[ 7 L" #3&.0+>.- ,) <0&/).'3 3)&>)(&0-$)3 ,) +);+' Como veiemos, los conceptos son similaies, tan solo cambia la clase ue ficheio (ahoia es FileWiitei) y, en vez ue leei, esciibimos. ?.'4$)6-: ,-,- >(- &-,)(- ,) +);+'A )3&.040.$- -$ .)1E3 )( >( <0&/).' La estiategia en este caso es: Peuii una cauena al usuaiio. Recoiieila ue atis hacia uelante e ii esciibienuo en el ficheio los caiacteies que vamos encontianuo Al final, ceiiai el ficheio. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 9 Es uecii: ! ;+.2(4 42-AA c-4d?-/'Ae/(1,/ ,F1,<'A %&<A&2,H/&)/-= # $ 6 ;/(I-1, A1-1(4 J1/(<) KCLEMNOPE Q R.-4d?-/'AS1F1RT 8 : ;+.2(4 I&(' /+<@B # U !"# # V J1/(<) 1,F1 Q /,-'L(<,@RE<1,/ - 1,F1Y RBT K 6/7-L"/!-" 0:!.:! ; 1-3 6/7-L"/!-"(6)<+=>?@+2A [ 3&/@(<1 (Q1,F1S2,<)15@BZ!T (fQ\T (ZZB # BC 0:!.:!D3"/!-(!-,!D$&%"?!(/22A !! 7 BJ 0:!.:!D$704-(2A !6 7 $%!$& ()*+,$-.!/01 -,2 # !8 ;/(<12<@RJ&=,15(<) .-' 5-A 5-;;,<',' YZ@RBT !: 7 !U 7 !V 7 Comentemos las lineas ms ielevantes: O 7 C?A paia simplificai usaiemos la misma estiuctuia ue bloque tiy-catch que en el caso ue la lectuia. E: ahoia paia manipulai el ficheio usaiemos una instancia ue F%-"U#%&"# (ya que esciibiiemos en l). CH: aqui es uonue esciibimos un nuevo caictei en el ficheio usanuo en mtouo :#%&"I%'&J+ Recoiuau que siempie que me piuen un int pueuo usai un chai. CM: cieiio el ficheio (si no lo hacemos pueuieia sei que algunos ue los caiacteies no se acabaian guaiuanuo en el ficheio). D+.'3 6E+','3 0(+).)3-(+)3 ,) F0$)M.0+). '": F%-"U#%&"#IT&#%'S ')3"R 6,,-")' )!!"'/J En caso ue que ya existe un aichivo ue nombie name, si el booleano appenu es cieito, los nuevos caiacteies se aauiin al ficheio a paitii uel final. Si no, se cieai el ficheio vacio y se empezain a aauii uesue el piincipio. *,%/ :#%&"I19)#PQ 164;R %'& ,;;R %'& -"'J Esciibe len caiacteies uel vectoi cbuf a paitii ue la posicion off en el aichivo. *,%/ :#%&"I19)#PQ 164;J Como la anteiioi peio usanuo u como off y cbuf.length como len. *,%/ :#%&"IT&#%'S $&#R %'& ,;;R %'&" -"'J Igual que el anteiioi, peio en vez ue un vectoi ue caiacteies tenemos un Stiing. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 1u *,%/ :#%&"IT&#%'S $&#J Como la anteiioi peio usanuo u como off y sti.length() como len. N" #$ &'(&)*+' ,) O><<).0(P El concepto ue buffeiing queua muy bien explicauo en el siguiente piiafo extiaiuo uel libio Beau Fiist }ava: >, "% 8'+,*5. +';;*5-3 -*5?. $%0% $%015.5 -," '" $.55,(%@ )*+*5?. //*2.5 /%- 15%)'$(%- '"% . '"% 8.-(. /. $.&.< A%- +';;*5- (* )." '" /'B.5 *" */ :'* )*&.5 (*01%5./0*"(* /.- $%-.- 8.-(. :'* *-(C //*"%< D%5 *//% 8.- )* 8.$*5 0*"%- 2,.&*- $'.")% '-.- */ $.55,(%< Cualquiei opeiacion que implique acceuei a memoiia exteina es muy costosa, poi lo que es inteiesante intentai ieuucii al mximo las opeiaciones ue lectuiaesciituia que iealizamos sobie los ficheios, hacienuo que caua opeiacion lea o esciiba muchos caiacteies. Auems, eso tambin peimite opeiaciones ue ms alto nivel, como la ue leei una linea completa y uevolveila en foima ue cauena. ?.'4$)6-: &.)-. >( Q'R$). - *-.+0. ,) >( +);+' 0n Bowlei, en el univeiso ue Baiiy Pottei, no es ms que un coiieo que chilla. Como chillai en inteinet es esciibii en maysculas, lo que vamos a hacei es un piogiama tal que uauo el texto ue un mail (sepaiauo en lineas), lo "howleiice" y lo convieita en maysculas. Como siempie, la solucion: ! ;+.2(4 42-AA g&?2,/P-d,/ ,F1,<'A %&<A&2,H/&)/-= # $ 6 ;/(I-1, A1-1(4 J1/(<) POCLMNOPE Q R=-(2S1F1RT 8 ;/(I-1, A1-1(4 J1/(<) gDeLEaMNOPE Q R5&?2,/S1F1RT : U ;/(I-1, J1/(<) 5&?2,/(h,@J1/(<) 1,F1B # V /,1+/< 1,F1S1&^;;,/%-A,@BT W 7 [ !\ ;+.2(4 I&(' /+<@B # !! 1/0 # BJ M:II-"-98-%9-" /1.:! ; BG 1-3 M:II-"-98-%9-"(1-3 6/7-8-%9-"(@?)<=>?@+22A BN M:II-"-9L"/!-" 0:!.:! ; BH 1-3 M:II-"-9L"/!-"(1-3 6/7-L"/!-"(O*L<+8=>?@+22A BP Q!"/1R 7/1- ; /1.:!D"-%9</1-(2A !V 3&/7- (7/1- E; 1:772 # !W J1/(<) 5&?2,'L(<, Q 15(AS5&?2,/(h,@2(<,BT B5 0:!.:!D3"/!-(&037-9</1-S CS &037-9</1-D7-1R!&(22A JC 0:!.:!D1-3</1-(2A $! 2(<, Q (<;+1S/,-'L(<,@BT Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 11 $$ 7 $6 (<;+1S42&A,@BT $8 &+1;+1S42&A,@BT $: 7 4-145 @CDEF4,;1(&< ,FB # $U ;/(<12<@RPO0., 0&+ d<&? ?5& 5-A 4&=, YZ@RBT $V 7 $W 7 $[ 7 Comentemos, como siempie, las lineas ms ielevantes: CMRC?A el constiuctoi uel BuffeieuReauei en vez ue iecibii el nombie uel ficheio, iecibe una instancia ue FileReauei. La iuea es que la clase BuffeieuReauei se centia en manejai un buffei ue caiacteies y cuanuo ha ue leei cosas uel ficheio usa la instancia ue FileReauei paia haceilo 4 . C@RCNA equivalente paia BuffeieuWiitei. COA leemos una linea enteia en foima ue Stiing. En el Stiing que nos uevuelve, el maicauoi ue fin ue linea est eliminauo. Paia inuicai que no hay ms lineas uevuelve null. CDA usamos una veision ue wiite que nos peimite esciibii una cauena (inuicanuo la posicion uel piimei caictei y la longituu). MHA paia que la saliua tenga los mismos saltos ue linea, hemos ue aauiilo usanuo el mtouo newLine (iecoiuau que ieauLine lo habia eliminauo ue line, poi lo que al pasaila a maysculas en howleuLine no lo tiene). #$ *.'4$)6- ,) $'3 3-$+'3 ,) $S()- 0tio ue los pioblemas al manipulai ficheios ue foima unifoime entie sistemas opeiativos es que stos utilizan uiveisos caiacteies paia inuicai el final ue una linea. Tal y como inuica la uocumentacion ue ieauLine, un fin ue linea pueue estai inuicauo poi: el caictei line-feeu ('\n') el caictei caiiiage-ietuin ('\i') el caictei caiiiage-ietuin seguiuo inmeuiatamente ue line-feeu El piimei caso se usa en sistemas tipu 0nix, el segunuo en las veisiones antiguas ue Nac0S y el ltimo en sistemas tipo Winuows. El mtouo newLine esciibe el final ue linea usanuo la convencion uel sistema opeiativo ue la mquina en el que se est ejecutanuo.
4 Cuanuo el ao que viene estuuiis el tema ue la heiencia, veiis que la clase BuffeieuReauei pueue usaise paia hacei buffeiing ue caiacteies que vienen uesue otios tipos ue ieauei como son los que obtienen caiacteies via comunicaciones en ieu. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 12 T" U-(0*>$-&0H( ,) ,-+'3 - 4-5' (01)$ Basta ahoia nuestios piogiamas han estauo manipulauo nmeios enteios, nmeios en coma flotante, caiacteies y Stiings y en ningn momento S hemos comentauo como estos uatos estn iepiesentauos inteinamente (poi ejemplo, cunto valen los bits coiiesponuientes a un ueteiminauo nmeio enteio). Conocei esta iepiesentacion nos sei til tanto a nivel conceptual, paia entenuei las uifeiencias entie ficheios ue texto y ficheios binaiios, como en la pictica, paia leei y esciibii uatos en foimato binaiio. 9-6-V'3 ,) $'3 +0*'3 *.060+01'3 )( 8-1- 0na ue las ventajas ue }ava es que la iepiesentacion ue los uatos no uepenue ni ue la aiquitectuia ue la mquina en la estamos tiabajanuo ni ue su sistema opeiativo (es una ue las ventajas ue usai una mquina viitual). Poi ello, lo que uiiemos funcionai en cualquiei mquina y sistema opeiativo. El estnuai ue }ava uefine los siguientes tamaos paia los tipos ue uatos piimitivos: V%!, !#%3%&%*, V)3)W, X)-,# 3Y'%3, X)-,# 3L0%3, T#!- 8-bits -128 127 $&%" 16-bits 0nicoue u 0nicoue 2 16 -1 4&0"! 16-bits -2 1S (-S2.768) +2 1S -1 (S2.767) /1! S2-bits -2 S1 (-2.147.48S.648) +2 S1 -1 (2.147.48S.647) 701R 64-bits -2 6S +2 6S -1 I70%! S2-bits S2 bits IEEE-7S4 90:T7- 64-bits 64 bits IEEE-7S4 T007-%1 inuefiniuo tiue 0R false D*).-&0'()3 ,) 8-1- - (01)$ ,) 40+3 }ava piopoiciona opeiauoies paia iealizai opeiaciones a nivel ue bits paia touos los &%!,$ %'&"S#)-"$ (byte, chai, shoit, int, long): U% (complemento) tiansfoima los us en 1s y los 1s en us en la iepiesentacion binaiia. Poi ejemplo, si el byte b contiene uuuuuuu1 (uxu1), ~b sei 1111111u (uxFE). %VT (ANB) iealiza la opeiacion binaiia ANB bit a bit.
S Salvo lo poco que hemos comentauo iespecto la conveision entie caiacteies y nmeios enteios. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 1S %WT (0R) iealiza la opeiacion binaiia 0R bit a bit. %XT (X0R) iealiza al opeiacion binaiia X0R (o exclusivo) bit a bit Tambin tenemos opeiaciones paia hacei uesplazamientos 6 : %YY1 (left shift) uesplaza el pation ue bits n posiciones hacia la izquieiua (iellena con ceios) %ZZ1 (signeu iight shift) uesplaza el pation ue bits n posiciones hacia la ueiecha (iellena con el bit ue signo) %ZZZ1 (unsigneu left shift) uesplaza el pation ue bits n posiciones hacia la ueiecha (iellena con ceios). ! $ ;+.2(4 42-AA c(1D;,/-1(&<A ,F1,<'A %&<A&2,H/&)/-= # 6 8 ;/(I-1, A1-1(4 J1/(<) (<1>&c(<-/0J1/(<)@(<1 <B # : ]] C<1,),1S1&c(<-/0J1/(<) /,=&I,A 2,-'(<) h,/&AS U J1/(<) .(<-/0 Q RRT V 3&/ @(<1 ( Q \T (i6$T (bbB # W (3 @ < fQ \ B # [ .(<-/0 bQ R\RT !\ 7 ,2A, # !! .(<-/0 bQ R!RT !$ 7 !6 < Q < ii !T !8 7 !: /,1+/< .(<-/0T !U 7 !V !W ;/(I-1, I&(' ;/(<1C<1EF;/,AA(&<@J1/(<) ,F;/X (<1 I-2+,B # ![ ;/(<12<@,F;/ b (<1>&c(<-/0J1/(<)@I-2+,B b $\ R R b J1/(<)SI-2+,D3@I-2+,BBT $! 7 $$ $6 ;+.2(4 I&(' /+<@B # $8 A,1K&<1@RP&<&A;-4,'Z8\RBT $: (<1 - Q W8T $U (<1 . Q Z$[T $V ;/(<12<@RD;,/-1(&<A +A(<) (<1ARBT $W ;/(<1C<1EF;/,AA(&<@R - Q RX -BT $[ ;/(<1C<1EF;/,AA(&<@R . Q RX .BT 6\ ;/(<1C<1EF;/,AA(&<@R j- Q RX j-BT 6! ;/(<1C<1EF;/,AA(&<@R j. Q RX j.BT 6$ ;/(<1C<1EF;/,AA(&<@R -k. Q RX -k.BT 66 ;/(<1C<1EF;/,AA(&<@R -l. Q RX -l.BT 68 ;/(<1C<1EF;/,AA(&<@R -m. Q RX -m.BT
6 Estos ties opeiauoies tienen mucha letia pequea en cuanto a su funcionamiento (E.2. A."B'.B* >1*$,;,$.(,%", 1S.19). Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 14 6: ;/(<1C<1EF;/,AA(&<@R -ii! Q RX -ii!BT 6U ;/(<1C<1EF;/,AA(&<@R -ff! Q RX -ff!BT 6V ;/(<1C<1EF;/,AA(&<@R-fff! Q RX -fff!BT 6W ;/(<1C<1EF;/,AA(&<@R .ii! Q RX .ii!BT 6[ ;/(<1C<1EF;/,AA(&<@R .ff! Q RX .ff!BT 8\ ;/(<1C<1EF;/,AA(&<@R.fff! Q RX .fff!BT 8! 7 8$ 7 Cuya ejecucion muestia: WXH6' '4+)(). $'3 4B+)3 &'..)3*'(,0)(+)3 - >( )(+).'Y Lo que queiemos es conseguii una funcion tal que uauo un enteio nos lo convieita en un aiiay foimauo poi los cuatio bytes ue su iepiesentacion, es uecii:
Paia ello lo que haiemos sei usai combinaciones ue : I67&"JA convieite un enteio a bytes. Como un enteio tiene ms ue un byte, se queua con los ocho bits menos significativos. Es necesaiio hacei una conveision explicita ya que al conveitii ue (<1 a .01, pouemos peiuei piecision. 6ZZE: uesplazai 8 bits a la ueiecha, paia hacei que el siguiente byte ocupe ahoia la posicion ms a la ueiecha. Lo mismo suceue al uesplazai con 16 y 26 paia los siguientes bytes. En couigo: bytes[0] bytes[1] bytes[2] bytes[3] - Q \\\\\\\\\\\\\\\\\\\\\\\\\!\!\!\\ W8 . Q !!!!!!!!!!!!!!!!!!!!!!!!!!!\\\!! Z$[ j- Q !!!!!!!!!!!!!!!!!!!!!!!!!\!\!\!! ZW: j. Q \\\\\\\\\\\\\\\\\\\\\\\\\\\!!!\\ $W -k. Q \\\\\\\\\\\\\\\\\\\\\\\\\!\\\\\\ U8 -l. Q !!!!!!!!!!!!!!!!!!!!!!!!!!!!\!!! Z[ -m. Q !!!!!!!!!!!!!!!!!!!!!!!!!\!!\!!! ZV6 -ii! Q \\\\\\\\\\\\\\\\\\\\\\\\!\!\!\\\ !UW -ff! Q \\\\\\\\\\\\\\\\\\\\\\\\\\!\!\!\ 8$ -fff! Q \\\\\\\\\\\\\\\\\\\\\\\\\\!\!\!\ 8$ .ii! Q !!!!!!!!!!!!!!!!!!!!!!!!!!\\\!!\ Z:W .ff! Q !!!!!!!!!!!!!!!!!!!!!!!!!!!!\\\! Z!: .fff! Q \!!!!!!!!!!!!!!!!!!!!!!!!!!!\\\! $!8V8W6U66 Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 1S ! ;/(I-1, A1-1(4 .01,no 1&c01,O//-0@(<1 <B # $ .01,no .01,A Q <,? .01,n8oT 6 .01,An\o Q @.01,B @< ff $8BT 8 .01,An!o Q @.01,B @< ff !UBT : .01,An$o Q @.01,B @< ff WBT U .01,An6o Q @.01,B @<BT V /,1+/< .01,AT W 7 WXH6' .)&>*).-. )$ )(+).' - *-.+0. ,) >( -..-B ,) 4B+)3Y Ahoia nos basaiemos en estas uos opeiaciones: 6 [ H0FF: que es hacei un ANB con un nmeio que solamente tiene 1s en los ocho bytes menos significativos. Asi el iesultauo tiene touo ceios excepto en su byte menos significativo, que tiene los bits como b. Es necesaiio ya que las opeiaciones ue uesplazamiento, antes ue uesplazai, convieiten el .01, en (<1, lo que pouiia llenai ue 1s el byte ms significativo (uebiuo a la "0&"'$%5' /"- $%S',). 6\\E: esta opeiacion uesplaza hacia la ueiecha 8 bits el byte b. Como antes ue hacei esa opeiacion }ava convieite el byte en int y los bytes tienen signo, es necesaiio ponei touos los bits que no peitenecen a b a ceio antes uel uesplazamiento. Lo mismo se hace con 16, 24 y S2. ! ;/(I-1, A1-1(4 (<1 1&C<1,),/@.01,no .01,AB # $ (<1 < Q .01,An\o ii $8T 6 < lQ @.01,An!o k \FKKB ii !UT 8 < lQ @.01,An$o k \FKKB ii WT : < lQ @.01,An6o k \FKKBT U /,1+/< <T V 7 Z+0$0,-,)3 ,) )6*-[>)+-60)(+' 0na vez entenuiuo el caso sobie los enteios, vamos a vei la una clase cuyos mtouos implementan esta tiansfoimacion paia otios tipos ue uatos bsicos. Paia caua tipo ue uatos tenuiemos uos funciones: una paia "3!)K4"&)# los valoies ue ese tipo (packX) y otia paia /"$"3!)K4"&)# los valoies uel mismo (unpack). En touos los casos, pasaiemos como paimetios: un 67&"PQ 64;;"# paia leeiesciibii los uatos un %'& ,;;$"&, que inuicai la posicion inicial a paitii ue la que leeiemosesciibiiemos. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 16 Poi ejemplo, si iealizamos la llamaua: [%$\]!/74D.%$\)1!(NBPS T:II-"S BJ2A se empaquetain los 4 bytes coiiesponuientes al enteio 416 en las posiciones buffei|12j, buffei|1Sj, buffei|14j y buffei|1Sj. Paia simplificai, las funciones ', 1,3!#4"6)' si acceuemos a posiciones coiiectas uel vectoi. Si ahoia hiciiamos /1! 1 ; [%$\]!/74D:1.%$\)1!(T:II-"S BJ2A el valoi ue n uebeiia ue sei 416. En los siguientes apaitauos comentaiemos la estiategia ue empaquetamiento y uesempaquetamiento paia caua tipo ue uatos. O''$)-('3 \4''$)-(] O8CHA Esciibimos en buffei|offsetj un u o un 1 uepenuienuo ue si el booleano es cieito o falso. C@A Al leei, uevolvemos la compiobacion ue si hay un 1 en la posicion byte|offsetj. En la compiobacion , usamos (byte) 1 paia que no haya conveisiones ue tipo al hacei la conveision (ya que al compaiai un byte con un int, convieite piimeio el byte a int). En este caso no hace falta, peio es buena costumbie haceilo. X-.-&+).)3 \&/-.] MH8MCR MN8MOA Es la misma estiategia comentaua con uetalle anteiioimente paia los enteios, peio tenienuo en cuenta que un chai ocupa 2 bytes. X-,)(-3 \@+.0(P] ,) $'(P0+>, $060+-,- MDR @@A Como queiiemos pouei contiolai el final el tamao, ya que necesitaiemos tenei touos los iegistios uel tamao, tenuiemos que limitai el tamao mximo ue las cauenas. Poi ello, solamente guaiuaiemos como mximo 3)0]"'S&9 caiacteies (lo mismo al leei). ??8@CR @B8NNA La estiategia es empaquetaiuesempaquetai los maxLength caiacteies usanuo los mtouos uefiniuos paia los mismos. ?O8@HA Cuanuo a meuio leei se nos acaba el Stiing, guaiuamos un ceio paia maicai el final. Ese ceio seivii paia, al uesempaquetai, paiai ue leei si la cauena tenia longituu menoi que maxLength. Fijaos en el uso ue la $"'&"'1%) 6#")^ !)#) $)-%# /"- 641-". NM8N@A Intentamos uesempaquetai maxLength caiacteies, peio si nos encontiamos un caictei u, pouemos paiai. Tambin usamos un 6#")^ paia salii uel bucle. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 17 #(+).'3 \0(+] B )(+).'3 $-.P'3 \$'(P] OM8ONR OD8BMA La estiategia comentaua anteiioimente (en vez ue vaiios |= he usauo un solo |). Fijaos en la uisposicion uel espacio paia una mejoi lectuia uel couigo. BE8ENR ED8DOA Lo equivalente, peio paia long, que ocupan 8 bytes (64 bits). X'6- <$'+-(+) &'( ,'4$) *.)&030H( \,'>4$)] CHM8CH?R CHE8CHDA 0samos opeiaciones pieuefiniuas que nos peimiten pasai ue uouble a long (o ue long a uouble) y empaquetamos (o uesempaquetamos) usanuo ese long. ! ;+.2(4 42-AA H-4d^1(2A # $ 6 ;+.2(4 A1-1(4 I&(' ;-4dc&&2,-<@.&&2,-< .X 8 .01,no .+33,/X : (<1 &33A,1B # U (3 @.B # V .+33,/n&33A,1o Q @.01,B !T W 7 ,2A, # [ .+33,/n&33A,1o Q @.01,B \T !\ 7 !! 7
}.N. uimeno y }.L. uonzlez 18 6U 7 ,2A, # 6V ]] e, =-/d ?(15 - h,/& 6W ;-4d%5-/@q`\qX .+33,/X &33A,1b$p(BT 6[ T"-%\T 8\ 7 8! 7 8$ 7 86 88 ;+.2(4 A1-1(4 J1/(<) +<;-4dL(=(1,'J1/(<)@(<1 =-FL,<)15X 8: .01,no .+33,/X 8U (<1 &33A,1B # 8V J1/(<) /,A+21 Q RRT 8W 3&/ @(<1 ( Q \T ( i =-FL,<)15T (bb B # 8[ 45-/ 4 Q +<;-4d%5-/@.+33,/X &33A,1b$p(BT :\ (3 @ 4 rQ q`\q B # :! /,A+21 bQ 4T :$ 7 ,2A, # :6 T"-%\T :8 7 :: 7 :U /,1+/< /,A+21T :V 7 :W :[ ;+.2(4 A1-1(4 I&(' ;-4dC<1@(<1 <X U\ .01,no .+33,/X U! (<1 &33A,1 B # U$ .+33,/n&33A,1 o Q @.01,B @< ff $8BT U6 .+33,/n&33A,1 b !o Q @.01,B @< ff !UBT U8 .+33,/n&33A,1 b $o Q @.01,B @< ff WBT U: .+33,/n&33A,1 b 6o Q @.01,B < T UU 7 UV UW ;+.2(4 A1-1(4 (<1 +<;-4dC<1@.01,no .+33,/X (<1 &33A,1B # U[ /,1+/< @@.+33,/n&33A,1 o B ii $8B l V\ @@.+33,/n&33A,1 b !o k \FKKB ii !UB l V! @@.+33,/n&33A,1 b $o k \FKKB ii WB l V$ @@.+33,/n&33A,1 b 6o k \FKKB B T V6 7 V8 V: ;+.2(4 A1-1(4 I&(' ;-4dL&<)@2&<) <X VU .01,no .+33,/X VV (<1 &33A,1B # VW .+33,/n&33A,1 o Q @.01,B @< ff :UBT V[ .+33,/n&33A,1 b !o Q @.01,B @< ff 8WBT W\ .+33,/n&33A,1 b $o Q @.01,B @< ff 8\BT W! .+33,/n&33A,1 b 6o Q @.01,B @< ff 6$BT W$ .+33,/n&33A,1 b 8o Q @.01,B @< ff $8BT W6 .+33,/n&33A,1 b :o Q @.01,B @< ff !UBT W8 .+33,/n&33A,1 b Uo Q @.01,B @< ff WBT Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 19 W: .+33,/n&33A,1 b Vo Q @.01,B < T WU 7 WV WW ;+.2(4 A1-1(4 2&<) +<;-4dL&<)@.01,no .+33,/X (<1 &33A,1B # W[ /,1+/< @@2&<)B@.+33,/n&33A,1 o B ii :UB l [\ @@2&<)B@.+33,/n&33A,1 b !o k \FKKB ii 8WB l [! @@2&<)B@.+33,/n&33A,1 b $o k \FKKB ii 8\B l [$ @@2&<)B@.+33,/n&33A,1 b 6o k \FKKB ii 6$B l [6 @@2&<)B@.+33,/n&33A,1 b 8o k \FKKB ii $8B l [8 @@2&<)B@.+33,/n&33A,1 b :o k \FKKB ii !UB l [: @@2&<)B@.+33,/n&33A,1 b Uo k \FKKB ii WB l [U @@2&<)B@.+33,/n&33A,1 b Vo k \FKKB B T [V 7 [W [[ ;+.2(4 A1-1(4 I&(' ;-4ds&+.2,@'&+.2, <X !\\ .01,no .+33,/X !\! (<1 &33A,1B # !\$ 2&<) .(1A Q s&+.2,S'&+.2,>&a-?L&<)c(1A@<BT !\6 ;-4dL&<)@.(1AX .+33,/X &33A,1BT !\8 7 !\: !\U ;+.2(4 A1-1(4 '&+.2, +<;-4ds&+.2,@.01,no .+33,/X !\V (<1 &33A,1B # !\W 2&<) .(1A Q +<;-4dL&<)@.+33,/X &33A,1BT !\[ /,1+/< s&+.2,S2&<)c(1A>&s&+.2,@.(1ABT !!\ 7 !!! 7 ^" _.&/01'3 40(-.0'3 ,) -&&)3' ,0.)&+' Los aichivos ue acceso uiiecto estn iepiesentauos poi la clase _-I-S(&Sa-<'&=O44,AAK(2,, que peimite: Abiii un aichivo en el que se pueua solamente leei (mouo "i" ) como tanto leei como esciibii (mouo "iw"). Paia leei uisponemos ue las opeiaciones: o %'& #")/I67&"PQ 64;;R %'& ,;;R %'& -"'J o %'& #")/I67&"PQ 64;;J Paia esciibii uisponemos ue las opeiaciones: o *,%/ :#%&"I67&"PQ 64;;R %'& ,;;R %'& -"'J o *,%/ :#%&"I67&"PQ 64;;J La opeiacion que caiacteiiza a este tipo ue aichivos es: o *,%/ $""^I-,'S !,$J que coloca la posicion ue lectuiaesciituia en el byte que ocupa la posicion pos uel aichivo. Asi, la siguiente opeiacion ue lectuia, en vez ue usai la posicion uejaua poi la ltima opeiacion, usai uicha posicion como la uel Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 2u piimei byte a leei. Pueue colocaise ms all uel final uel ficheio, peio el tamao uel ficheio no aumentai hasta que se haya iealizauo una opeiacion ue esciituia. 0tios mtouos ielevantes ue la clase son: o -,'S -"'S&9IJR que uevuelve el nmeio ue bytes ocupauo poi el aichivo. o *,%/ $"&]"'S&9I-,'S '":]"'S&9JR que uefine la nueva longituu uel aichivo como newLength. En caso ue sei menoi que la longituu actual, el conteniuo uel ficheio es tiuncauo. Poi ejemplo, setLength(u) hace que las subsiguientes opeiaciones ue esciituia se iealicen sobie un aichivo vacio. o -,'S S"&F%-"_,%'&"#IJR uevuelve el valoi ue la posicion ue lectuiaesciituia uel aichivo. Pueue sei til paia sabei si, p.e. estamos intentauo leei ms all uel ltimo iegistio uel aichivo. Aunque tambin piovee ue opeiaciones ue tiansfoimacion ue tipos bsicos a vectoies ue bytes y viceveisa, nosotios usaiemos las que hemos uefiniuo en la clase H-4d(<)^1(2A, ya que usai las pieuefiniuas obligaiia entiai en algunos uetalles 7 que se escapan al conteniuo uel cuiso. Z3' +S*0&' ,) -.&/01'3 40(-.0'3 ,) -&&)3' ,0.)&+' Las posibiliuaues ue mezclai opeiaciones ue esciituia con opeiaciones ue lectuia acceuei a una posicion concieta uel aichivo hacen que el uso piincipal ue los aichivos ue acceso uiiecto sea implementai algo muy paieciuo a los aiiays, peio en memoiia secunuaiia. #$ &'(&)*+' ,) .)P03+.' Si queiemos guaiuai en un aichivo ue acceso uiiecto los uatos coiiesponuientes a las instancias ue una clase paia pouei acceuei uiiectamente a caua una ue las instancias, uebeiemos hacei que touas ellas tengan %S4)- -,'S%&4/. Be esta maneia, si caua instancia tiene longituu L, la instancia i-sima ocupai L bytes a paitii uel i*L. uificamente:
7 Paia conoceilos, consultau la uocumentacion ue la clase a-<'&=O44,AAK(2, y ue las inteificies asociauas s-1-C<;+1 y s-1-D+1;+1. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 21
A caua uno ue los bloques ue bytes que iepiesentan los uatos ue una instancia se le uenomina #"S%$&#,. #5)6*$': >( -.&/01' ,) -&&)3' ,0.)&+' ,) *).3'(-3 vamos a mostiai touo lo que hemos comentauo sobie aichivos ue acceso uiiecto sobie un ejemplo concieto: un aichivo paia iepiesentai peisonas. 2- &$-3) [>) .)*.)3)(+- $'3 ,-+'3 La piimeia clase que veiemos es la que iepiesenta una peisona. Esta clase contiene: campos con infoimacion ue la peisona opeiaciones sobie peisonas, bsicamente getteis y el mtouo toStiing opeiaciones paia: o uaua una peisona, obtenei un aiiay ue bytes o uauo un aiiay ue bytes, constiuii la peisona Comentaiios sobie las lineas uestacables: ?8O: ueclaiamos los campos que tenui caua instancia ue Peison E: como los iegistios han ue sei ue longituu fija, limitamos la longituu uel Stiing name a NANE_LINIT caiacteies. Be hecho la limitacion afectai solamente cuanuo leamosesciibamos los uatos. D: en la constante SIZE, calculamos el tamao que tenui caua iegistio asociauo a una peisona en funcion ue los campos a guaiuai. Como el tamao ha ue poueise conocei uesue fueia, hacemos la constante pblica y, !)#) "*%&)# K4" $" !4"/) )$%S')# ,&#, *)-,#R -) /";%'%3,$ 1,3, ;%')-. @M8N@: este mtouo, ciea un aiiay ue bytes ue tamao SIZE y va empaquetanuo caua uno ue los campos a paitii ue los offsets que le coiiesponuen. NO8OE: opeiacion inveisa que uesempaqueta el aiiay ue bytes que iecibe como paimetio y ciea una instancia con los valoies obteniuos. Fijaos en que es un mtouo esttico, ya que claiamente se iefieie a cosas ielacionauas con la clase Peison, peio no se aplica sobie ninguna instancia (ue hecho, es el piopio mtouo quin ciea una instancia). .... L L L L 0 L 2L 3L Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 22 ! ;+.2(4 42-AA H,/A&< # $ 6 ;/(I-1, 2&<) ('T 8 ;/(I-1, J1/(<) <-=,T : ;/(I-1, (<1 -),T U ;/(I-1, .&&2,-< =-//(,'T ^ K ."/_%!- 4!%!/$ I/1%7 /1! >?@+=<)@)` ; JCA 5 .:T7/$ 4!%!/$ I/1%7 /1! Q)a+ ; K b J c >?@+=<)@)` b N b BA !\ !! ;+.2(4 H,/A&<@2&<) ('X !$ J1/(<) <-=,X !6 (<1 -),X !8 .&&2,-< =-//(,'B # !: 15(AS(' Q ('T !U 15(AS<-=, Q <-=,T !V 15(AS-), Q -),T !W 15(AS=-//(,' Q =-//(,'T ![ 7 $\ $! ;+.2(4 (<1 ),1O),@B # $$ /,1+/< -),T $6 7 $8 $: ;+.2(4 2&<) ),1C'@B # $U /,1+/< ('T $V 7 $W $[ ;+.2(4 .&&2,-< (AP-//(,'@B # 6\ /,1+/< =-//(,'T 6! 7 6$ 66 ;+.2(4 J1/(<) ),1N-=,@B # 68 /,1+/< <-=,T 6: 7 6U 6V ;+.2(4 J1/(<) 1&J1/(<)@B # 6W /,1+/< RH,/A&<#R b R('QR b (' b R <-=,QR b <-=, b 6[ R -),QR b -), b R =-//(,'QR b =-//(,' b q7qT 8\ 7 8! NJ .:T7/$ T#!-de !0M#!-4(2 f NG T#!-de "-$0"9 ; 1-3 T#!-dQ)a+eA NN /1! 0II4-! ; CA NH [%$\]!/74D.%$\<01R(/9S "-$0"9S 0II4-!2A NP 0II4-! b; KA N^ [%$\]!/74D.%$\</g/!-9Q!"/1R(1%g-S >?@+=<)@)`S NK "-$0"9S 0II4-!2A N5 0II4-! b; J c >?@+=<)@)`A Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 2S HC [%$\]!/74D.%$\)1!(%R-S "-$0"9S 0II4-!2A HB 0II4-! b; NA HJ [%$\]!/74D.%$\M007-%1(g%""/-9S "-$0"9S 0II4-!2A HG "-!:"1 "-$0"9A HN h HH HP .:T7/$ 4!%!/$ [-"401 I"0gM#!-4(T#!-de "-$0"92 f H^ /1! 0II4-! ; CA HK 701R /9 ; [%$\]!/74D:1.%$\<01R("-$0"9S 0II4-!2A H5 0II4-! b; KA PC Q!"/1R 1%g- ; [%$\]!/74D:1.%$\</g/!-9Q!"/1R(>?@+=<)@)`S PB "-$0"9S PJ 0II4-!2A PG 0II4-! b; J c >?@+=<)@)`A PN /1! %R- ; [%$\]!/74D:1.%$\)1!("-$0"9S 0II4-!2A PH 0II4-! b; NA PP T007-%1 g%""/-9 ; [%$\]!/74D:1.%$\M007-%1("-$0"9S0II4-!2A P^ "-!:"1 1-3 [-"401(/9S 1%g-S %R-S g%""/-92A PK h U[ V\ 7 #$ *.'P.-6- *.0(&0*-$ En el piogiama piincipal lo que haiemos es: ueclaiai una iefeiencia al aichivo ue acceso uiiecto cieai vaiia peisonas esciibii y leei en uiveisas posiciones uel aichivo, inuexanuo poi iegistio. Comentaiios ue las lineas ielevantes: ?: ueclaiamos el aichivo ue acceso aleatoiio como un campo ue la clase, asi touos los mtouos no estticos ue la misma lo pouin utilizai. N8CHA esciibe en el aichivo el iegistio con posicion num foimauo con los uatos ue peison. CM8CBA lee el iegistio uel posicion num uel aichivo y ciea una instancia ue Peison con los bytes obteniuos. CD8NOA esciibimos y leemos en uifeientes posiciones uel aichivo. ! ;+.2(4 42-AA P-(< ,F1,<'A %&<A&2,H/&)/-= # $ G ."/_%!- 8%190g?$$-446/7- "%IA 8 H ."/_%!- _0/9 3"/!-[-"401(701R 1:gS [-"401 .-"4012 P !&"034 )*+,$-.!/01 f ^ !&/4D"%ID4--\(1:g c [-"401DQ)a+2A K T#!-de "-$0"9 ; .-"401D!0M#!-4(2A 5 !&/4D"%ID3"/!-("-$0"92A Piogiamacion 2 Cuiso 2u1u2u11
; Q H,/A&<#('Q8UV! <-=,Qt+-< -),Q8\ =-//(,'Q3-2A,7 ; Q H,/A&<#('Q!W![ <-=,QH,'/& -),QU6 =-//(,'Q1/+,7 ; Q H,/A&<#('QVW$6 <-=,QP-/u- -),Q!W =-//(,'Q3-2A,7 ; Q H,/A&<#('QW[W8 <-=,QJ+A( -),Q$8 =-//(,'Q1/+,7 ; Q H,/A&<#('Q8UV! <-=,Qt+-< -),Q8\ =-//(,'Q3-2A,7 `03>-$0J-(,' )$ &'(+)(0,' ,)$ <0&/).' 0n aichivo binaiio no lo pouemos visualizai con un euitoi ue texto. Paia vei su conteniuo, pouemos usai la heiiamienta 0NIX hexuump, que nos muestia los valoies ue los bytes uel ficheio. Si lo aplicamos al ficheio geneiauo poi el piogiama anteiioi, obtenemos:
Comentaiios: En )3)#%--, he maicauo los 8 bytes coiiesponuientes al iu, que es un long. En el caso uel piimei iegistio (que empieza en la posicion u), el valoi es ux12Sf, que pouis compiobai que es lo mismo que 4671. En ).4- estn los 4u bytes coiiesponuientes a name, uonue caua pai ue bytes coiiesponue a un caictei. ux4a coiiesponue al caictei '}', ux7S a 'u', etc. En #,(, los 4 bytes coiiesponuientes a age. Pouis compiobai que ux28 es 4u. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 26 En *"#/" est el byte coiiesponuiente al booleano maiiieu que, valienuo uxuu, es falso. En 3)S"'&) he maicauo los bytes coiiesponuientes al iegistio 2, que en ningn momento se ha esciito. ]""# 4' #"S%$&#, K4" ', 1,'&%"'" /)&,$ "$ 4' "##,#+ a" D.,)(-&0H( ,) -.&/01'3: )$ -$P'.0+6' U).P)@'.+ 0n pioceuimiento muy habitual a iealizai sobie aichivos es oiuenailos. Aunque paia el caso ue los aichivos ue acceso uiiecto pouiiamos aplicai los que ya conocemos paia oiuenai vectoies (aiiays), no es la mejoi foima ue haceilo, ya que las lectuiasesciituias no secuenciales en aichivos son muy costosas. El algoiitmo NeigeSoit peimite oiuenai un aichivo, solamente iealizanuo lectuias y esciituias secuenciales, poi lo que es muy eficiente en el uso ue los aichivos. En este apaitauo veiemos, en piimei lugai, la logica uetis uel algoiitmo 8 y, posteiioimente, su implementacion paia oiuenai las lineas ue un aichivo ue texto. 2- 0,)- 4C30&- ,)$ -$P'.0+6' 0s acoiuis ue la pelicula ue Los Inmoitales. En ella se explica que los inmoitales, sienten una atiaccion iiiesistible ue acabai unos con otios y que al final $,-)3"'&" !4"/" K4"/)# 4',. La iuea uetis uel algoiitmo NeigeSoit es muy simple: ii fusionanuo las paites oiuenauas que contiene el ficheio, hasta que touo l est en una nica paite. Paia ello se basa en uos mtouos auxiliaies: $!-%&: que uauo un ficheio ue entiaua y uos ue saliua, va colocanuo las subsecuencias oiuenauas uel ficheio ue entiaua en caua uno ue los ue saliua. 3"#S": que uauos uos ficheios ue entiaua y uno ue saliua, fusiona uos subcauenas, una ue caua ficheio ue entiaua, y las guaiua en el ficheio ue saliua. Ambas opeiaciones se suceuein hasta que el ficheio que queiemos uiviuii conste ue una nica secuencia.
8 0na veision que mejoia mucho el ienuimiento uel algoiitmo, se plantea en la lista ue pioblemas. Piogiamacion 2 Cuiso 2u1u2u11
}.N. uimeno y }.L. uonzlez 27 U).P)@'.+ 3'4.) >( 1)&+'. Paia visualizai el funcionamiento uel algoiitmo, lo visualizaiemos tiabajanuo sobie la oiuenacion ue un vectoi. Paia haceilo supongamos que ueseamos oiuenai el siguiente vectoi:
Si maicamos, alteinanuo uos coloies, las subsecuencias uel vectoi que ya estn oiuenauas, tenemos:
Sepaianuo ($!-%&) poi coloies en uos vectoies auxiliaies, obtenemos:
Si fusionamos (3"#S") oiuenauamente ambos vectoies (es uecii, iecoiiinuolos a la vez y uejanuo pasai piimeio al elemento ms pequeo ue los uos), queua:
Si iepetimos el mismo pioceuimiento hasta que solamente haya una subsecuencia, obtenemos:
}.N. uimeno y }.L. uonzlez Su [6 (<!S42&A,@BT [8 (<$S42&A,@BT [: &+1S42&A,@BT [U 7 [V 7 Algunos comentaiios sobie el couigo: B8CE: el piogiama piincipal es el que iealiza la oiuenacion. Inicialmente hace un split y mientias el ficheio no est oiuenauo, hace un meige seguiuo ue un split. Fijaios en que el ficheio ue entiaua paia split es ue saliua paia meige, y los ue saliua paia split son los ue entiaua paia meige. iecoiuau que split, mientias encuentia valoies oiuenauos, los va guaiuanuo en el mismo ficheio, paia ello guaiuamos uos valoies: o pievious, que es el valoi anteiioimente guaiuauo o cuiient, el valoi que se va a aguaiuai actualmente ?M: inicializamos pievious a la cauena vacia ya que asi es menoi que cualquiei otia cauena, poi lo que la piimeia cauena que leamos foima una subsecuencia oiuenaua con ella. ?E8@H: cuanuo hemos ue cambiai ue ficheio lo que hago es inteicambiai las iefeiencias out y othei, y siempie esciibo en out. ?CR?B: inicialmente supongo que el ficheio ue entiaua est oiuenauo, peio si alguna vez uetecto un pai ue elementos consecutivos que estn uesoiuenauos s que no lo est. OD8BD: si hay elementos en ambos ficheios ue entiaua, se compaian, y el menoi se copia en el ue saliua. EC8ENR EB8DC: cuanuo uno ue los ficheios acaba, copiamos los que queuan en el otio en el ue saliua.
b" O04$0'P.-<S- Eiic S.Robeits, The Ait & Science of }ava, Auuison-Wesley (2uu8). The }ava Tutoiials (ltima consulta, Su ue mayo ue 2u11). The }ava Language Specification (Thiiu euition) (ltima consulta, Su mayo 2u11). Kathy Sieiia & Beit Bates, Beau Fiist }ava, 0'Reilly (2uuS).