Está en la página 1de 30

Piogiamacion 2 Cuiso 2u1u2u11

}.N. uimeno y }.L. uonzlez 1


!"#$%& ()*+,& -$ ".,/+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 &#781)&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

}.N. uimeno y }.L. uonzlez 7
! K(2,a,-',/ (<;+1 Q <,? K(2,a,-',/@<,? K(2,@KCLEMNOPEBBT

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

!$ ;+.2(4 A1-1(4 .&&2,-< +<;-4dc&&2,-<@.01,no .+33,/X
!6 (<1 &33A,1B #
!8 /,1+/< .+33,/n&33A,1o QQ @.01,B !T
!: 7
!U
!V ;+.2(4 A1-1(4 I&(' ;-4d%5-/@45-/ 4X
!W .01,no .+33,/X
![ (<1 &33A,1B #
$\ .+33,/n&33A,1 o Q @.01,B @\FKK k @4 ff WBBT
$! .+33,/n&33A,1 b !o Q @.01,B @\FKK k 4 BT
$$ 7
$6
$8 ;+.2(4 A1-1(4 45-/ +<;-4d%5-/@.01,no .+33,/X (<1 &33A,1B #
$: /,1+/< @45-/B @@.+33,/n&33A,1o ii WB l
$U @.+33,/n&33A,1 b !o k \FKKBBT
$V 7
$W
$[ ;+.2(4 A1-1(4 I&(' ;-4dL(=(1,'J1/(<)@J1/(<) A1/X
6\ (<1 =-FL,<)15X
6! .01,no .+33,/X
6$ (<1 &33A,1B #
66 3&/ @(<1 ( Q \T ( i =-FL,<)15T (bbB #
68 (3 @ ( i A1/S2,<)15@B B #
6: ;-4d%5-/@A1/S45-/O1@(BX .+33,/X &33A,1b$p(BT
Piogiamacion 2 Cuiso 2u1u2u11

}.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

}.N. uimeno y }.L. uonzlez 24
BC h
BB
BJ ."/_%!- [-"401 "-%9[-"401(701R 1:g2 !&"034 )*+,$-.!/01 f
BG !&/4D"%ID4--\(1:g c [-"401DQ)a+2A
BN T#!-de "-$0"9 ; 1-3 T#!-d[-"401DQ)a+eA
BH !&/4D"%ID"-%9("-$0"92A
BP "-!:"1 [-"401DI"0gM#!-4("-$0"92A
B^ h
!W
![ ;+.2(4 I&(' /+<@B #
$\ 1/0 #
$!
JJ !&/4D"%I ; 1-3 8%190g?$$-446/7-(i.-0.7-D9%!iS i"3i2A
$6
$8 H,/A&< ;! Q <,? H,/A&<@8UV!X Rt+-<RX 8\X 3-2A,BT
$: H,/A&< ;$ Q <,? H,/A&<@!W![X RH,'/&RX U6X 1/+,BT
$U H,/A&< ;6 Q <,? H,/A&<@VW$6X RP-/u-RX !WX 3-2A,BT
$V H,/A&< ;8 Q <,? H,/A&<@W[W8X RJ+A(RX $8X 1/+,BT
$W
$[ 15(AS?/(1,H,/A&<@\X ;!BT
6\ 15(AS?/(1,H,/A&<@!X ;$BT
6! 15(AS?/(1,H,/A&<@8X ;6BT
6$
66 H,/A&< ;T
68
6: ; Q 15(AS/,-'H,/A&<@\BT
6U ;/(<12<@R; Q R b ;BT
6V
6W ; Q 15(AS/,-'H,/A&<@!BT
6[ ;/(<12<@R; Q R b ;BT
8\
8! ; Q 15(AS/,-'H,/A&<@8BT
8$ ;/(<12<@R; Q R b ;BT
86
88 15(AS?/(1,H,/A&<@6X ;8BT
8: ; Q 15(AS/,-'H,/A&<@6BT
8U ;/(<12<@R; Q R b ;BT
8V
8W 15(AS?/(1,H,/A&<@!X ;!BT
8[ ; Q 15(AS/,-'H,/A&<@!BT
:\ ;/(<12<@R; Q R b ;BT
:!
:$ 7 4-145 @CDEF4,;1(&< ,B #
:6 ;/(<12<@RO2)& =+0 =-2& 5- ;-A-'& YZ@RBT
:8 7
:: 7
:U 7
La ejecucion uel piogiama muestia:
Piogiamacion 2 Cuiso 2u1u2u11

}.N. uimeno y }.L. uonzlez 2S

; 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:

%2,&c&&d fY 5,F'+=; ZI ;,&;2,S'-1
\\\\\\\ \\ \\ \\ \\ \\ \\ !$ 63 \\ 8- \\ V: \\ U! \\ U,
\\\\\!\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\$\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\6\ \\ \\ \\ $W \\ \\ \\ \\ \\ \\ \\ !$ 63 \\ 8- \\
\\\\\8\ V: \\ U! \\ U, \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\:\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\U\ \\ \\ \\ \\ \\ \\ \\ \\ $W \\ \\ \\ \\ \\ \\ \\
\\\\\V\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\W\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\[\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\-\ \\ \\ \\ \\ \\ $6 !W \\ :6 \\ V: \\ V6 \\ U[ \\
\\\\\.\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\4\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\'\ \\ \\ !W \! \\ \\ \\ \\ \\ \\ !, W3 \\ 8' \\ U!
\\\\\,\ \\ V$ \\ ,' \\ U! \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\\3\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\
\\\\!\\ \\ \\ \\ \\ \\ \\ \\ !$ \\
\\\\!\[

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:

Que, como pouemos vei, ueja el vectoi oiuenauo.
6 14 3 9 7 18 15
6 14 3 9 7 18 15
14 15 3 18 9 7 6
14 3 18 15 6 9 7
14 3 18 15 6 9 7
14 7 3 9
15 6 18
18 15 14 3 9 7 6
7 6 9 18 3 15 14
18 15 14 9 7 6 3
Piogiamacion 2 Cuiso 2u1u2u11

}.N. uimeno y }.L. uonzlez 28
_*$0&-&0H( 3'4.) -.&/01'3
vamos a aplicai la iuea uel algoiitmo paia oiuenai las lineas ue un
aichivo ue texto. El iesultauo lo uejaiemos en el ficheio ue texto
oiiginal.
! ;+.2(4 42-AA P,/),J&/1 ,F1,<'A %&<A&2,H/&)/-= #
$
6 ;/(I-1, A1-1(4 3(<-2 J1/(<) CNH^> Q R(<;+1S1F1RT
8 ;/(I-1, A1-1(4 3(<-2 J1/(<) O^v! Q R-+F!S1F1RT
: ;/(I-1, A1-1(4 3(<-2 J1/(<) O^v$ Q R-+F$S1F1RT
U
V ;+.2(4 I&(' /+<@B #
W 1/0 #
[ .&&2,-< A&/1,' Q A;2(1@CNH^>X O^v!X O^v$BT
!\ ?5(2, @rA&/1,'B #
!! =,/),@O^v!X O^v$X CNH^>BT
!$ A&/1,' Q A;2(1@CNH^>X O^v!X O^v$BT
!6 7
!8 ;/(<12<@Rw-1----rrrRBT
!: 7 4-145 @CDEF4,;1(&< ,FB #
!U ;/(<12<@RJ&=, ,//&/ 5-A 5-;;,<,'RBT
!V 7
!W 7
![
$\ ;/(I-1, .&&2,-< A;2(1@J1/(<) (<;+1X
$! J1/(<) &+1;+1!X
$$ J1/(<) &+1;+1$B 15/&?A CDEF4,;1(&< #
$6
$8 c+33,/,'a,-',/ (< Q <,? c+33,/,'a,-',/@
$: <,? K(2,a,-',/@(<;+1BBT
$U c+33,/,'e/(1,/ &+1 Q <,? c+33,/,'e/(1,/@
$V <,? K(2,e/(1,/@&+1;+1!BBT
$W c+33,/,'e/(1,/ &15,/ Q <,? c+33,/,'e/(1,/@
$[ <,? K(2,e/(1,/@&+1;+1$BBT
6\
6! .&&2,-< A&/1,' Q 1/+,T
6$ J1/(<) ;/,I(&+A Q RRT
66 J1/(<) 4+//,<1 Q (<S/,-'L(<,@BT
68
6: ?5(2, @4+//,<1 rQ <+22B #
6U (3 @;/,I(&+AS4&=;-/,>&@4+//,<1B f \B #
6V A&/1,' Q 3-2A,T
6W c+33,/,'e/(1,/ 1=; Q &+1T
6[ &+1 Q &15,/T
8\ &15,/ Q 1=;T
8! 7
8$ &+1S?/(1,@4+//,<1BT
86 &+1S<,?L(<,@BT
Piogiamacion 2 Cuiso 2u1u2u11

}.N. uimeno y }.L. uonzlez 29
88 ;/,I(&+A Q 4+//,<1T
8: 4+//,<1 Q (<S/,-'L(<,@BT
8U 7
8V
8W (<S42&A,@BT
8[ &+1S42&A,@BT
:\ &15,/S42&A,@BT
:!
:$ /,1+/< A&/1,'T
:6 7
:8
:: ;/(I-1, I&(' =,/),@J1/(<) (<;+1!X
:U J1/(<) (<;+1$X
:V J1/(<) &+1;+1B 15/&?A CDEF4,;1(&< #
:W
:[ c+33,/,'a,-',/ (<! Q <,? c+33,/,'a,-',/@
U\ <,? K(2,a,-',/@(<;+1!BBT
U! c+33,/,'a,-',/ (<$ Q <,? c+33,/,'a,-',/@
U$ <,? K(2,a,-',/@(<;+1$BBT
U6 c+33,/,'e/(1,/ &+1 Q <,? c+33,/,'e/(1,/@
U8 <,? K(2,e/(1,/@&+1;+1BBT
U:
UU J1/(<) 4+//,<1! Q (<!S/,-'L(<,@BT
UV J1/(<) 4+//,<1$ Q (<$S/,-'L(<,@BT
UW
U[ ?5(2, @4+//,<1! rQ <+22 kk 4+//,<1$ rQ <+22B #
V\ (3 @4+//,<1!S4&=;-/,>&@4+//,<1$B iQ \B #
V! &+1S?/(1,@4+//,<1!BT
V$ &+1S<,?L(<,@BT
V6 4+//,<1! Q (<!S/,-'L(<,@BT
V8 7 ,2A, #
V: &+1S?/(1,@4+//,<1$BT
VU &+1S<,?L(<,@BT
VV 4+//,<1$ Q (<$S/,-'L(<,@BT
VW 7
V[ 7
W\
W! ?5(2, @4+//,<1! rQ <+22B #
W$ &+1S?/(1,@4+//,<1!BT
W6 &+1S<,?L(<,@BT
W8 4+//,<1! Q (<!S/,-'L(<,@BT
W: 7
WU
WV ?5(2, @4+//,<1$ rQ <+22B #
WW &+1S?/(1,@4+//,<1$BT
W[ &+1S<,?L(<,@BT
[\ 4+//,<1$ Q (<$S/,-'L(<,@BT
[! 7
[$
Piogiamacion 2 Cuiso 2u1u2u11

}.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).

También podría gustarte