20260323 FicherosObjetos_AppReservas_3 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
vale, pues esta excepción si recordáis
00:00:00
vinimos a decir
00:00:05
porque nos daba
00:00:07
y era
00:00:07
porque cuando el object
00:00:09
output string no se ve nada
00:00:12
cuando el object output
00:00:14
string
00:00:23
lo abrimos para escribir en un
00:00:23
fichero, pues el object
00:00:26
output string según se abre
00:00:28
y se asocia al fichero
00:00:30
en el punto en el que se asocie
00:00:32
que puede ser 2, o el comienzo
00:00:34
si el añadir
00:00:37
está a false, el parámetro de añadir del
00:00:38
constructor está a false, o aquí al final
00:00:40
si el parámetro
00:00:42
del constructor de añadir está a true
00:00:44
el object output string se engancha
00:00:46
a dos puntos, o al comienzo
00:00:48
del fichero eliminando todo lo que
00:00:50
hubiera, o al final
00:00:52
dejando lo que hubiera
00:00:54
pues en el momento en que se abre
00:00:56
y se engancha a un fichero
00:00:58
él ya
00:01:00
por el hecho de abrirse y asociarse
00:01:01
a un fichero, ya mete una cabecera
00:01:04
o bien aquí
00:01:06
o bien aquí
00:01:08
¿vale?
00:01:10
depende de donde se haya enganchado
00:01:11
entonces, esta cabecera
00:01:13
tiene información sobre
00:01:16
que describe
00:01:18
el objeto que se va a escribir
00:01:20
es una información
00:01:22
para describir, de alguna manera está pensada
00:01:24
para describir que ahí van a ir objetos
00:01:26
que es un fichero de objetos
00:01:28
entonces esa cabecera para que luego el
00:01:30
object input string
00:01:32
pueda deserializar
00:01:34
cuando abrimos el object input
00:01:36
sino un fichero y empezamos a leer con el
00:01:38
buque de lectura un objeto, otro objeto, otro objeto
00:01:40
pues para que el object input
00:01:42
string pueda deserializar
00:01:44
esta cabecera tiene que estar
00:01:46
pero solo una vez
00:01:48
y al principio
00:01:50
entonces es obligatorio que esta cabecera esté
00:01:51
la que ha creado este, pero solo una vez
00:01:54
y al principio
00:01:56
entonces que ocurre
00:01:57
que si nosotros estamos abriendo
00:01:59
un fichero de objetos para añadir
00:02:01
esta cabecera
00:02:03
se va a ir colando
00:02:05
entre medias y ahí viene
00:02:07
el problema, cuando abrimos
00:02:09
un fichero de objetos para añadir
00:02:11
cuando abrimos un fichero de objetos para añadir
00:02:13
se cuela esta cabecera
00:02:15
y entonces ya
00:02:17
el fichero se queda corrupto
00:02:19
porque cuando el object imputation
00:02:21
empiece a leer, quita la primera cabecera
00:02:23
fenomenal, está muy bien
00:02:25
Y ahora se pone a leer objetos
00:02:27
Llega un momento en que llega una cosa rara
00:02:28
Que no es un objeto como él espera
00:02:30
Y entonces tú dices
00:02:32
El string en el que estoy leyendo
00:02:34
Mi string de entrada está corrupto
00:02:35
Porque esto ha dejado de ser un objeto
00:02:38
¿Vale?
00:02:40
Bueno, pues podemos arreglar esto
00:02:42
Ayudándonos de la herencia en realidad
00:02:44
Ahora que ya sabemos usar
00:02:45
Es decir, el arreglo puede ser
00:02:47
Oye tú, object output string
00:02:49
Me gustaría cambiarte un poco
00:02:52
Modificarte
00:02:54
me gustaría modificarte
00:02:55
y que cuando escribes
00:02:57
la cabecera lo hagas
00:02:59
solo cuando
00:03:01
abres un fichero que no existe
00:03:03
o está vacío
00:03:05
sin bytes y sin nada
00:03:06
en ese caso quiero que escribas la cabecera
00:03:08
pero cuando tú te asocias
00:03:11
a un fichero que ya existe y tiene bytes
00:03:13
en ese caso
00:03:15
no quiero que hagas nada
00:03:16
esa es una pequeña modificación de esta clase
00:03:18
querríamos modificar esta clase
00:03:21
modificarla un pelín, para modificarla un pelín
00:03:23
el comportamiento, y es que cuando
00:03:26
se asocia en modo añadir
00:03:28
entonces esto no lo haga
00:03:29
simplemente no lo haga, se asocia y ya está
00:03:31
entonces esta clase
00:03:34
lógicamente no podemos tocarla
00:03:36
hombre, como poder, podríamos
00:03:38
yo me podría ir a la librería
00:03:40
a la librería de la máquina virtual
00:03:42
cogerla, decompilarla
00:03:43
porque ahí están todas en punto clase
00:03:46
decompilarla, cambiarla
00:03:48
volverla a compilar y meterla en la JR
00:03:50
es absurdo, no vamos a hacer eso
00:03:52
pero lo que podemos hacer es
00:03:53
oye, como yo quiero
00:03:56
una casi igual que esta
00:03:58
igual que esta
00:04:00
casi en todo menos en una cosa
00:04:02
pues bueno, que mecanismo
00:04:04
tenemos muy sencillo para hacer una clase
00:04:06
que tenga
00:04:08
todo lo que tiene otra
00:04:09
pero la modifique en alguna cosa
00:04:11
si quiere o la sobreescriba
00:04:14
pues la herencia, ¿verdad?
00:04:16
la herencia, entonces oye
00:04:18
vamos a hacernos una clase
00:04:20
que herede de esta, con lo cual
00:04:21
por el hecho de heredar, ya es igualita
00:04:23
lo tiene todo, salvo el constructor
00:04:26
pero el constructor lo podemos hacer
00:04:28
nosotros, y ahora
00:04:29
vamos a modificar en esta clase
00:04:31
lo que queramos que funcione
00:04:33
diferente de esta otra, entonces el
00:04:35
mecanismo de herencia, siempre
00:04:37
nos vale para hacer clones de una clase
00:04:39
con una pequeña modificación, que es justo lo que queremos
00:04:41
hacer aquí
00:04:43
nada
00:04:44
no trates de desentrañarlo
00:04:46
yo que sé
00:04:50
A ver, mi objetivo era poner
00:04:51
M de la mía
00:04:53
Object output string, o sea, un modificada
00:04:54
De modificada object output string, pero vamos, queda igual
00:04:57
¿Vale?
00:04:59
Entonces, si ya
00:05:01
Pero no necesita como modificar
00:05:03
La cabecera que ya hay
00:05:05
O sea, no escribir una nueva
00:05:06
Si no detectar que ya hay una
00:05:12
Bueno, pero
00:05:14
Claro, detectar que ya hay una, va a haber una
00:05:17
Si el fichero ya tiene cosas
00:05:20
Si el fichero tiene cosas
00:05:21
Entonces no escribas cabecera
00:05:24
Ni la modifica, claro
00:05:26
No tiene por qué modificarla
00:05:29
Porque esta cabecera ya ha descrito correctamente
00:05:32
Que es un fichero de objetos y ya está
00:05:34
No hay que añadir nada nuevo
00:05:36
Lo único que tiene que hacer es añadir los objetos
00:05:37
No hay que añadir información de los nuevos objetos
00:05:39
No, no es necesario
00:05:42
Esta cabecera es más simple
00:05:45
Es una cosa más sencilla
00:05:47
entonces una vez que tengamos esta variante
00:05:49
ahora ya, cuando queramos
00:05:51
añadir, usamos esta
00:05:54
y cuando el fichero
00:05:56
sea
00:05:58
lo arranquemos de nuevas, usaremos
00:05:58
esta otra, y ya está
00:06:02
entonces este puede ser nuestro array
00:06:03
¿cuál es la idea entonces?
00:06:05
hacer una variante de object
00:06:07
output string que no escriba
00:06:09
cabecera, simplemente
00:06:11
se abra para añadir, entonces esa variante
00:06:13
la usaremos, cuando tengamos
00:06:16
que añadir algo
00:06:18
y la original
00:06:19
la de la JRE
00:06:22
la usaremos cuando el fichero empiece
00:06:24
de nuevas desde el principio vacío
00:06:26
vale
00:06:27
vale, pues entonces
00:06:29
vamos a modificar entonces esta aplicación
00:06:31
tal y como la teníamos para que ya no nos dé
00:06:34
este problema
00:06:36
entonces
00:06:36
vamos a hacernos
00:06:38
dígame
00:06:42
que si lo he enseñado
00:06:42
pues el otro día sí
00:06:46
que era este
00:06:49
vamos, está grabado
00:06:51
claro que está enseñado
00:06:54
estaban enseñados los dos que hice
00:06:58
que eran solo el insert y el get
00:07:00
los vimos
00:07:02
de arriba a abajo, de hecho nos sirvió
00:07:04
el insert para contarlo del
00:07:06
try con recursos
00:07:08
¿dónde estabas el viernes?
00:07:09
dormida
00:07:13
recordáis esto, ¿no?
00:07:14
El try con recursos que dijimos
00:07:18
Que si lo tenía aquí dentro se cerraba automáticamente
00:07:20
Y no teníamos que hacer el close
00:07:22
Habéis hecho una desconexión total
00:07:24
Del viernes a las 2 y cuarto
00:07:28
2 y media
00:07:29
Hasta hoy ha sido una desconexión absoluta
00:07:30
Vale, bueno pues entonces vamos a hacer el arreglo
00:07:34
Pues vamos a hacer esa otra clase modificada
00:07:38
Vale
00:07:40
App agencia de viajes
00:07:42
Que es esta
00:07:44
Pues venga
00:07:45
Como tiene que ver con acceso a datos
00:07:47
Vamos a meterlo en DAO directamente
00:07:48
Y ya está en el paquete DAO
00:07:50
Pues venga
00:07:51
Una clase que sea
00:07:55
Object.putString.add
00:07:56
Por ejemplo
00:07:59
Porque esta es la clase
00:08:00
Que vamos a usar para añadir
00:08:04
A ver que se le puede poner
00:08:07
Uno el nombre que quiera
00:08:09
Es decir
00:08:10
Para añadir objetos al fichero
00:08:17
Para añadir
00:08:19
Esta es la que nos va
00:08:20
Interesante instanciar
00:08:22
Porque esta no va a escribir cabecera
00:08:24
Vale
00:08:26
Entonces queremos que sea igualita
00:08:27
Que object output string
00:08:32
Pues nuestro mecanismo de hacer una clase
00:08:34
Clon de otra
00:08:36
Es esta
00:08:37
Es este, herencia y ya está
00:08:38
Vale
00:08:41
Entonces el primer error que nos da
00:09:04
Es que necesitamos hacer
00:09:08
Nos da el error
00:09:10
porque no hemos
00:09:11
hecho constructor, al no hacer
00:09:14
constructor
00:09:16
solamente tiene el por defecto
00:09:17
entonces el por defecto
00:09:20
se supone que llama
00:09:22
el super de arriba por defecto
00:09:24
también, que object output string
00:09:26
no tiene por defecto
00:09:28
entonces ese es el error que nos está dando
00:09:29
que ya lo hemos visto otras veces
00:09:32
vale, silencio
00:09:34
vamos a hacer un
00:09:36
constructor entonces específico
00:09:38
basado en el constructor de Object Output String
00:09:40
y el constructor de Object Output String
00:09:43
que nos pedía, vamos a ver
00:09:45
si nos vamos aquí a los otros métodos
00:09:46
cuando lo hemos usado
00:09:49
el Object Output String
00:09:51
como veis
00:09:54
su constructor necesita un
00:09:55
File Output String
00:09:58
¿vale? recordad ¿no?
00:10:00
el constructor de Object Output String
00:10:01
le pasamos un String de salida
00:10:03
al recurso que sea
00:10:07
¿vale?
00:10:09
Entonces yo aquí le he pasado directamente un file output string
00:10:10
Pero en general a object output string se le puede pasar cualquier cosa
00:10:15
Que sea output string, output string es la super clase
00:10:20
¿Vale? Output string es la super clase
00:10:23
¿Y qué implementaciones hay?
00:10:27
Pues un output string de fichero, un output string de socket
00:10:29
Vamos a ver la jerarquía rápidamente para que no suene rara
00:10:32
jerarquía
00:10:39
imágenes
00:10:42
output
00:10:49
a ver si así me sale una buena
00:11:07
vale, aquí por ejemplo
00:11:11
vale, nosotros estamos usando
00:11:18
como flujo de salida
00:11:26
un fichero, un flujo de salida tal cual
00:11:28
de Bison Fichero, File Output String
00:11:30
¿vale?
00:11:32
File Output String es una implementación más
00:11:33
de esta clase abstracta
00:11:36
Output String que significa
00:11:38
cualquier flujo de salida de bytes
00:11:40
cualquier flujo de salida de bytes
00:11:42
es decir
00:11:44
outputString es una clase abstracta
00:11:48
esta no la instanciamos
00:11:50
pero su significado es
00:11:51
cualquier flujo a partir del cual
00:11:54
yo pueda mandar bytes hacia algún lado
00:11:56
hacia algún lado
00:11:58
yo los enchufo por aquí desde mi aplicación Java
00:12:00
con el write
00:12:02
con el write los voy enchufando
00:12:03
con lo cual outputString tendrá el método write
00:12:05
yo con el write
00:12:08
voy aquí enchufando los bytes
00:12:09
un byte, un byte, un byte, lo enchufo con el write
00:12:11
y sale hacia algún sitio
00:12:13
ese sitio
00:12:15
hacia el que sale
00:12:17
esos bytes que yo voy enchufando
00:12:19
con el método write de output string
00:12:21
ese sitio cual es?
00:12:23
ese sitio ya depende de la implementación
00:12:25
por eso hay diferentes implementaciones
00:12:27
¿vale?
00:12:29
entonces la única implementación que hemos usado nosotros
00:12:31
es esta
00:12:33
que es el caso particular
00:12:34
en el cual los bytes que tú enchufas con el write
00:12:37
¿dónde salen?
00:12:39
hago un fichero y ahí se quedan
00:12:41
¿vale? y ahí se quedan
00:12:43
pero bueno, hay más implementaciones
00:12:45
de output string
00:12:47
entre ellas esta
00:12:49
¿vale? que también hemos usado
00:12:50
esto va
00:12:52
a una tubería, bueno, cosas
00:12:55
que ahora mismo no nos interesa
00:12:57
entonces, ¿qué quiero? esto para que
00:12:58
a cuento de que ha venido
00:13:00
pues para decir que al constructor de object
00:13:02
output string, al constructor le hemos pasado
00:13:05
nosotros un file output string, pero le puedes
00:13:07
pasar cualquier flujo
00:13:09
de salida general, cualquier flujo
00:13:11
de salida, entonces vamos a
00:13:13
nosotros ahora
00:13:15
declarar nuestro constructor
00:13:16
a ver
00:13:18
dime
00:13:20
con cualquier cosa que sea
00:13:21
una instancia de output stream
00:13:33
en general y file output stream lo es
00:13:35
acuérdate de la herencia, en una
00:13:37
superclase cae
00:13:39
cualquier instancia de cualquier subclase
00:13:40
exacto
00:13:43
con otro output string
00:13:46
entonces por eso el constructor
00:13:48
cuando ahora yo llame al super
00:13:50
de object output string
00:13:53
le voy a pasar una output string en general
00:13:54
entonces, a ver, vamos a hacer
00:13:56
el constructor que me pide
00:13:59
porque me pide hace un constructor explícito
00:14:00
porque el de por defecto no me vale
00:14:02
porque el por defecto es sin parámetros
00:14:04
llama al sin parámetros del de arriba
00:14:06
El de arriba no tiene sin parámetros
00:14:08
Entonces haz uno explícito que encaje
00:14:10
Pues en eso estamos
00:14:12
Haciendo uno explícito que encaje
00:14:13
Pues vamos a hacer un constructor
00:14:15
Explícito que encaje
00:14:18
Y a este constructor ¿Qué le pasamos?
00:14:19
Un output string
00:14:23
Y ahora lo hacemos
00:14:25
Llamando al constructor de la superclase
00:14:32
Que la superclase ahora ya sí que es esta
00:14:35
Que recibe este
00:14:37
¿Vale?
00:14:40
entonces da un errorcito
00:14:48
porque al instanciar
00:14:50
oye output stream puede salir una
00:14:53
excepción
00:14:54
pero bueno
00:14:56
la propago y se acabó
00:14:57
fijaos que aquí, cosa curiosa
00:15:23
cuando yo he quitado el este
00:15:26
aquí
00:15:27
no me ofrece
00:15:29
capturarla
00:15:35
no me ofrece el try catch
00:15:38
aquí en el constructor que es un método muy especialito
00:15:40
no me ofrece capturarla
00:15:43
me ofrece solamente propagarla
00:15:45
¿veis?
00:15:48
solo me ofrece propagarla
00:15:51
no me ofrece capturarla
00:15:53
porque el constructor es un método especialito
00:15:54
es un método, es el único método
00:15:57
si recordáis, el único método
00:16:01
que aquí no se pone ni void
00:16:03
ni valor de retorno, ni nada
00:16:05
¿por qué?
00:16:07
porque el constructor
00:16:08
se supone que devuelve
00:16:10
el objeto que se acaba de instanciar
00:16:12
es obligatorio que el constructor
00:16:14
Devuelva el objeto que se acaba de instanciar
00:16:17
¿Vale?
00:16:19
Entonces
00:16:22
Aquí el try-catch
00:16:22
Ni siquiera te lo permite
00:16:25
Porque si hiciéramos un try-catch
00:16:26
Bueno
00:16:28
Se va a volverlo a que se lo voy a hacer
00:16:33
Es decir, no solo te devuelve el objeto
00:16:35
Sin más
00:16:42
En memoria
00:16:43
Sino que te devuelve otro objeto
00:16:44
Que declara
00:16:47
Las propiedades de ESL que obtenemos con un get class
00:16:48
Bueno, unas cosas extrañas
00:16:51
lo digo solo como explicación
00:16:52
de por qué ni siquiera me ha ofrecido el try-catch
00:16:54
¿vale?
00:16:57
entonces, si yo hago un try-catch
00:16:59
y no funcionara el super
00:17:01
la instanciación en el catch
00:17:03
en el catch, tendría yo
00:17:04
que hacer el trabajo del super que no ha podido
00:17:07
funcionar, y no podemos
00:17:09
hacerlo, ese trabajo tendríamos que hacerlo
00:17:11
llamando al super otra vez, y otra vez
00:17:13
volveríamos a crear la misma sección
00:17:15
entonces, es imposible
00:17:16
hacer aquí un try-catch que tenga sentido
00:17:18
en un constructor
00:17:21
entonces
00:17:22
por eso ni siquiera me ofrece
00:17:24
el try catch
00:17:27
vale
00:17:29
pero si se acabó, si no puede instanciar
00:17:30
este pues
00:17:33
se lanza excepción y listo y se para el programa
00:17:34
y el constructor
00:17:37
no completa su tarea, no devuelve
00:17:39
nada y nada, bueno
00:17:41
pues esta clase ahora
00:17:43
es un clon idéntico, es la misma
00:17:45
que esta de aquí
00:17:47
porque tiene todo lo que tiene esta
00:17:48
y hemos hecho el constructor, pero el constructor
00:17:51
no se hereda, el constructor hay que hacerlo específicamente
00:17:54
lo hemos hecho, pero el constructor está basado en llamar
00:17:55
al constructor de arriba, ya está, con lo cual
00:17:57
es un clone, vale, pero queremos hacer
00:18:00
un cambio, que es, queremos
00:18:02
que esta clase no escriba la
00:18:03
cabecera, entonces en algún sitio
00:18:05
tiene que estar el método que escribe en la cabecera
00:18:07
y ese método habría que
00:18:10
sobrescribirlo
00:18:11
entonces, hombre, uno
00:18:13
se puede poner a buscar los métodos que tiene
00:18:15
object output string, a ver
00:18:17
cuál de esos métodos tiene pinta de estar relacionado
00:18:19
con escribir en la cabecera
00:18:22
y encontrará uno que se llama así.
00:18:24
Voy a asegurarme de si es este.
00:18:35
¿Cómo puedo yo asegurarme de que he acertado con el nombre
00:18:37
y el que he escrito es el de la superclase?
00:18:41
Muy bien, poniendo la anotación.
00:18:45
Vale, acepta la anotación sin problema.
00:18:55
Entonces, al aceptar la anotación
00:18:58
es que existe un método en la superclase
00:19:00
que es este, que hace
00:19:02
el que, pues deducimos que lo que hace
00:19:03
es escribir la cabecera, porque parece que se llama así
00:19:05
por algo se llama así, ¿no?
00:19:07
pues ¿qué vamos a hacer? dejarlo vacío
00:19:09
ya está, y ya está, ya tenemos la clase
00:19:11
modificada, es un clon
00:19:13
de object output string, pero esta no
00:19:15
escribe cabecera, no la escribe
00:19:17
pues perfecto, es justo lo que queremos
00:19:19
hacer un
00:19:22
object output string asociado al
00:19:23
fichero, pero que no escriba cabecera
00:19:25
se quede ahí, simplemente esperando a los
00:19:27
para escribir los objetos, punto pelota
00:19:29
ya está, ya tenemos esta clase
00:19:31
ahora
00:19:37
lo que cambia aquí es
00:19:38
nuestro insert
00:19:41
si nos vamos al destino dado con el insert
00:19:43
ahora
00:19:47
esto cambia
00:19:49
si
00:19:50
ahora hay que distinguir si el fichero
00:19:52
existe o no existe
00:19:55
cuando vamos a insertar un destino nuevo
00:19:56
Si el fichero no existe
00:19:59
No lo abrimos
00:20:03
Para añadir
00:20:07
Perdón, si el fichero existe
00:20:07
Lo abrimos con el
00:20:10
Objeto put string de añadir
00:20:12
Y si no existe con el otro
00:20:14
Bueno, pues entonces nuestro insert
00:20:16
Cambiará aquí
00:20:20
Y será
00:20:21
Si
00:20:23
El fichero existe
00:20:25
Y mi fichero es este
00:20:28
Si datos
00:20:29
Ya existe
00:20:33
Si datos existe
00:20:35
Entonces
00:20:38
Yo me voy a hacer un output string
00:20:39
Lo voy a hacer
00:20:43
Vale, más claro
00:20:49
Si el fichero existe, entonces tenemos que añadirlo
00:20:51
Con el object output string de añadir
00:20:54
Entonces, si el fichero existe
00:20:56
Sería
00:20:58
Esto que hemos hecho aquí
00:21:00
Si el fichero existe
00:21:01
Pero sería
00:21:06
Esta
00:21:10
el que queremos
00:21:11
si el fichero existe
00:21:15
el que queremos es este
00:21:18
que es el que no escribe cabecera
00:21:19
este es el que queremos
00:21:21
que no escribe cabecera
00:21:23
y si el fichero
00:21:26
no existe, quiero el original
00:21:35
mío, vale, ha quedado
00:21:48
un ifelse muy feo
00:22:03
porque estoy repitiendo código
00:22:04
entonces
00:22:07
veis esta sentencia
00:22:09
y esta sentencia
00:22:11
Pues son la misma
00:22:13
Entonces podríamos sacar este objeto
00:22:14
En lugar de meterlo en el try
00:22:17
Con recursos aquí
00:22:19
Podríamos sacarlo aquí
00:22:20
Y luego instanciarlo
00:22:22
Aquí dentro sin más
00:22:25
Pero bueno, esto ya sería en arreglos de
00:22:26
Por encima del método
00:22:28
Por encima del método
00:22:31
Este es el nombre del fichero
00:22:34
No tiene nada, entonces
00:22:36
Ahora hemos modificado el try
00:22:39
Sí, lo hemos modificado haciendo que no haga nada
00:22:47
Ya está modificado
00:22:52
WriteStreamHeader escribe la cabecera
00:22:52
Y esta variante nuestra
00:22:55
No queremos que escriba nada, pues se queda en blanco
00:22:57
Vale, pues entonces si el fichero
00:22:59
Existe, lo abrimos
00:23:04
En nuestra versión, que es la que no escribe
00:23:06
Cabecera
00:23:08
Lo abrimos en nuestra versión
00:23:08
Y escribimos el objeto
00:23:10
Y si el fichero si existe
00:23:14
Entonces
00:23:17
Y si el fichero no existe
00:23:20
Perdón
00:23:22
Entonces ahora lo abro en la versión original
00:23:23
¿Vale?
00:23:27
Este true aquí lo puedo quitar
00:23:35
Porque como no existe
00:23:36
Añadir
00:23:37
Es como escribir desde el principio
00:23:39
O sea, si el fichero no existe, abro con esta
00:23:42
Pero bueno, esto es lo mismo que teníamos el otro día
00:23:44
¿Vale?
00:23:51
¿Hasta dónde?
00:24:26
¿Pero qué quieres ver por aquí?
00:24:28
¿Por encima si no hay nada?
00:24:29
no, quiero ver lo que has puesto
00:24:30
en file nada
00:24:33
esto ya en el programa principal
00:24:37
ya se lo pasaré
00:24:39
el existe destino
00:24:40
lo habíamos dejado en blanco
00:24:48
por ejemplo, esto si queremos validar
00:24:50
si existe destino se hace este método
00:24:52
yo ahora mismo
00:24:54
pongo false para que
00:24:54
poder trabajar y que me diga que no existe
00:24:57
y avance, pero este se validaría
00:25:00
leyendo el fichero, etc
00:25:02
no os acordáis de nada del viernes
00:25:03
Está el viernes olvidado en toda vuestra cabeza
00:25:06
¿Eh?
00:25:08
¿En serio?
00:25:16
Vale, vale, bueno
00:25:27
Joder
00:25:29
Madre de Dios
00:25:31
La que
00:25:32
Pero vamos
00:25:33
Joder, ¿cómo os habéis puesto, por favor?
00:25:39
Tampoco habéis hecho muchos esfuerzos
00:25:47
Por mirarlo el fin de semana, ¿no?
00:25:48
Bueno
00:25:53
Está todo en la grabación en cualquier caso
00:25:54
El viernes
00:25:56
Vale
00:25:57
Ya está
00:25:58
Si el fichero existe
00:26:01
Abrimos con este y escribimos
00:26:05
Y si el fichero no existe
00:26:08
Abremos con este otro
00:26:10
Y se acabó
00:26:11
Y nada más
00:26:13
Vamos a volver a probarlo
00:26:15
A ver si ahora no nos da ese error
00:26:16
Vamos a borrar el que existía
00:26:18
Porque ese ya está corrupto
00:26:20
El que existía
00:26:22
Vamos a borrarlo
00:26:24
Y
00:26:25
Esto vamos a
00:26:33
vale, cuidado cuando probáis ejecuciones
00:26:36
que tienen menú
00:26:39
y el programa no lo habéis
00:26:40
no habéis salido de él
00:26:43
porque los ficheros a los que esté asociado
00:26:44
se pueden quedar bloqueados
00:26:47
entonces ya no os funciona ni el rename
00:26:50
ni todo eso
00:26:52
entonces
00:26:52
venga, vamos a volver a probarlo
00:26:55
insertamos un destino
00:26:57
de nuevas, cuyo nombre
00:27:05
Madrid y precio
00:27:07
1000, vale
00:27:09
Y vamos a ver si está
00:27:11
Vamos a recuperar
00:27:12
A ver este destino, a ver si está ahí
00:27:14
Está ahí, vale
00:27:16
Ahora insertamos un segundo
00:27:18
Que aquí venía el problema
00:27:20
Vamos a insertar un segundo
00:27:21
Oslo 2000
00:27:23
Vale
00:27:26
Entonces en principio lo ha insertado
00:27:28
Sin colar la cabecera entre medias
00:27:30
Eso es lo que esperamos
00:27:32
Porque lo ha hecho con la clase nueva
00:27:33
Entonces el fichero se habrá quedado bonito
00:27:35
Con la primera cabecera
00:27:38
esa no se ha tocado, la primera original
00:27:39
el fichero de Madrid que ya estaba
00:27:41
el destino, perdón, el objeto
00:27:43
y el siguiente, en principio se ha debido
00:27:44
quedar sin corromper porque al haber añadido
00:27:47
los sin cabecera
00:27:49
se han quedado los objetos uno detrás de otro
00:27:51
sin problema, vamos a ver
00:27:53
si es verdad, vamos a recuperar
00:27:55
el primero de todos
00:27:57
pues sí, vamos a recuperar
00:27:58
el segundo
00:28:01
pues sí, vale
00:28:01
pues arreglado
00:28:05
vale, a ver
00:28:07
¿qué ocurre? diréis, jo, qué cosa tan rara hemos tenido que hacer
00:28:14
heredar de una clase y hacer una variante, pues sí, es un poco rara
00:28:18
¿pero por qué? porque estamos trabajando
00:28:21
contra los ficheros como si fuera una base de datos
00:28:24
que es, yo tengo cada objeto que yo voy a insertar
00:28:29
lo inserto directamente en el fichero, cuando voy a recuperar, recupero del fichero
00:28:33
entonces cuando uno trabaja con ficheros, como dijimos el otro día
00:28:37
hasta
00:28:40
10.000, 100.000
00:28:42
bueno, no sé si 100.000 me he pasado
00:28:44
pero unos cuantos miles
00:28:46
no merece la pena trabajar así, es mucho más
00:28:47
sencillo, lees
00:28:50
todo el contenido del fichero
00:28:52
lo vuelcas a una colección
00:28:53
y trabajas con la colección
00:28:55
y ahí ya insertas
00:28:57
guardas, borras, eliminas
00:28:59
lo que quieras, y luego
00:29:02
cuando ya has terminado, toda esa colección
00:29:03
entera va al fichero entero
00:29:05
sobre escribiendo lo que había
00:29:07
Con lo cual ahí no hay problemas
00:29:09
De estar añadiendo
00:29:11
Al fichero
00:29:12
No hay ese problema
00:29:14
¿Vale? Entonces si trabajamos así
00:29:16
Este tema de la cabecera nos da igual
00:29:19
Que es, cojo
00:29:20
Todos los objetos que hay
00:29:22
Los vuelco enteros a una colección
00:29:25
Trabajo con la colección
00:29:27
Yo olvidándome de ficheros, todo
00:29:28
Insertar, recuperar, lo que quiera
00:29:30
Y ahora ya cuando he acabado y me voy a mi casa
00:29:32
O cuando quiero
00:29:35
Que se refleje en el fichero, cuando quiero
00:29:36
Pum, todo entero
00:29:38
Borrando lo que hubiera
00:29:40
Me da igual, todo entero
00:29:43
Borrando lo que hubiera
00:29:44
Luego ahí no hubiera tenido este problema
00:29:45
¿Vale?
00:29:47
Y esa es la solución habitual
00:29:50
A menos que uno tenga muchos
00:29:52
Unos cuantos miles de objetos ya
00:29:54
Unos cuantos miles de objetos
00:29:56
¿Vale? Nosotros lo estamos haciendo así pues
00:29:57
Para verlo
00:30:00
Y porque estamos simulando
00:30:02
Una situación real que es como se trabaja con la base de datos
00:30:04
Con una base de datos no vuelcas la base de datos entera
00:30:07
A una colección
00:30:09
Tú cada vez que quieres hacer algo
00:30:10
Vas directamente a la base de datos
00:30:12
Pues estamos simulando esa forma de trabajar
00:30:14
Que es la real
00:30:16
Vale, pues ya que teníamos ese
00:30:17
Ya que tenemos ese problemilla arreglado
00:30:20
Nuestro insert ya funciona perfectamente
00:30:22
Nuestro get
00:30:26
Pues recupera del fichero
00:30:27
Con el bucle de lectura
00:30:29
Y delete y update
00:30:30
¿Estos lo teníais hechos?
00:30:33
¿estáis en ellos?
00:30:35
venga, pues completad delete y update
00:30:38
de destino solamente
00:30:41
¿qué? delete y update
00:30:42
estos necesitan el famoso
00:30:44
fichero temporal o de maniobras
00:30:46
¿vale? delete
00:30:48
pues bucle de lectura del original
00:30:53
con cada objeto
00:30:55
decido si lo copio tal cual
00:30:57
o no lo copio, ¿de qué dependerá
00:30:59
que lo copio o no? pues si
00:31:01
el nombre de ese destino es el que quiero
00:31:03
eliminar, no lo copio, si no lo ves lo copio
00:31:05
el de modificar, lo mismo
00:31:07
leo objeto, copio, leo objeto, copio
00:31:09
pero si el que leo
00:31:12
su nombre es este
00:31:14
pues lo copio modificado
00:31:16
con el precio de este
00:31:18
y luego ya borro original
00:31:19
y cambio nombre
00:31:22
vale, pues venga
00:31:23
completad estos dos
00:31:25
y ahora los corregimos
00:31:27
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 1
- Fecha:
- 23 de marzo de 2026 - 13:18
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 31′ 31″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 126.64 MBytes