20250401 ejemplo obj serializable - 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:
entonces me he creado aquí una clase app que es una palabra está vacía vale me ha hecho una clase
00:00:00
alumno y ahora lo que vamos a hacer es intentar crear una pequeña clase que lo que hagan a crear
00:00:09
alumnos y pero me los guarde en un fichero como objetos y no como como tipo de texto
00:00:17
vale, esto es desde cero
00:00:28
por lo tanto vamos a repasar
00:00:34
también como se hace
00:00:36
todo, vale, entonces aquí
00:00:37
lo que vamos a
00:00:40
crear es una aplicación
00:00:42
hacemos dos
00:00:44
aplicaciones distintas, una aplicación
00:00:45
que simplemente es para guardar
00:00:48
los
00:00:50
los objetos, vale, los
00:00:51
alumnos, etc, etc
00:00:55
Y luego hacemos una aplicación distinta que en vez de lo que se encarga es de cargar los objetos y visualizarlos, ¿vale? Así, se podría hacer como hemos hecho la otra vez en dos tabs y luego cambio de tab a otro, pero más o menos da igual.
00:00:57
Entonces, esta de aquí será la app para crear alumnos.
00:01:13
La hago fea porque no tengo ganas de perder tiempo en esto.
00:01:17
Pero, bueno, ¿me entendéis?
00:01:20
Aquí tenemos TextField.
00:01:23
Antes del TextField, cambio este de aquí en un Absolute.
00:01:25
TextField.
00:01:36
Esto será el nombre.
00:01:37
Esto será el apellido.
00:01:44
aquí habrá un botón para añadir
00:01:47
vamos a intentar
00:02:01
para añadirlo a la
00:02:08
¿cómo se dice?
00:02:10
a la estructura dinámica que va a ir construyendo
00:02:13
y luego hacemos que
00:02:16
intentamos hacer que al cerrar
00:02:20
ayer lo hicimos y luego no lo hicimos
00:02:22
al cerrar esta aplicación
00:02:24
como última cosa que haga antes de cerrarse el todo
00:02:27
Intente guardar el fichero, o sea los datos que ha creado en un fichero
00:02:30
Y se apaga así, vale
00:02:38
Vamos a verlo, si lo conseguimos
00:02:39
Entonces este botón de aquí lo llamamos save o add
00:02:43
Y pondremos add
00:02:47
Este de aquí lo llamamos txt nombre
00:02:51
este de aquí
00:03:00
lo llamamos
00:03:03
txt
00:03:06
apellido
00:03:07
vale
00:03:09
aquí debería poner
00:03:14
una cosa más bonita
00:03:16
pero vamos a la funcionalidad
00:03:18
vale, no vamos a la
00:03:21
a la estética
00:03:22
ok, entonces
00:03:25
ahora tengo estas dos cosas
00:03:26
cuando le doy al botón add
00:03:28
tengo un action listener
00:03:30
que tiene que hacer algo, vale
00:03:32
primero de todo tengo que ponerme aquí donde guardo las cosas vale entonces tendré un arre
00:03:33
listo un linked listo una estructura de este tipo un set podría hacer un set para que si
00:03:46
intentas añadir dos veces el mismo alumno no te lo añade dos veces y que si lo añades una segunda
00:03:51
vez lo sobre escribe o algo por el estilo vale no lo sé se podría hacer una set para intentar
00:03:58
hacer que haya como clave un el identificador para que luego sea más fácil buscar un alumno
00:04:08
por identificador por ejemplo hay varias opciones está dejo vosotros a monset set alumnos es igual
00:04:16
al año más set luego si necesito algo más de asset lo pondré aquí también pero si lo hago
00:04:29
así, mañana si quiero cambiar
00:05:03
esto en una cosa distinta
00:05:05
como un trisecto o cosa por el estilo
00:05:07
no me importa porque ya
00:05:08
esto
00:05:10
lo cojo, ¿vale? por eso lo dejo más
00:05:13
con una super clase
00:05:15
en vez que una super clase, si ahora
00:05:17
cuando estoy haciendo trabajo me doy cuenta
00:05:19
que necesito algo más de esto
00:05:21
pues ya, ¿vale?
00:05:22
entonces, ahora
00:05:25
aquí, al botón
00:05:27
add, me crea un nuevo
00:05:29
alumno, alumno
00:05:31
A es igual a new alumno
00:05:32
De
00:05:35
Txt
00:05:36
Txt
00:05:41
Nombre punto get text
00:05:42
Coma
00:05:46
Txt apellido
00:05:48
Punto get text
00:05:51
Punto y coma
00:05:54
Vamos a hacer un paréntesis
00:05:58
Vale
00:06:00
Y con esto me crea un alumno
00:06:01
Y ahora lo que haré es que alumnos.ad, esta cosa aquí lo que me está haciendo es, cada vez que le doy al botón ad me añade en este set, este alumno.
00:06:03
Pregunta para vosotros, entrego esto, ¿cuánto saco? ¿Qué me falta? ¿Qué no he hecho que debería hacer y que suspenda automáticamente el RA7?
00:06:27
colecciones, el que habéis suspendido todos
00:06:48
ah bueno, entonces el RSI
00:06:56
colección
00:07:00
¿por qué he suspendido
00:07:03
las colecciones?
00:07:04
la idea es también que el lunes
00:07:09
lunes, o sea, no
00:07:12
dentro de seis meses, lunes
00:07:13
hacemos un examen
00:07:15
para que vosotros podáis recuperar
00:07:17
el 6 con el objetivo
00:07:20
que vosotros estudiéis algo
00:07:22
y recuperéis el 6
00:07:24
pero si no estudiáis
00:07:25
no lo vais a recuperar
00:07:27
la idea es que
00:07:28
en estas semanas vosotros habéis estado
00:07:31
haciendo ejercicios sobre clases
00:07:33
sobre
00:07:35
colecciones
00:07:37
¿no? el intento es bueno
00:07:38
pero lo que has dicho no
00:07:54
vuestro compañero ha dicho
00:07:55
hay que hacer el equals
00:08:01
porque es un hash
00:08:02
estabas allí, cuando has dicho
00:08:04
hay que definir el equals, has dicho, ah menos mal
00:08:11
porque es un hash
00:08:13
Claro, hay que hacer el equals porque es un set
00:08:14
Y el h porque es un hset
00:08:19
Pero acordaos que todas las veces que me tocáis un set o cosa por el estilo
00:08:25
Como el set se basa en que no puedo añadir dos veces el mismo alumno
00:08:32
Entonces necesito definir cuándo dos alumnos son iguales
00:08:36
Entonces tengo que tocar el equals.
00:08:45
Y cada vez que toco el equals tengo que tocar el hash, el hash code, ¿vale?
00:08:47
Sobre todo porque este es un hash set, entonces utilizará el hash code para guardar las cosas ahí dentro, organizar las cosas.
00:08:52
Pues entonces necesito toquetear los dos.
00:08:58
Y en alumno, como la otra vez estaba haciendo un, ¿cómo se llama esto?
00:09:01
Un relist, pues entonces no los he puesto.
00:09:07
Pero bueno, simplemente me voy aquí y le digo,
00:09:10
genérame un hash code y un equals.
00:09:18
Pregunta para vosotros, ¿el equals y el hash code sobre qué se tienen que basar?
00:09:20
Es decir, ¿cuándo dos alumnos son iguales?
00:09:26
Cuando tienen la misma idea. Por eso existe la idea.
00:09:40
No me interesa el nombre y el apellido.
00:09:43
Me interesa la idea.
00:09:47
¿Sí?
00:09:49
¿Sí? Técnicamente podría haber dos alumnos que se llamen exactamente igual.
00:09:50
Lo hecho es que si tienen también el mismo ID, pues son el mismo alumno.
00:09:56
Si tienen ID distintos, pues son dos alumnos que se llaman igual.
00:10:01
¿Sí? Entonces lo que me interesa de verdad es el ID.
00:10:06
Entonces aquí marco solo el ID.
00:10:09
Generate.
00:10:11
y aquí ahora tengo mi
00:10:12
equals y mi hashcode
00:10:14
¿vale? basados
00:10:16
sobre el identificador de este alumno
00:10:17
¿sí? vale
00:10:20
perfecto
00:10:22
lo hago aquí
00:10:23
y ya está, entonces este de aquí
00:10:25
me debería funcionar
00:10:28
ahora mismo añadiendo
00:10:30
la cosa, hagamos un
00:10:32
chiso
00:10:34
de alumnos
00:10:34
vamos a ver si hace algo
00:10:38
pongo el alumno A
00:10:43
y me ha añadido el alumno A
00:10:46
pongo el alumno B
00:10:51
y me ha añadido también B
00:10:55
fijaos que ahora mismo
00:10:58
el orden
00:11:01
no lo garantiza
00:11:03
¿vale?
00:11:07
entonces aquí
00:11:10
habrá que ver qué hacemos
00:11:11
a la hora de
00:11:13
¿qué? de recargarlo
00:11:15
De cuando cargo los ficheros, los alumnos.
00:11:20
Porque ayer los alumnos se guardaban ordenados y se escribían en el fichero ordenados.
00:11:28
Vale, perfecto.
00:11:35
Entonces cuando lo recargaba no tenía que hacer nada con el identificador
00:11:36
porque venían ordenados con el identificador correcto.
00:11:40
Entonces, perfecto.
00:11:43
Pero ahora no lo sé.
00:11:44
Porque si os fijáis, ya me los ha mezclado.
00:11:46
Lo escribiera con este orden de aquí
00:11:51
Cuando lo recargo
00:11:54
Si voy pillando del primero al último
00:11:56
Este de aquí se me transformaría
00:11:58
En el alumno cero
00:12:00
Este en el uno y este en el dos
00:12:01
Entonces tendré que tener cuidado
00:12:03
Con esto
00:12:06
Tendré que hacer algo con esto
00:12:07
¿Qué hago con esto?
00:12:10
Punto short no, punto short a lo mejor
00:12:15
Punto short
00:12:17
Es corto
00:12:20
Short es
00:12:21
Short
00:12:22
short, short, short
00:12:25
short no, short
00:12:27
¿qué hago?
00:12:29
¿qué hago?
00:12:41
comparable, vale
00:12:42
¿qué hago?
00:13:02
alumno A
00:13:17
es igual a alumno
00:13:19
ahí
00:13:21
aprenderé a escribir uno de estos años
00:13:25
O
00:13:28
porque esto tiene que ser un alumno
00:13:28
¿sí?
00:13:31
y si no es, que explote
00:13:34
¿sí?
00:13:36
¿Y ahora qué hago?
00:13:38
O punto id menos a punto id.
00:13:45
Bueno, dis.
00:13:52
A.
00:13:55
Me he equivocado seis veces.
00:13:57
Dis aquí y a aquí.
00:13:59
Ahora sí.
00:14:01
Esto ordenado es por id.
00:14:04
Ahora, la duda que tengo es a ver si me lo ordena al revés, del último al primero, pero creo que no.
00:14:07
O sea, en teoría, si este es el alumno 0 y este es el alumno 3,
00:14:14
Me hará 3 menos 0
00:14:17
Y por lo tanto me dirá que esto es mayor que esto
00:14:19
O sea que no
00:14:22
Debería ser al revés
00:14:23
Luego lo probamos y si sale al revés
00:14:25
Lo cambiamos
00:14:28
Si ahora esto es 0
00:14:29
Y esto es 3
00:14:32
Sale un número negativo
00:14:33
Entonces me está diciendo que this viene antes que este
00:14:35
O sea que este debería ser correcto
00:14:38
Si son el mismo y de
00:14:41
Me dará 0
00:14:42
Si son este aquí es 3 y este es 0
00:14:43
pues me dirá que 3 viene antes de 0
00:14:46
porque me da un número positivo
00:14:49
¿os acordáis como funciona el compare?
00:14:50
no, pues miradlo
00:14:53
¿sí?
00:14:55
entonces con esto en teoría
00:14:57
ya se pueden comparar
00:14:59
y se pueden organizar
00:15:01
¿qué hago? vamos a ver
00:15:02
sí, pues ahora
00:15:32
me lo está poniendo bonitos
00:15:48
organizados
00:15:50
¿vale?
00:15:52
puede que esto no sea
00:15:57
la forma más guay de hacerlo
00:15:59
yo aquí estoy creando
00:16:01
como los voy dando ordenados
00:16:03
estoy creando un tree
00:16:05
que en realidad no es un árbol
00:16:07
en realidad está yendo todo a la derecha
00:16:09
¿sí?
00:16:11
porque le pongo el 0, lo pongo aquí
00:16:13
le pongo el 1, oh está a la derecha, le pongo el 2
00:16:15
oh está a la derecha del 0, está a la derecha
00:16:17
del 1, oh le pongo el 3, está a la derecha
00:16:19
del 0, está a la derecha del 1, está a la derecha
00:16:21
del 2, entonces sostancialmente
00:16:23
me está saliendo una relist
00:16:25
¿sí? pero es una
00:16:26
opción para lograr esto la otra opción es dejarlo con asset y luego hacer un short pero no sé cuánto
00:16:32
gano cada vez que añado uno a hacer un reorganización de todo el asset es útil y es
00:16:40
rápido cuando no te interesa la el orden pero si cada vez tu idea no me interesa el orden pero
00:16:48
ordena melo cada vez que pongo algo pues entonces las 7 también es la cosa más interesante si me
00:16:56
interesa el orden pues entonces tengo el tricet que me garantiza el orden garantiza que me lo
00:17:04
estaba ordenando es una opción la otra opción que nos queda es hacer el asset modificar el alumno
00:17:08
para que haya, por un lado, el constructor este de aquí, que me da el identificador definitivo,
00:17:19
y otro constructor donde acepto yo el identificador, pero me expongo a que luego haya problemas con los identificadores.
00:17:28
Entonces, es peligroso.
00:17:38
O sea, que alguien me meta el alumno 500 sin haber hecho el 499,
00:17:41
y que entonces se quede allí un código que no existe.
00:17:45
Y no lo sé, ¿vale? Por lo tanto, prefiero dejar esto que se haga así y organizar esto de esta forma. Vale, perfecto. Entonces, ahora lo que hemos hecho es, sí, tú ayer no estabas, ¿verdad? Haber estado ayer.
00:17:50
pues empieza desde cero
00:18:29
pero como tú nada más encenderlo
00:18:32
vas a cargar
00:18:34
los ficheros que tenías antes
00:18:36
los alumnos que tenías antes
00:18:38
pues técnicamente lo que estás haciendo
00:18:40
es
00:18:42
como se dice, creas el primero
00:18:43
y le darás cero, creas el segundo
00:18:47
y le darás uno y entonces
00:18:48
tu aplicación llegará a un momento que has creado
00:18:49
los, has dicho catorce
00:18:52
antes y entonces el próximo
00:18:54
que crearás será el conidentificador catorce
00:18:56
funcionaba, ¿vale?
00:18:58
hoy es un poquito más complejo
00:19:01
porque tenemos dos aplicaciones distintas
00:19:03
entonces habrá que ver qué hacemos
00:19:05
pero, por ahora
00:19:06
felices
00:19:11
¿sí?
00:19:13
es un problema
00:19:17
para
00:19:18
los alumnos de la
00:19:18
del después de recreo
00:19:21
probablemente, ¿sí?
00:19:23
entonces, ahora
00:19:26
nos queda esto de decir, vale
00:19:27
esto funciona todo pero no hemos usado todavía los ficheros ahora queremos guardar esto en un
00:19:29
archivo vale fenomenal entonces para guardar esto en un archivo tenemos que en un determinado
00:19:36
momento guardar una opción meto un botón aquí de pincho aquí el guardo pero hemos dicho intentamos
00:19:41
hacerlo de otra forma cuando yo he usado esta aplicación ya he creado lo que sea pues
00:19:48
simplemente la cierro y que él me lo guarde vale vamos a ver si conseguimos encontrar una forma de
00:19:52
hacer esto window closing aquí tengo un par de eventos que me pueden ser
00:19:58
útil que son cuando la ventana se está cerrando o cuando las ventanas está
00:20:15
cerrada vale entonces vamos a poner esto cuando la ventana ya está cerrada pues haz algo y lo
00:20:21
que hagamos es si eso adiós primera cosa es antes de desarrollar aquí el código miro si
00:20:33
efectivamente me funciona vale lo lanzo añado lo que tengo añadir ahora le doy a cerrar pues aquí
00:20:44
no me escribe adiós, ¿vale?
00:20:52
Por lo tanto, no me
00:20:54
vale como opción.
00:20:56
¿Sí?
00:20:59
Entonces esto lo puedo quitar.
00:21:00
Esto lo ha metido sobre frame.
00:21:02
Este de aquí, por alguna
00:21:07
razón, no me está valiendo.
00:21:08
¿Vale? Probamos el otro.
00:21:10
Probamos el window
00:21:13
closing.
00:21:14
Sí.
00:21:16
Window closing.
00:21:23
Venga. Mientras
00:21:26
se está cerrando que vea algo y lo probamos añado lo cierro pues ahora me ha escrito algo pues esto
00:21:27
me vale sí o los pruebas y o si no hago como hacen las personas humanas vale que es lo busco
00:21:39
internet en internet busco hoy quiero hacer un evento cuando se está cerrando la cosa donde lo
00:21:47
pongo y allí o viendo así que closet de no me ha funcionado el closing no me ha
00:21:54
funcionado abro chat gpt y le pregunto qué diferencia hay entre el evento
00:21:59
closing el evento a closet y él me lo explica y luego le digo mira estoy
00:22:04
intentando hacer esto pero si lo pongo en closet no aparece inclusive porque y
00:22:09
él me lo explica vale esto es el uso bueno de la inteligencia artificial
00:22:13
No, hazme código. Eso es feo.
00:22:19
Aún si parece ser que alguien ha dicho, el jefe de ChagPT,
00:22:24
hoy ha dicho que en un par de años ya seréis inútiles.
00:22:30
Sigo. Vale, entonces, hemos encontrado el evento que hace algo cuando se apaga.
00:22:53
Vale, entonces, en este evento de aquí, que ahora no me acuerdo dónde está.
00:23:02
closing
00:23:05
¿vale? vamos a hacer
00:23:11
lo que queremos hacer, que es al
00:23:14
cerrarse, antes de cerrarse
00:23:15
pues intenta escribir en un fichero
00:23:17
entonces creamos nosotros un fichero
00:23:19
por ahí, ¿vale? entonces file
00:23:21
f es igual a new
00:23:23
file de
00:23:25
objetos
00:23:27
.txt
00:23:30
fijaos, nos hará un texto
00:23:34
pero si le pongo .txt
00:23:36
luego lo puedo abrir fácilmente con el block
00:23:38
notes en realidad para ser más bonito así vale o gato aquí se enfada porque no tengo file aquí
00:23:40
podía preguntarme si existe ya o no pero ya lo hace él me creó un object output 3 am os vale
00:23:57
esto también siempre en vuestro programa
00:24:11
se llamará os, desde ahora
00:24:13
para siempre, es new
00:24:15
object
00:24:16
output
00:24:17
stream
00:24:21
si, si, soy todos fanáticos
00:24:23
del
00:24:25
karate veo
00:24:25
aquí le tengo que poner un new
00:24:28
file output
00:24:33
stream
00:24:35
supongo, df
00:24:39
este de aquí
00:24:41
lo cargo, este de aquí
00:24:45
lo pongo en un
00:24:47
try-catch
00:24:49
y ya está
00:24:49
entonces
00:24:55
si esto funciona
00:24:57
ahora puedo escribir mis objetos
00:24:59
¿qué hago?
00:25:01
pues recorro mi set
00:25:03
¿vale? y voy escribiendo
00:25:05
los ficheros, ¿cómo recorro un set?
00:25:07
set es alumnos
00:25:11
alumnos.literator
00:25:12
iterator
00:25:17
de alumno
00:25:22
it
00:25:24
es igual a esta cosa aquí
00:25:27
y ahora vile
00:25:30
it.asnext
00:25:39
os
00:25:43
punto
00:25:49
vrite
00:25:51
object
00:25:53
de it
00:25:54
punto
00:25:58
next
00:25:59
esta cosa aquí me debería recorrer
00:26:01
todos los objetos
00:26:08
Pilla un objeto y lo escribe en mi fichero
00:26:09
Entonces, si yo lanzo esto
00:26:13
Escribo el señor A
00:26:20
Escribo el señor B
00:26:24
Escribo el señor C
00:26:27
Y ahora lo cierro
00:26:31
Explota
00:26:33
¿Por qué ha explotado?
00:26:34
Efectivamente, ¿os acordáis que yo os he dicho
00:26:45
Y mira, para poder guardar un objeto, para poder trabajar con los objetos, los objetos tienen que ser, o sea, para poder utilizar Object Output Stream, los objetos tienen que ser serializables.
00:26:47
Y esto no es serializable.
00:26:59
Este es comparable de alumno.
00:27:01
Entonces, este es un alumno.
00:27:07
Y entonces, esto...
00:27:11
Pues entonces, aquí, además de implementar comparable, tengo que implementar también serializable.
00:27:14
Y no puede hacerlo porque solo se puede implementar
00:27:23
Una interfaz, ¿correcto?
00:27:26
¿Qué es que solo se puede hacer uno?
00:27:28
Extender
00:27:38
Solo puede heredar de una
00:27:39
Pero puedo implementar cuanta me da la gana
00:27:41
Por lo tanto, coma
00:27:42
Serializable
00:27:44
Él me pregunta, ¿qué es esto serializable?
00:27:46
Impórtalo
00:27:49
Vale, ya está
00:27:50
Pues no tengo que hacer nada más
00:27:51
Ahora eres serializable, fenomenal
00:27:53
Entonces
00:27:55
voy a buscar
00:27:58
este de aquí
00:27:59
que era permanencia objeto
00:28:02
veis que el objeto me lo ha creado
00:28:04
estará vacío, no, esta cosa rara
00:28:05
¿qué es esto?
00:28:08
ni idea, fuera
00:28:09
probablemente esta es la cabecera
00:28:11
o algo por el estilo, ¿vale?
00:28:14
vuelvo a rehacerlo, vamos a ver
00:28:16
si funciona, hago el A
00:28:18
hago el B
00:28:21
hago el C
00:28:24
y ahora cierro
00:28:26
Ahora ya no explota. Si me voy al ficherito este de aquí, dentro me encuentro esta cosa aquí. ¿Qué es? Ni idea. No es inteligible para el ser humano.
00:28:31
Bueno, veis que hay cosas que no son char, ¿vale?
00:28:51
Ahora, algo, algo lo veo.
00:28:54
Aquí debe de estar nombre por algún lado.
00:28:59
Luego aquí está A, está B, está C.
00:29:02
Pero si os fijáis, además de esto está cosas raras, que no entiendo.
00:29:08
¿Sí? Cuando esto se complica mucho, pues posiblemente no lo entiendo.
00:29:14
¿Sí?
00:29:18
Esto es, son datos escritos como bytes, que luego he abierto con un fichero de texto, con un blog de notas,
00:29:18
que entonces intenta pillarme los bytes y transformármelos en carácteres.
00:29:31
Entonces, aquellos bytes que sí representan carácteres, pues lo consigo leer.
00:29:35
Pero aquellos bytes que no son carácteres, pues salen cosas raras.
00:29:42
¿Sí? Entonces, esto no está pensado para que lo lea un ser humano
00:29:48
¿Ludas? Vale, entonces, tengo mis objetos guardados
00:29:54
¿Sí? Vale, fenomenal
00:30:02
Ahora me hago una segunda aplicación, que es la que quiere importar las cosas
00:30:04
¿Vale? Entonces, en el... ¿Dónde está? ¿Dónde está?
00:30:09
Objetos, permanencia, objetos, será esto, ¿no?
00:30:15
Me crea un nuevo
00:30:19
Aplicación
00:30:21
Que sea
00:30:23
App 2
00:30:26
O App
00:30:27
Show Data
00:30:28
Esta será una nueva aplicación
00:30:31
Donde aquí tendré que empezar
00:30:41
A hacer todo, vale
00:30:43
Lo que crearé es
00:30:45
Un panel aquí en el medio
00:30:47
Un botón
00:30:49
A la derecha
00:30:52
Un botón a la izquierda
00:30:53
no, no, esto no lo quiero
00:31:01
entonces, a ver, espera
00:31:03
metamos antes los botones
00:31:08
botón aquí
00:31:10
otro botón aquí
00:31:11
y en el medio
00:31:14
quiero un panel
00:31:17
en este panel
00:31:18
quiero poner
00:31:22
las
00:31:24
campos de texto
00:31:25
ah, pero espera, este panel
00:31:27
tiene que ser
00:31:30
absolute
00:31:33
Esto va aquí
00:31:35
Esto será el nombre
00:31:40
Esto será el nombre
00:31:42
Y este de aquí será
00:31:46
El apellido
00:31:51
Esto de aquí me permitirá
00:31:56
Me permitirá moverse
00:31:58
Este de aquí
00:31:59
Lo pondré así
00:32:06
Este de aquí lo pondré
00:32:07
Así
00:32:10
y estos tres
00:32:11
mira que bonito
00:32:15
terrible, pero
00:32:19
vale
00:32:22
entonces la idea es que ahora cuando me cargue
00:32:23
cuando se cargue, cuando inicie
00:32:27
este de aquí lo que haga es
00:32:29
leer desde el fichero
00:32:30
toda la información que tiene
00:32:33
y luego empezar a ponerlas aquí
00:32:35
por ahora antes de ponerme a hacer que funcione esto
00:32:36
voy a hablar de los ficheros
00:32:39
tengo que empezar y leerme las cosas
00:32:41
del fichero, vale, entonces
00:32:43
en la parte de inicialización
00:32:44
cuando este hace init
00:32:46
inicialize
00:32:48
aquí voy a
00:32:50
leer los datos, a cargarme los datos
00:32:52
entonces lo que haré aquí
00:32:55
es crearme
00:32:57
un set también
00:32:58
de alumno
00:33:00
alumnos
00:33:03
que es igual a new
00:33:06
3 set de alumno
00:33:09
como antes
00:33:15
vale
00:33:19
esto
00:33:21
y esto
00:33:23
y lo que intentaré hacer es que
00:33:25
al hacer initialize me haga
00:33:28
un cargar datos
00:33:30
por ejemplo
00:33:32
este programa de aquí
00:33:33
lo que tiene que hacer
00:33:38
este método es cargar los datos
00:33:41
desde el fichero y mirarlos
00:33:43
guardarlos
00:33:46
en esta cosa
00:33:46
aquí
00:33:49
entonces, ¿qué hago aquí?
00:33:50
object
00:33:52
file
00:33:57
file
00:33:58
ff es igual a new
00:33:59
file de
00:34:02
objetos
00:34:02
.txt
00:34:05
lo hemos llamado
00:34:07
no me acuerdo
00:34:08
pillo el fichero
00:34:09
aquí podría comprobar
00:34:15
si existe
00:34:16
venga lo hacemos
00:34:17
no quiere
00:34:17
no quiere
00:34:24
o no está dentro de
00:34:26
de otra cosa
00:34:32
no lo sé
00:34:33
import
00:34:33
java
00:34:34
.util
00:34:35
.
00:34:36
la fila
00:34:37
o a java.io
00:34:40
java.io
00:34:41
input output
00:34:44
aquí object
00:34:47
o input
00:34:50
stream
00:34:52
ois
00:34:53
es igual a new object
00:34:55
input stream
00:34:58
de
00:35:02
new
00:35:03
file
00:35:04
input stream
00:35:06
de f
00:35:08
ahora no lo haces
00:35:09
vale, esto se enfada
00:35:13
tiene que estar en un track edge
00:35:20
vale, y ahora
00:35:21
lo que voy a hacer es
00:35:25
leer objetos
00:35:28
vale, paso número
00:35:29
uno de prueba
00:35:31
alumno
00:35:33
a es igual
00:35:35
a ois punto
00:35:37
read object
00:35:39
esto se enfada
00:35:42
alumno
00:35:45
se enfada
00:35:48
add catch clause, vale
00:35:50
me añade un class not found exception
00:35:55
si, vale
00:35:57
si, so
00:35:59
ah
00:36:02
vamos a ver si funciona
00:36:03
veis que al cargarse
00:36:09
me ha cargado el primer
00:36:11
alumno
00:36:13
vale, tenía tres alumnos
00:36:15
allí, pam
00:36:17
al cargarse, me ha cargado
00:36:28
los tres alumnos. Pregunta, ¿qué pasa
00:36:31
si leo una cuarta vez? Explosion. ¿Qué
00:36:35
explosion es? End of file exception.
00:36:51
¿Vale? Entonces, esto puede ser
00:36:57
dos opciones. O sé cuántos ficheros hay allí
00:36:59
de alguna forma, cuántos objetos hay allí de alguna forma,
00:37:02
o tendré que hacer algo
00:37:07
para decir, oye, mira
00:37:11
el
00:37:13
como se dice
00:37:15
cuando llegue
00:37:16
un end of file exception
00:37:19
recoge esta excepción y en vez de
00:37:20
explotar, simplemente ha acabado
00:37:23
la cosa
00:37:24
como el available, por ejemplo
00:37:26
return the number of bytes
00:37:45
that can be read without blocking
00:37:48
vamos a ver esto
00:37:50
vamos a verlo aquí
00:37:52
y vamos a verlo allí
00:38:15
vamos, pem
00:38:17
al principio me dice cero
00:38:19
y aquí me dice cero
00:38:25
entonces tampoco me sirve mucho
00:38:26
en realidad aquí yo me esperaría más
00:38:28
pero como me contesta siempre cero
00:38:30
no
00:38:34
esto no me vale
00:38:35
porque si yo le pusiera un
00:38:37
mientras los available no son cero
00:38:39
pues no me entraría
00:38:42
entonces esto no me vale
00:38:43
vamos a ver si hay otros
00:38:45
métodos de hoy
00:38:47
que me puedan valer
00:38:48
no lo veo, si
00:38:51
es lo que he dicho antes, pero
00:39:17
él me ha preguntado, no hay un método
00:39:24
para no hacerlo con el try catch
00:39:26
entonces estamos viendo si hay un método
00:39:27
para no hacerlo en un package
00:39:29
aquí, si no me equivoco
00:39:31
lo hacía con available
00:39:34
esta es lectura
00:39:35
de objetos realizables
00:39:45
aquí estaba utilizando el available
00:39:46
pero lo hace no sobre el object
00:39:48
más sobre el otro
00:39:50
entonces, vamos a ver si funciona así
00:39:52
esto es un file input stream
00:39:57
file input
00:40:08
stream
00:40:12
fs
00:40:13
es igual a esta cosa
00:40:17
y aquí ponemos fs
00:40:19
y esto hace con
00:40:20
fs.available
00:40:23
vamos a ver si fs.available
00:40:25
me hace el juego
00:40:27
¡pem!
00:40:30
explota
00:40:31
veis que aquí si lee y aquí no
00:40:32
me ignora
00:40:39
Antes me hace la pregunta
00:40:41
Y luego me ignora
00:40:43
Alexander, hola
00:40:44
Estoy contestando a tu pregunta
00:40:47
Pero vosotros lo sabéis
00:40:49
Jugáis, seguro
00:40:52
En vez de utilizarlo
00:40:54
Sobre el output stream
00:40:57
Lo he utilizado sobre el file input stream
00:40:59
Que es luego el que usa
00:41:01
Entonces si te fijas, este sí me dice
00:41:02
Que al principio hay 142
00:41:05
Y cero
00:41:06
Entonces tengo dos formas de hacerlo
00:41:08
o hago un while
00:41:11
esto.available
00:41:12
no sea cero, o sea, mientras que hay
00:41:14
todavía datos, sigue leyendo
00:41:17
o la segunda opción
00:41:19
es halo, halo, halo
00:41:21
y cuando explotas con un endofile
00:41:23
exception, pues me recupero
00:41:25
y digo, has acabado el fichero y sigue adelante
00:41:27
una de las dos, lo puedes hacer tú
00:41:28
lo lees una vez
00:41:37
cuantos objetos hay, explotas y luego
00:41:38
pero, si
00:41:41
esto es otra cuestión
00:41:43
que, pero
00:41:49
vamos después
00:41:51
es una buena observación
00:41:52
es decir, vale, mas si yo necesito saber
00:41:56
cuantos objetos hay
00:41:58
pues lo que puedo hacer es escribirlo
00:42:00
hacer que
00:42:02
el primer elemento que guardo
00:42:03
no sean objetos
00:42:07
sino sea cuantos objetos voy a guardar
00:42:08
de esta forma cuando voy a leer
00:42:11
la primera cosa que leo
00:42:13
no es un objeto, mas es cuantos objetos
00:42:14
están guardados en este fichero
00:42:17
y luego sé que tengo que leer 14 objetos
00:42:18
son 20 objetos
00:42:21
make sense, lo hacemos después por otra
00:42:22
razón
00:42:25
vale, entonces, esto hemos dicho que
00:42:25
funciona, pues entonces mejoro
00:42:29
un poquito esta cosa de aquí y hago
00:42:31
un vile
00:42:33
fees.available
00:42:34
available
00:42:37
available
00:42:39
no es 0
00:42:41
¿qué hago?
00:42:43
alumnos.add
00:42:46
de
00:42:51
esto
00:42:52
he borrado también el oís
00:42:54
object
00:43:06
output
00:43:12
stream oís
00:43:14
es igual a new object
00:43:16
output
00:43:19
stream
00:43:20
stream
00:43:22
de fiss
00:43:23
input
00:43:25
input
00:43:29
Entonces, ahora tenemos este mecanismo aquí
00:43:31
Que lo que hace es guardar método
00:43:39
Cuando he hecho todo este while
00:43:40
Si hizo alumnos
00:43:42
Vamos a ver
00:43:45
Lanzo esto
00:43:48
Y veis que me ha guardado los alumnos
00:43:49
¿Vale?
00:43:53
O sea que
00:43:55
Técnicamente no ha explotado
00:43:56
Está bien
00:43:58
Ha cargado todos los alumnos
00:43:59
Con sus cosas, etc, etc
00:44:01
Entonces, ahora lo que puedo hacer, después de haber hecho el cargar datos, es cargar el primer elemento, este de aquí, entonces, ¿qué hago? Me lo guardo, lo hago aquí.
00:44:03
Cuando hagas el cargar dato
00:44:26
Cuando acarga el primer
00:44:28
Elemento
00:44:31
Bolean
00:44:33
Primero
00:44:37
Es igual a uno
00:44:39
Igual a true
00:44:41
Primero
00:44:43
Es igual a false
00:44:47
Y lo que hace es
00:44:49
Si
00:44:52
Primero
00:44:54
Hago algo
00:44:58
Si no
00:45:01
hago esta cosa aquí
00:45:02
si es la primera vez, si es el primero
00:45:04
lo que hago es leerlo
00:45:11
alumno a es igual a esta cosa aquí
00:45:14
luego lo puedo añadir
00:45:21
alumnos.add a
00:45:25
y lo que quiero hacer es escribir los datos de este alumno
00:45:30
en los campos
00:45:35
que no me acuerdo como he llamado
00:45:37
no los he llamado, por lo tanto vamos a llamarlos
00:45:38
Este de aquí lo llamamos txt1, esto lo llamamos txtn de nombre, este de aquí lo llamamos id y este de aquí lo llamamos a, txta, vuelvo aquí, está abajo.
00:45:41
Entonces, lo que hace es guardar en txt.id.setText de a.id, txt.nombre.setText de a.nombre,
00:46:06
txt
00:46:45
de apellido
00:46:48
punto set text
00:46:50
de a punto
00:46:52
apellido
00:46:54
entonces ahora cuando lo lanzo
00:46:56
explota
00:47:00
null pointer exception
00:47:01
ah porque lo he hecho
00:47:07
el que
00:47:11
si son azules si
00:47:23
event dispatch
00:47:26
event queue
00:47:32
access control
00:47:33
donde esta
00:47:35
donde está app.showData
00:47:36
app.showData
00:47:39
inicialice cargar datos, el error es
00:47:40
aquí
00:47:43
app.id
00:47:43
se me enfada, ¿por qué?
00:47:45
tatara tatara
00:48:08
olé, ¿por qué se me enfada?
00:48:09
vamos a intentar
00:48:49
entender por qué se
00:48:50
enfada
00:48:52
¿queréis ir a la?
00:48:53
vale, el error que daba antes
00:48:57
es porque yo llamaba el
00:48:58
método este de aquí
00:49:00
de cargar datos
00:49:02
lo llamaba en vez que aquí
00:49:04
abajo, lo llamaba aquí
00:49:06
y como se llama aquí
00:49:08
y todavía no ha inicializado
00:49:10
los text fields
00:49:12
pues esto era null
00:49:14
entonces intentaba acceder a ese null y decía
00:49:16
que no había nada, entonces he movido
00:49:18
la llamada del cargar datos aquí
00:49:20
abajo y ahora cuando lo lanzo
00:49:22
funciona, me pone
00:49:24
el primero, ahora tengo que hacer los
00:49:28
botones, pero esto ya no es
00:49:30
ficheros, por ahora está cargando
00:49:32
todo, está cargando todos los
00:49:37
objetos, están ya cargadas aquí
00:49:40
y está cargando el primer
00:49:42
objeto en el visor
00:49:46
si queréis
00:49:47
por completar, hagamos los botones
00:49:55
cuando le doy al botón derecho
00:49:58
lo que tiene que hacer
00:50:01
es pillar el siguiente
00:50:03
para eso tendré que tener
00:50:06
son ordenados
00:50:09
pues
00:50:13
pongo por algún lado el id actual
00:50:13
vale
00:50:16
int id actual
00:50:16
es igual a 0
00:50:20
entonces al hacer
00:50:22
clic allí
00:50:28
es este no
00:50:29
es este
00:50:31
pues lo que hace
00:50:33
es idea actual
00:50:36
más más
00:50:37
y ahora tiene que buscar
00:50:39
dentro del set
00:50:44
el ordenador
00:50:46
el alumno
00:50:47
que tenga esta idea
00:50:51
y pillarlo
00:50:52
¿si?
00:50:53
una forma de hacerlo
00:50:56
teniendo en cuenta que si esto se pasa
00:50:58
debería volver a cero
00:51:00
entonces me pregunto que si
00:51:02
idea actual
00:51:04
es igual
00:51:07
a alumnos
00:51:08
.sice
00:51:10
pues entonces id actual
00:51:14
es igual a cero
00:51:20
¿sí?
00:51:22
y ahora lo que voy a hacer es
00:51:26
voy a hacer con un método o algo por el estilo
00:51:29
de actualizar
00:51:31
id actual
00:51:32
¿qué hace esto?
00:51:36
esto si lo pongo fuera me funciona
00:51:41
vamos a ponerlo aquí al azar
00:51:55
esto me lo llama
00:52:01
entonces si llama
00:52:02
este método de aquí
00:52:05
y actualizar lo que tiene que hacer
00:52:06
es sostancialmente
00:52:10
buscar el alumno correcto
00:52:12
y una vez que ha pillado
00:52:14
el alumno correcto
00:52:16
pues cambiar los datos
00:52:18
en la
00:52:20
en la
00:52:21
en los tres campos, vale
00:52:23
entonces
00:52:25
hacemos con un iterador
00:52:27
si esto fuera en vez que un set
00:52:29
un hash set o cosa por el estilo podría
00:52:33
o un hash map o algo por el estilo podría utilizar
00:52:35
directamente el id para obtener el objeto
00:52:38
¿vale? pero como lo hemos hecho como
00:52:40
un set, pues lo que tengo que hacer es
00:52:42
recorrer el set
00:52:44
iterator it es igual
00:52:45
a new iterator
00:52:48
de alumno
00:52:50
de... no
00:52:52
no, no, no, esto está equivocando
00:52:54
de alumnos
00:52:56
punto get iterator
00:52:58
de iterator
00:53:00
este, y este es
00:53:01
un iterador de alumno
00:53:04
wille it.asNext
00:53:06
alumno a es igual
00:53:16
bueno, alumno a lo hago fuera
00:53:29
lo voy a hacer nula aquí
00:53:32
a es igual a it.next
00:53:38
si a.id es igual a id actual
00:53:42
Entonces lo que hago es txtid.setText a a.id txt.dn.setText de a.nombre txtApellido.setText.
00:53:57
de a.apellido
00:54:37
y luego un break
00:54:42
para que salga ya del
00:54:45
while y se acabó
00:54:49
esto debería ser
00:54:50
más o menos, también
00:54:52
podría
00:54:54
hacer que esto
00:54:55
donde está
00:54:59
aquí, al fin y al cabo
00:55:03
esta cosa de aquí
00:55:05
en vez de hacer if primero
00:55:06
puede hacer que si primero me haga un actualizar texto de cero
00:55:12
todo esto esto lo tiene que hacer este de aquí podría hacer un actualizar de cero debería
00:55:21
funcionar y si no hace este otro cosas vale vamos a ver si funciona carga el primero lo
00:55:42
carga, se pincha aquí el 1, el 2
00:55:54
0, 1, 2, 0, 1, 2, 0, 1, 2
00:55:56
0, 1, 2
00:55:58
entonces ahora
00:55:58
tengo que hacer el otro botón
00:56:02
el otro botón funciona
00:56:03
con id actual
00:56:08
menos menos
00:56:10
si
00:56:11
id actual
00:56:14
es
00:56:16
menor que 0
00:56:18
id actual
00:56:20
es igual a
00:56:24
Alumnos.ic-1
00:56:26
Y después, actualizar
00:56:30
Y de actual
00:56:39
Entonces, ahora lanzo
00:56:41
Con esto voy por un lado, con esto voy por el otro
00:56:48
Y funcionan ya los dos
00:56:50
¿Sí?
00:56:53
Por lo tanto, con esto he acabado mi aplicación más o menos
00:56:56
¿Vale? Como base ya la tenemos
00:57:01
Ahora, errores que puedan surgir aquí y vamos a ver un poquito qué pasa, ¿vale?
00:57:03
Nosotros tenemos dos aplicaciones.
00:57:09
¿Qué pasa si yo ahora aquí lanzo otra vez la aplicación esta para cargar y escribo nuevos alumnos?
00:57:12
Y cierro.
00:57:26
Que ahora cuando cargo aquí, los alumnos de antes han desaparecido.
00:57:28
¿Sí?
00:57:35
queremos nosotros esto
00:57:36
no
00:57:40
entonces lo que queremos hacer nosotros
00:57:41
es que al guardar
00:57:44
nuevos alumnos
00:57:46
se añadan
00:57:48
detrás
00:57:50
de los viejos
00:57:51
vamos a probarlo
00:57:53
si esto funciona
00:57:56
spoiler no
00:57:57
entonces aquí
00:57:59
cuando nosotros creamos el
00:58:02
file output stream
00:58:04
que es el que debería escribir, probamos a ponerle true, ¿vale?
00:58:06
Entonces, fijaos que ahora el fichero es este de aquí, con dentro QEW,
00:58:11
lanzo esta cosa aquí, pongo dentro el señor A y el señor B, cierro,
00:58:20
Y si ahora voy a mirar, dentro aquí está Q, está W, está A y está B.
00:58:33
El problema es esto.
00:58:43
Si me fijo, se parece mucho a esto.
00:58:51
¿Veis?
00:58:58
Esta de aquí es la cabecera.
00:58:59
Os lo decía antes.
00:59:02
Él ha escrito un fichero, ha puesto la cabecera
00:59:04
Y luego ha empezado a poner los objetos
00:59:07
Cuando he cerrado y abierto otra vez
00:59:11
La segunda vez, cuando ha empezado a escribir
00:59:13
Pues ha vuelto a poner la cabecera
00:59:17
Y luego los objetos
00:59:20
Entonces, cuando ahora lo voy a leer
00:59:22
Este de aquí empezará aquí, encontrará la cabecera, perfecto
00:59:25
Luego se espera de encontrar los objetos
00:59:28
Leerá el primero, Q
00:59:30
Le verá el segundo, W
00:59:31
Y ahora aquí se espera el tercero
00:59:33
Sin embargo, encuentra otra vez la cabecera.
00:59:36
Y entonces explota.
00:59:39
¿Qué copias de un fichero a otro?
00:59:48
No entiendo.
00:59:59
Vamos por orden.
01:00:01
Este es el problema, ¿vale?
01:00:03
Me dice, oye, mira, que hay algo aquí
01:00:04
que no sé qué es y que no lo entiendo, ¿vale?
01:00:06
Stream corrupted exception.
01:00:10
¿Sí?
01:00:13
Repito, la causa de esto
01:00:14
es que he escrito en un fichero un objeto,
01:00:16
luego he cerrado todo
01:00:18
y he vuelto a escribir desde cero.
01:00:20
Porque fijaos que yo he escrito ya dos veces en el fichero
01:00:22
Porque cuando yo hago esto
01:00:26
WriteObject
01:00:29
Esto lo está haciendo dos veces
01:00:32
Justo
01:00:34
Aquí no he hecho flash, pero
01:00:37
O sea, que he escrito dos veces
01:00:38
Si yo abro el flujo de información
01:00:41
Escribo un objeto, luego otro, luego otro, luego otro
01:00:44
Funciona perfectamente
01:00:48
El problema es cuando cierro este flujo de información
01:00:49
y lo vuelvo a abrir otra vez la primera vez que escribe un object output stream escribe
01:00:52
una cabecera vale entonces si yo he apagado encendido otra vez y vuelvo a escribir en el
01:00:59
mismo en el mismo fichero pues tengo este problema una opción es esta vale es vale
01:01:06
entonces cuando yo enciendo pillo todos los leo el fichero me cargo como hace la otra todo el
01:01:30
fichero en la nueva cosa así a este punto añado los objetos que quiero y vuelvo a reescribir no
01:01:39
con la opción true más entero todo el fichero otra vez es una opción vale mientras que los
01:01:45
ficheros sean pequeños porque si yo tengo ya 7 millones de alumnos porque no es un alumno son
01:01:53
productos que se yo y ahora cada vez que tengo añadir un producto me tengo que cargar en memoria
01:02:01
7 millones de...
01:02:06
Añadir uno y reescribir 7 millones
01:02:07
pues puede ser un problema.
01:02:09
Copias lo que está escrito allí.
01:02:18
Hacerlo de uno en uno.
01:02:29
No ocupas la memoria RAM, pero ocupas tiempo.
01:02:31
Tienes que hacer... Cada vez que añades uno
01:02:34
tienes que hacer 7 millones de copias
01:02:35
de uno en uno, pero 7 millones de copias.
01:02:37
¿Sí? Entonces
01:02:40
la idea es
01:02:41
si yo pudiera
01:02:43
directamente escribir
01:02:46
en el
01:02:48
fichero
01:02:49
sería mejor si entonces hay una forma de hacer esto sí vale esto de aquí deriva desde ahora no
01:02:51
me acuerdo dónde está y te estará en el este de aquí probablemente file a punto y coma
01:03:04
File
01:03:30
Output
01:03:33
Stream
01:03:35
F
01:03:36
O
01:03:38
S
01:03:39
Es igual
01:03:40
Hay otra cosa aquí
01:03:41
Aquí pongo FOSS
01:03:42
Aquí está
01:03:43
Si no me equivoco
01:03:46
Vrite
01:03:47
No está aquí
01:03:49
API
01:03:50
A ver dónde está
01:03:56
Java
01:03:58
API 22
01:04:01
Esto es
01:04:03
hay un metodito
01:04:05
que usa
01:04:12
object output stream
01:04:13
que es el responsable de escribir
01:04:15
el header
01:04:18
y se llama como
01:04:20
write stream header
01:04:22
este señor de aquí
01:04:24
es el metodito que
01:04:28
al principio cuando el crea
01:04:30
dice vale voy a escribir
01:04:32
la primera escritura
01:04:34
se llama este writeStreamHeader
01:04:35
al llamar este
01:04:38
writeStreamHeader lo que hace
01:04:39
es copiar
01:04:42
la cabecera
01:04:43
y luego después a partir de ahí no se llama
01:04:45
entonces se ponen todos los métodos
01:04:47
cuando hago el writeObject o lo que sea
01:04:49
¿vale? entonces la idea
01:04:51
aquí es que este
01:04:53
señor no tiene
01:04:55
que hacer siempre su trabajo
01:04:57
gente duerme aquí, hay señores
01:04:59
entonces lo que vamos
01:05:07
hacer es lo siguiente me creo una versión parecida pero no igual de mi object output stream vale es
01:05:11
decir que aquí yo me creo una nuevo una nueva clase que se llama object output stream 2 por
01:05:21
ejemplo o mi objeto de sim o el concepto hay que hacer esto no hay que usar un rm con base
01:05:34
de datos vale pero si lo quieres hacer así una opción es la que ha dicho tú copio todo
01:05:49
desde principio otra opción es crear varios ficheros cada vez que eres un fichero nuevo
01:05:55
con un numerito serial entonces cuando luego cargarás en vez de cargar a uno solo te lees
01:06:01
todos y te lo vas a hacer otra opción es ésta entonces en este cosa aquí yo le digo que extens
01:06:06
object output stream a nosotros porque nos interesa esto no porque sea elegante o la
01:06:16
cosa más mejor del mundo porque usa en un cierto sentido cosas que nosotros
01:06:24
hemos visto vale entonces por qué no default constructor que anotando leo exception vale
01:06:31
entonces este de aquí habrá que crear una cosa este estilo vale no lo toco más de lo que tiene
01:06:44
que ser lo mínimo vale no quiero modificar nada lo único que quiero modificar es el bright stream
01:06:51
Header, ¿vale? Esta cosa aquí
01:06:59
¿Dónde está?
01:07:01
Aquí, este
01:07:05
WriteStreamHeader
01:07:06
Entonces, ProtectedVoid
01:07:07
Lo que hago yo es
01:07:10
Protected
01:07:15
Void
01:07:17
Esta cosa aquí
01:07:19
Esto está sobrescribiendo
01:07:20
El fichero
01:07:24
Está haciendo un overwriting
01:07:25
¿Vale?
01:07:27
Que si yo llamaré un objeto de ObjectStream2
01:07:29
Pues el
01:07:32
método writeStreamMeter se llamará
01:07:34
este de aquí, ¿vale?
01:07:36
y entonces aquí la idea es sencilla
01:07:37
es decir, la primera vez que yo
01:07:40
uso esto, si lo uso
01:07:42
o si en el fichero
01:07:43
en el que voy a escribir
01:07:45
ya he escrito algo
01:07:47
si el fichero ya
01:07:51
existe en un cierto sentido
01:07:54
pues esto no lo tendré que hacer
01:07:55
y si no, sí
01:07:57
tengo que encontrar un modo
01:07:59
para que
01:08:01
Esta cosa de aquí
01:08:02
Si
01:08:05
Si lo tiene que hacer
01:08:07
Haga super.brit
01:08:09
Stream header
01:08:12
Esto se enfada porque
01:08:14
Lanza
01:08:17
Exception
01:08:18
Y si en vez, ya lo he hecho
01:08:21
Ya no lo tengo que volver a hacer
01:08:25
Ya hago algo por el estilo
01:08:27
Pues entonces, no lo tengo que hacer
01:08:28
Tengo que hacer nada
01:08:31
Ideas
01:08:32
¿De qué fichero?
01:08:34
O sea, aquí tengo dos opciones
01:08:58
Yo necesito saber si el fichero que estoy manejando
01:09:00
Tiene algo o no
01:09:05
¿Vale?
01:09:06
Entonces, una opción es hacerlo desde aquí
01:09:07
Desde la aplicación
01:09:10
Y es decir, voy a mirar el fichero
01:09:11
Si en el fichero hay algo
01:09:13
No hay nada, perdón, es un fichero nuevo
01:09:15
Uso el Object to Stream normal y corriente
01:09:17
Y si no, uso la versión 2
01:09:20
¿Puede tener?
01:09:23
Pero la cabecera es siempre esa
01:09:27
Y de todas formas
01:09:32
Si tú una vez ya la has usado
01:09:34
Ya habrás hecho esta cosa
01:09:36
Y ahora no tienes que hacer, tienes solo que añadir detrás
01:09:38
¿Vale?
01:09:40
Pero, la otra opción
01:09:41
Es en vez que mi object stream 2
01:09:44
En vez de recibir
01:09:47
Solo
01:09:50
La conexión
01:09:52
¿Vale? Reciba también
01:09:54
Algo más
01:09:56
O sea, que le pase, por ejemplo, el fichero o cosa por el estilo
01:09:57
Otra opción también es que yo esto lo recibo
01:10:02
¿Vale?
01:10:05
Entonces, a ver si con esto puedo hacer algo
01:10:07
Por ejemplo
01:10:10
OutputStreamOut
01:10:11
Y hacer que cuando el constructor
01:10:17
Hago que this.out
01:10:24
Es igual a out
01:10:27
O sea que ahora aquí puedo usar este out
01:10:28
Ahora el
01:10:34
Me sirve poco o nada
01:10:36
Necesito un int
01:10:39
Un int
01:10:40
Out punto
01:10:41
Vamos a ver que puedo sacar de aquí
01:10:47
Si desde aquí podía sacar el fichero
01:10:50
Al que está conectado
01:10:58
Pues no necesitaba que me pasara un fichero
01:11:00
¿Vale?
01:11:02
Pero bueno, como no puedo
01:11:03
pues entonces aquí por ejemplo
01:11:04
file f
01:11:08
esto ya no me sirve
01:11:10
prefiero poner un file f
01:11:14
y hacer que this.f es igual a f
01:11:20
ahora esto quiere decir
01:11:24
que cuando creo un autostream
01:11:26
de tipo 2, no lo puedo
01:11:28
construir así directamente
01:11:30
tendré que pasar también
01:11:31
el fichero
01:11:33
esto
01:11:34
un poco veucho
01:11:36
¿vale? porque estoy cambiando
01:11:39
como se crea un object stream
01:11:41
autostream 2 ¿vale? pero a ver
01:11:42
más o menos
01:11:45
entonces ahora
01:11:46
lo que haría aquí es vale
01:11:49
tengo el fichero entonces me
01:11:51
pregunto si el fichero por ejemplo
01:11:53
existe entonces
01:11:54
perdón si el fichero no existe
01:11:57
entonces llamo esta cosa
01:12:01
si en vez del fichero existe pues
01:12:02
no lo hago, o mejor
01:12:04
porque podría ser que el fichero sea
01:12:07
creado antes, vale
01:12:09
vamos a ver si hay algo dentro de este
01:12:10
fichero, entonces hago
01:12:13
un file input
01:12:15
stream f
01:12:17
fs, es igual a
01:12:19
new file input
01:12:21
stream f
01:12:23
y hemos visto
01:12:25
antes que podía preguntarme de si
01:12:30
fs.available
01:12:32
mayor que 0
01:12:35
si hay algo
01:12:38
entonces
01:12:41
o mejor, hagámoslo así
01:12:42
si no hay nada
01:12:45
allí, vale
01:12:47
si yo voy a mirar este de aquí
01:12:58
digo, intenta leerlo
01:13:01
y si al intentar leerlo
01:13:02
no hay nada
01:13:05
o sea, porque
01:13:06
es mayor que cero, no es mayor que cero
01:13:08
entonces quiere decir que hasta
01:13:11
si has sido creado, ahora mismo está vacío
01:13:13
no hay la cabecera, por lo tanto
01:13:15
escribo la cabecera
01:13:16
Si no, este programa no hace nada
01:13:18
Este método no hace nada
01:13:21
¿Sí?
01:13:22
Entonces
01:13:26
Vamos a ver
01:13:26
Esto podría explotar si esto no existe
01:13:28
Vamos a verlo
01:13:34
Entonces, lanzo
01:13:35
Esto lo lanzo de aquí
01:13:42
He creado con un impuesto en 2
01:13:43
Lanzo
01:13:46
Escribo a
01:13:47
Escribo b, b, b
01:13:50
Y cierro
01:13:53
explota porque explota null pointer excepción vamos a ver dónde está en el puente de excepción
01:13:56
y en it right streaming en esta cosa nueva que hemos hecho nosotros dice que esta cosa de aquí
01:14:04
me da un nulo porque probablemente efe no existe vale entonces podremos preguntarnos aquí si fish
01:14:17
is es null, o, a ver si esto funciona, o, o end, vamos a ver si esto funciona, entonces, a, add, b, b, b, add, cierro, sigue explotando,
01:14:26
siempre en un pointer excepción pero no debería vamos a verlo es aquí siempre
01:14:55
mismo punto pero porque el pointer excepción tiene que ser en otro lado
01:15:05
super punto superado pauso vale entonces hemos hecho algunos cambios hemos
01:15:15
cambiado que sustancialmente hemos creado un fichero nuevo en el que se
01:15:34
guardan cuántos alumnos se han creado en total de esta forma cuando la aplicación de creación
01:15:40
arranca lee cuántos cuantos alumnos se han creado hasta ahora y lo guarda en alumnos
01:15:48
creatividad así que los nuevos alumnos se crean con la id correcta vale y cada vez que se cierra
01:15:58
pues guarda este número
01:16:04
hasta donde ha llegado
01:16:05
y entonces con esto ya
01:16:07
debería más o menos funcionar
01:16:09
ahí es la hora
01:16:12
si, no, hacedlo vosotros
01:16:12
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 13
- Fecha:
- 1 de abril de 2025 - 12:48
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 1h′ 16′ 19″
- Relación de aspecto:
- 16:10 El estándar usado por los portátiles de 15,4" y algunos otros, es ancho como el 16:9.
- Resolución:
- 1152x720 píxeles
- Tamaño:
- 304.53 MBytes