20250401 Permanencia objectos 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:
Voy a grabar esta clase, por lo tanto, si habláis, me dais consentimiento para que grabe esta voz.
00:00:00
Entonces, ayer empezamos, bueno, antes de ayer, hace unos días, empezamos con la persistencia de datos
00:00:06
y vimos la posibilidad de escribir en ficheros, ¿vale?
00:00:13
Ayer lo que empezamos es cómo puedo guardar un objeto, ¿vale?
00:00:16
Hasta antes, nosotros simplemente utilizamos o byte o carácter,
00:00:22
si trabajamos con texto, para grabar en un fichero o leer desde un fichero, línea por línea o carácter por carácter, byte por byte,
00:00:27
esto depende de las necesidades y de las exigencias que tengo en un determinado momento.
00:00:35
Sin embargo, sería útil, puesto que nosotros programamos orientado a objetos, guardar objetos.
00:00:41
Entonces, ayer hicimos un primer intento de esto, que es simplemente guardar los objetos como texto.
00:00:46
entonces nosotros en alumnos nos inventamos un metodito
00:00:55
que lo que hacía era representar los valores de este objeto
00:01:00
por ejemplo separados por un carácter especial
00:01:04
en nuestro caso eran dos puntos
00:01:08
entonces cuando yo quería guardar el objeto
00:01:10
lo que hacía es no guardar el objeto
00:01:13
sino guardar los valores de los atributos de este objeto
00:01:15
este es un método muy sencillo
00:01:19
muy poco práctico y muy poco eficiente
00:01:22
que se puede utilizar cuando los objetos que utilizo
00:01:26
son muy muy sencillos, como era el caso de nuestro alumno
00:01:30
que solo tenía valores, digamos, básicos
00:01:33
es verdad que string es un objeto, pero es verdad también que nosotros
00:01:38
lo hemos siempre casi utilizado como un tipo primitivo
00:01:42
el problema de este método es que se complica mucho a la hora
00:01:45
de utilizar objetos que contienen otros objetos dentro, ¿vale?
00:01:50
Porque cuando estamos trabajando con las referencias, ya esto se complica.
00:01:54
Si imaginamos el alumno que tenga asignado un profesor y luego tenga varios alumnos
00:01:58
que tiene que apuntar al mismo profesor, pues esta cosa hecha con el método de guardar los objetos
00:02:05
directamente como cadenas de caracteres al fin y al cabo, se puede complicar
00:02:12
Porque cuando recrearé ese profesor, cuando creo ese objeto profesor, tengo que acordarme que no lo tengo que recrear por cada alumno, sino lo tengo que crear una vez sola y cada alumno tendrá que apuntar al mismo objeto recreado, ¿vale?
00:02:17
Entonces, ¿se puede hacer? Sí se puede hacer, pero se complica mucho la gestión. Tengo que conocer muy bien dónde están los puntos críticos de mi aplicación para que cuando, por ejemplo, recargue mi aplicación, en este ejemplo que estamos haciendo, tendría más sentido crear antes todos los profesores y una vez que he creado todos los profesores empezar a crear los alumnos porque así tengo ya los profesores creados y si hay tres alumnos que apuntan al mismo profesor ya tengo el objeto.
00:02:31
le puedo decir, mira, oye, directamente este es el objeto al que te refieres, ¿sí?
00:02:59
Esto porque, ¿sabéis qué? Si cada alumno tuviera su propio profesor y modificara algo del profesor
00:03:05
o se modificara algo de ese profesor, pues solo se reflejaría en ese alumno, ¿vale?
00:03:12
Porque hay instancias distintas. Pero si el profesor es único y de repente cambia el horario de atención,
00:03:17
qué sé yo, de tutoría, pues se debería reflejar en todos sus alumnos.
00:03:23
Entonces debería ser una instancia única, compartida como referencia por todos los alumnos. Estas son cosas de programación básica.
00:03:27
Si en vez es como teníamos nosotros, que sostancialmente teníamos datos que son propios del alumno y no se comparten con ningún otro alumno, el nombre del alumno no lo compartiré entre varios alumnos,
00:03:37
Pues entonces sí que se puede hacer como hemos hecho ayer. Ayer hicimos un botón para guardar. Este botón de aquí, que sostancialmente tenía, cuando lo pinchaba, lo que hacía era crearse un printwriter y recorría a los alumnos.
00:03:50
y por cada alumno
00:04:22
encontrado en todos los alumnos
00:04:24
lo que hacía era escribirlo
00:04:25
en el fichero con el programita
00:04:27
uno por línea, con el método
00:04:29
y sostancialmente lo que
00:04:32
hacía era escribir
00:04:34
un pequeño
00:04:35
fichero
00:04:37
que lo tenemos por aquí
00:04:38
lo repaso porque ayer no grabamos
00:04:41
¿cuál era?
00:04:44
¿dónde está?
00:04:55
permanencia
00:04:55
esta aquí
00:04:56
donde estaba
00:05:00
¿Qué proyecto es esto?
00:05:03
¿Proc2?
00:05:06
No sé
00:05:07
No me acuerdo cuál es el proyecto
00:05:08
¿No se acuerda cuál es el proyecto?
00:05:10
¿Cómo mira el proyecto de aquí?
00:05:25
Bueno, da igual
00:05:34
Simplemente sale un
00:05:34
Un fichero con varias
00:05:36
Líneas, en cada línea pone
00:05:39
Lo que tiene que poner
00:05:41
¿Vale? Ahora no lo encuentro
00:05:44
Otras cosas
00:05:45
Que hemos hecho es
00:05:48
Que al iniciarse
00:05:50
El
00:05:51
programa, ¿vale?
00:05:52
cuando se llama el init
00:05:55
¿vale? que está por aquí
00:05:57
initialize, ¿vale?
00:05:59
pues se llamaba este
00:06:01
método de aquí, este método de aquí
00:06:03
carga los datos y sostancialmente
00:06:05
lo que va a ver es
00:06:07
va a buscar si
00:06:09
existe el fichero
00:06:10
con dentro los datos
00:06:13
de los alumnos
00:06:17
si existe este fichero lo va cargando
00:06:19
Y, sustancialmente, va reconstruyendo estos alumnos. De esta forma, cuando apago e enciendo otra vez este programa, pues me carga los alumnos que ya existían, ¿vale? Y, ¿vale? Esto funcionaba, repito, porque los alumnos eran bastante sencillos.
00:06:21
Ahora, ¿qué pasa si quiero hacer las cosas un poquito mejor y si tengo estas cosas de problemas de objetos referenciados y cosas por el estilo?
00:06:38
Tengo otra forma de guardar los ficheros que es utilizando, digamos, mecanismos que me proporciona la propia Java Virtual Machine
00:06:50
¿Vale? Entonces, en vez de transformar yo un objeto en una cadena de textos y guardarlo, le digo directamente a quien sea, ¿vale? Ahora lo veremos, de guardarme este objeto. Le paso un objeto y digo, guárdamelo.
00:07:01
Él claramente a este punto el objeto no será un objeto inteligible por el ser humano, si yo abro ese fichero no me encontraré allí algo que puedo entender, ¿vale? Será una representación en formato de byte como le da la gana a la Java Virtual Machine del objeto que yo tengo, ¿vale?
00:07:16
La ventaja que tengo con esto es que hasta un cierto nivel de complejidad sí que me mantiene las relaciones internas entre los varios objetos. Es decir, que cuando guardaré el profesor, pues el alumno con el profesor me guardará el alumno y me guardará también el profesor.
00:07:38
y que si luego lo recargaré, pues los varios alumnos tendrán el mismo profesor, porque el mismo en automático como que seta un identificador, un modo de entender que este objeto no son tres copias distintas,
00:07:55
si no tienen el mismo identificador, el mismo hashcode, lo que sea,
00:08:12
de esta forma, cuando lo va recargando y le dice,
00:08:19
oye, mira, este alumno tiene este profesor,
00:08:22
y él se da cuenta que este profesor ya ha salido creado,
00:08:24
ya tiene existencia en mi heap,
00:08:27
pues a ese punto dice, ah, vale, entonces no lo vuelvo a crear,
00:08:32
pero le asigno el mismo.
00:08:35
Y haremos una prueba nosotros ahora para ver que efectivamente funciona así.
00:08:37
¿Vale?
00:08:41
si el dato no es string
00:08:42
habrá que convertir la string en matización
00:08:47
de una matización, hemos dicho que ocurre con referencia
00:08:49
a objetos, estos son los problemas si intentamos
00:08:51
guardarlo como cosa, ¿vale?
00:08:53
entonces, las opciones
00:08:55
nosotros lo que hemos
00:08:58
bueno, para obviar
00:08:59
al problema que teníamos ayer
00:09:01
¿vale? existen
00:09:03
varias formas, la primera forma es la que veremos
00:09:05
ahora, que se llama la serialización
00:09:07
¿vale? utilizar objetos
00:09:09
serializable y hacer que ellos lo guarden
00:09:11
¿Vale? Veremos ahora.
00:09:13
Otras opciones son hacer una serialización textual.
00:09:15
¿Habéis visto XML?
00:09:19
Habéis visto que XML es como un lenguaje de marcas, ¿vale?
00:09:22
Donde yo me puedo inventar las etiquetas, ¿vale?
00:09:27
Entonces, si yo lo que puedo hacer es, en vez de hacer una definición muy sencilla de este tipo,
00:09:30
de una representación muy sencilla de este tipo de mi objeto,
00:09:38
pues yo podría crearme, por ejemplo, un lenguaje XML que represente a mi alumno.
00:09:42
Y en este lenguaje XML podría representar también al profesor.
00:09:48
Y entonces el profesor dentro podría tener una referencia, un atributo,
00:09:53
que sea un identificador, que sea único,
00:09:57
y entonces cuando yo construyo mi XML del alumno y le asigno a un profesor,
00:10:00
a este profesor le pondré un ID,
00:10:06
y entonces si dos de estos elementos XML tienen el mismo ID,
00:10:08
cuando lo reconstruyo tendré que
00:10:12
construir el mismo objeto para los dos
00:10:14
¿vale? o sea, podría, sabéis que
00:10:16
lenguaje de marcas al fin y al cabo es
00:10:18
texto plano, como este
00:10:19
aquí, al que se le añade
00:10:22
información, meta información
00:10:24
se le añade las etiquetas para
00:10:26
decirle algo más, cuando era html
00:10:27
todos los comandos, todas las
00:10:30
etiquetas que utilizaban
00:10:32
era para dar semántica
00:10:34
a la web o para dar formato a la web
00:10:36
cuando uso xml
00:10:38
sustancialmente no estoy hablando de una página web,
00:10:40
más estoy hablando de un cualquier contexto.
00:10:42
Me creo un lenguaje propio mío para representar lo que yo quiera representar.
00:10:44
Entonces, en este caso, sería representar mi contexto de mi aplicación
00:10:49
y decirle que un alumno tiene estas características,
00:10:55
luego tiene estos profesores, tiene estas asignaturas y cosas por el estilo.
00:10:58
Está claro que si yo lo hago de esta forma, tengo ventajas y desventajas.
00:11:01
La desventaja clara es que se vuelve complejo tanto guardar los objetos como recargarlos. Es una tarea relativamente compleja porque se requiere un algoritmo bastante complejo para que se dé cuenta de todas estas cosas de los identificadores, etc. Además de alguna forma de poder leer XML.
00:11:06
Hay clases en Java que permiten leerse un XML y transformarlo en un modelo
00:11:26
Para que luego yo pueda trabajar con un modelo como si fuera un objeto
00:11:33
Pero tengo que saber utilizar todas estas cosas
00:11:37
La ventaja que tengo con esto es que lo que se está guardando
00:11:41
Es un fichero de texto inteligible por el ser humano
00:11:45
Entonces yo lo estoy usando para mi aplicación
00:11:49
pero nadie me prohíbe que mañana con este mismo fichero XML lo pase a otro programa, a otro lector de XML, a otra cosa
00:11:52
y este pueda analizarlo y darme un esquema de lo que está escrito en ese fichero
00:12:02
que yo pueda entender sin tener mi aplicación y sin encender mi aplicación.
00:12:07
Así como si quiero modificarlo y quiero hacer otro programa que lo que hace es
00:12:12
Pilla un fichero de texto de alumnos y de profesores y lo convierte en este XML para que luego se pueda importar dentro de mi aplicación, lo puede hacer. Si en vez lo utilizo como objetos serializados, entonces no como XML, sino como cosas que no entiendo, hacer esta operación, o sea, crear un fichero que luego sea leíble por mi aplicación va a ser más complejo.
00:12:17
Sí. Y otra opción es utilizar cosas avanzadas, o sea, un object, R no me acuerdo qué es, mapping, relational mapping, no lo sé, y un sistema de base de datos, es decir, un sistema que pille los objetos, haga un mapeado de los objetos a tablas de base de datos,
00:12:43
Y luego se utiliza un sistema gestor de base de datos para guardar esas tablas, guardar esta información. Sustancialmente, guardar los objetos en una base de datos. Pero claro, hay que ver cómo hacerlo eso también. Si represento una tabla que cada campo de la tabla es un atributo de mi objeto, pero esto me funciona bien solo si los atributos son todos sencillos.
00:13:08
Si los atributos a su vez son objetos, pues la cosa se puede complicar. Siempre puedo hacer que sea una referencia, una clave a otra tabla donde se guardan los otros objetos. Entonces tendré la tabla alumnos y la tabla profesores y un campo de la tabla alumnos será una referencia, una clave a la tabla de profesores. Y así voy construyendo.
00:13:33
Pero claro, hay que hacer un mapeado entre mi estructura a nivel de objetos y mi estructura a nivel de base de datos, ¿sí? Vamos a ver qué son los objetos serializables, ¿vale?
00:13:56
en la idea pensarla así es la posibilidad de pillar un objeto y transformarlo y considerarlo
00:14:09
como una secuencia de bytes vale para que esto sea posible los objetos tienen que implementar
00:14:21
una clase que sea una interfaz que se llama la interfaz serializable vale y veremos que
00:14:31
la interfaz serializable no tiene métodos
00:14:37
¿vale? o sea que
00:14:39
directamente yo le pongo implementar serializable
00:14:40
y ya lo puedo serializar
00:14:43
¿vale? la idea es que
00:14:45
si un objeto no es serializable no puedo
00:14:47
hacerlo pasar por un stream
00:14:49
para un input stream o un output stream
00:14:51
si es serializable
00:14:53
la Javitor
00:14:54
Machine se encargará de alguna forma
00:14:57
de poderlo representar
00:14:59
en un formato que se pueda
00:15:01
enviar por un stream o
00:15:03
leer por un stream ¿vale?
00:15:05
Entonces, lo único que tenemos que hacer nosotros, sustancialmente, es serializar el objeto. Tiene que ser serializable el objeto y todos los objetos que son atributos de este objeto. Si yo tengo el objeto alumno y tengo el objeto profesor, el objeto alumno es serializable y el objeto profesor no, no puedo guardar el objeto alumno en un fichero con este método. También profesor tiene que ser serializable.
00:15:06
Existe una clase, que es la clase ObjectOutputStream y la clase ObjectInputStream
00:15:34
Que permiten leer o escribir un objeto directamente
00:15:42
Entonces, por ejemplo, aquí tengo un ObjectOutputStream
00:15:46
Que se conecta a un FileOutputStream de un fichero
00:15:51
Pues esto escribirá directamente a un fichero
00:15:55
Y tengo la clase WriteObject, o sea el método WriteObject de la clase ObjectOutputStream
00:15:57
Que me permite pillar un objeto serializable
00:16:03
y guardarlo en el fichero
00:16:05
¿vale? y después lo puedo cerrar
00:16:08
si quiero
00:16:10
para leerlo, está el object
00:16:10
input stream, que se conecta
00:16:13
igualmente con un file input stream
00:16:16
a un fichero
00:16:18
y tengo la
00:16:19
función read object
00:16:21
la función read object leerá un objeto
00:16:23
¿vale? entonces cuidado
00:16:26
porque si he guardado un alumno
00:16:27
cuando lo voy a leer, lo leeré como objeto
00:16:29
y tendré que hacer algún tipo
00:16:32
de casting
00:16:34
O mirar con InstanceOff si es una clase de alumno y luego hacerla, o intentar hacerla con un try-catch en el caso en que no sea de la clase que yo estaba intentando castear, lo que pasará es que saltará una PlasticShip.
00:16:34
Muy bien, entonces también se utiliza la serialización para transmitir objetos por una red
00:16:59
Lo mismo desde aquí se hace cuando en vez de escribir en ficheros se utilizan sockets
00:17:07
Que sustancialmente crean un punto de acceso entre varias aplicaciones que están en un ordenador distinto
00:17:13
Se comunican por red, más de esto en segundos de DAM en procesos y servicios
00:17:21
pues la cosa es la misma
00:17:26
en vez de escribir, siempre se usará
00:17:29
input stream y output stream
00:17:31
en vez de file output stream
00:17:33
se usará el output stream directamente
00:17:35
pero la idea es que yo tendré un objeto
00:17:37
lo transformaré en una secuencia
00:17:39
de bytes sustancialmente y lo paso
00:17:41
por un canal de comunicación, este canal
00:17:43
en vez de llegar al disco duro y escribirse
00:17:45
en el disco duro, llegará a otra aplicación
00:17:47
que estará allí con un input stream
00:17:49
y leerá la información
00:17:51
que se le envía
00:17:53
en ambos casos la Java Virtual Machine gestiona el formato de los datos de los objetos
00:17:54
y los objetos serializados
00:17:59
entonces es la Java Virtual Machine que me dice cómo se guardan
00:18:01
y cómo tengo que hacerlo
00:18:04
no tengo que hacerlo yo, como siempre
00:18:06
ventaja, es más sencillo porque me olvido de cómo se hace
00:18:08
le digo simplemente hazlo
00:18:13
desventaja, no tengo control directo sobre estas cosas
00:18:14
estoy cediendo el control a la Java Virtual Machine
00:18:17
entonces si luego hace algo que no me gusta
00:18:20
pues es un problema mío
00:18:23
hay inconvenientes de la serialización
00:18:29
la clase Object AutoStream
00:18:32
tiene algunos problemillas
00:18:34
se lía a veces
00:18:37
en particular en dos casos
00:18:39
el primer caso es cuando intentamos reutilizar
00:18:42
una misma referencia para serializar
00:18:45
objetos diferentes
00:18:48
tengo una referencia a un objeto
00:18:49
lo mando, lo serializo, lo escribo en fichero
00:18:52
ahora en esta referencia cambio el objeto y lo vuelvo a escribir
00:18:55
a veces puede dar problemas, o si tengo un objeto
00:18:58
lo escribo, ahora lo modifico usando setter y getter
00:19:02
y luego lo intento escribir otra vez, puede que funcione mal
00:19:06
esto deriva también de algunos problemas
00:19:11
de optimización que tiene, en el que por ejemplo
00:19:14
esto se ve mucho cuando se usan sockets
00:19:18
¿Vale? Como yo tengo que enviar objetos, cuando yo te envío un objeto, ¿vale? Tú lo guardas y le das un identificador tuyo de esta transferencia. Si te vuelven a mandar el mismo objeto y te lo han mandado antes, en vez de gastar recursos de red y volver a mandarlo, tú asumes que ya me lo has mandado este objeto, pues ya lo tengo, no lo vuelvo a recibir otra vez.
00:19:21
Lo pillo de una caché interna que tengo yo y te digo, mira, aquí lo tienes. El problema es que si yo he pillado el objeto, te lo he mandado, ahora lo modifico y te lo mando otra vez, como es la misma referencia, el mismo objeto, él cree que no ha cambiado, cree que ya lo tiene y va a pillar el objeto que tenía antes, sin la modificación que se ha hecho.
00:19:46
Entonces hay que saberlo para que en situación como esta, cuando guardo ficheros, a veces me está guardando ficheros sin las modificaciones y tendré que hacer algo para que se dé cuenta de eso y que me lo vuelva a guardar desde cero.
00:20:04
El segundo problema es la cabecera del fichero serializado.
00:20:18
Cuando yo guardo un fichero serializado, al principio no se guardan directamente los objetos como hemos hecho ayer, que simplemente se guardaban las filas, entonces ya la primera fila era un objeto, sino que este fichero tiene al principio una cabecera, tiene una serie de datos iniciales que sirven a Java Virtual Machine para decir,
00:20:22
oye, mira, soy un fichero de objetos, pues a partir de aquí empiezan los objetos de beta.
00:20:44
Ningún problema. Tú lo usas, escribes los ficheros, ningún problema.
00:20:50
El problema surge en el que si tú tienes un fichero, guardas algunos objetos,
00:20:54
luego apagas la aplicación, mañana enciendes la aplicación, creas objetos nuevos
00:20:59
y los quieres guardar en el mismo fichero de ayer, añadiendoselo a continuación,
00:21:05
Como él, hasta si le pones la append, pues va a escribir después, pues como piensa que sea una nueva escritura, vuelve a añadir la cabecera. Entonces tengo un fichero que tiene una cabecera, una serie de objetos, otra vez la cabecera y otra vez los objetos.
00:21:12
Y esto, cuando luego lo irá a leer, pues le causará un problema, porque él después de la cabecera se espera todos los objetos, de repente se encuentra otra vez la cabecera, lo intenta interpretar como objeto, no lo consigue, entonces me lanza un exceso, ¿vale?
00:21:29
Y este problema aquí sí que lo vamos a simular ahora, vamos a hacer algo que funcione todo bien, y luego después vamos a forzar que haya varios errores para ver cómo podemos un poquito gestionarlos, ¿vale?
00:21:43
Por esta razón, esto de la serialización directa pura, pues no se suele utilizar, ¿vale?
00:21:57
Es decir, en proyectitos básicos, en cosas sencillas, en cosas por estilo, sí se puede utilizar, es bastante fácil.
00:22:04
Si yo tengo un sistema de gestión de varios objetos mucho más complejos, con muchos objetos y gestionar muchas cosas,
00:22:11
pues lo más probable es que llegue un momento en que trabajar con este tipo de comunicación llega a demasiada complejidad, entonces me da demasiados errores, pues entonces compensa crearse un sistema de persistencia mejor basado sobre un ORM y un SGBD, o sea, un sistema gestor de datos, como por ejemplo Hibernate y cosas por el estilo.
00:22:19
Pero no es una cosa sencilla que hago, oye, mira, doy clic aquí y aquí y me funciona. Tengo que entender qué es Hibernate, tengo que entender qué son estas cosas y practicarlo. El próximo curso creo que lo veréis.
00:22:47
en DAM, aquí yo doy DAM
00:23:02
entonces me lo sé mejor las asignaturas
00:23:05
en DAM seguramente hay una asignatura
00:23:07
dedicada a eso que se llama
00:23:09
accesos a datos
00:23:10
eso va todo de
00:23:12
bases de datos y conexiones
00:23:14
de datos normales, no relacionales, etc
00:23:16
y como desde una aplicación
00:23:18
puedo conectarme a eso
00:23:21
pero estoy convencido a un 95%
00:23:22
que también en DAO
00:23:25
en la parte sobre todo de programación
00:23:26
lado servidor
00:23:29
si que hay una parte
00:23:30
de acceso a datos
00:23:32
y entonces
00:23:34
allí es cuando veréis estas cosas
00:23:36
más en profundidad
00:23:38
a partir de aquí, estos son ejemplos
00:23:39
de escritura y lectura
00:23:43
en ficheros y cosas por el estilo
00:23:44
lo tenéis como código para echarle un vistazo
00:23:46
¿vale?
00:23:49
algunos de estos ya los hemos hecho
00:23:49
por ahora no hemos trabajado mucho con binarios
00:23:51
pero ayer si que lo vimos un poquito en clase
00:23:54
cosas por el estilo, como se lee
00:23:56
se escribe un ejemplo ¿vale?
00:23:58
Podéis buscar también otras formas de hacer estas cosas.
00:23:59
Este es el ejemplo que nos interesa particularmente ahora, que es de escribir utilizando Object Output Stream, ¿vale?
00:24:04
Entonces, si os fijáis aquí, creo un Object Output Stream y luego escribo varios objetos, ¿vale?
00:24:13
En particular, está un objeto, está un método que es WriteObject, que me permite escribir cualquier tipo de objeto,
00:24:22
Pero luego, si yo quiero, en vez de escribir un objeto, escribir un entero, un booleano, un char, en general un tipo primitivo, tengo métodos que sostancialmente me converten el tipo primitivo en un objeto.
00:24:28
Sabéis que cada tipo primitivo tiene una clase wrapper que sostancialmente transforma en un objeto equivalente el tipo primitivo, pues lo que hace es que luego lo escribe.
00:24:45
también tenemos write to tf que es para poder escribir strings vale utilizando
00:24:58
esto para leerlo lo mismo tengo read boolean, read double, read char, read int y en
00:25:04
particular lo que nos interesa más a nosotros es para poder leer un objeto
00:25:10
que es el read object vale y esto te lee un objeto directamente este es un
00:25:15
ejemplo de cómo se realiza una clase aquí tenemos la clase persona que
00:25:20
normal y corriente una persona toda la vida vale lo que tenemos que hacer para
00:25:25
que pueda ser escrita en un fichero es implementar serializable ahora este
00:25:30
serializable no añade ningún método directamente es simplemente digamos como
00:25:36
un flag para decir a la java virtual machine que esta persona este
00:25:42
objeto si se puede guardar en un en un fichero o de toda forma utilizar con un
00:25:49
input stream y un output stream es serializable es transformable en un
00:25:57
stream vale entonces un objeto serializable como se escribe vale aquí
00:26:02
tengo las personas y veis que aquí lo que estoy haciendo es un bright object
00:26:07
de la persona bright object de la persona pues éstos me lo
00:26:11
escribirá en este fichero de aquí vale aquí se está utilizando una
00:26:15
una ruta absoluta pero mejor utilizar rutas
00:26:20
relativas y para leerlo lo mismo tened en cuenta que pero cuando lo leo vale
00:26:27
esto será un objeto entonces tendré que hacer un cast al tipo de objeto
00:26:33
Entonces aquí, por ejemplo, está utilizando para poder utilizarlo un available. Está diciendo que mientras que haya bytes disponibles para leer, pues leeme otra persona. Cuando este de aquí, el available, me dirá que no hay nada, entonces me dará cero, pues habré llegado al final de la lectura de los objetos.
00:26:42
Y ya está. Es un método de hacerlo. Hay otros. La última cosa que nos puede interesar un mínimo es la jerarquía de clases que hemos visto hasta ahora.
00:27:04
Entonces, nosotros sabemos que hay input stream y output stream. A partir de aquí hay clases que pillan este input stream, que es una secuencia de datos en entrada,
00:27:16
Y me añaden algunas funcionalidades más para que sea más fácil para mí utilizarla. Nosotros hemos utilizado, por ejemplo, el File Input Stream, que lo que hace es añadir el concepto de que no estoy leyendo desde cualquier sitio, sino desde un fichero.
00:27:28
Entonces me añadirá algunas ventajas, alguna posibilidad más para poder trabajar con ficheros. Hay más, ¿vale? Hay otras cosas que están por allí y también existen, por ejemplo, Buffered Input Stream y cosas por el estilo que mejoran todavía la posibilidad de leer de ficheros, etc.
00:27:45
Lo mismo para OutputStream, luego están los Reader y los Writer. Hemos dicho que estos trabajan con bytes, mientras que estos de aquí trabajan con caracteres.
00:28:09
fijaos que InputStream, ObjectInputStream
00:28:23
está en el lado de estoy trabajando como bytes
00:28:26
porque al fin y al cabo lo que se está guardando
00:28:29
y lo veremos ahora abriendo un fichero guardado
00:28:32
que sustancialmente no es
00:28:35
no se entiende
00:28:37
algunos trozos a lo mejor sí
00:28:43
pero algunos otros no
00:28:45
dudas
00:28:47
- 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:
- 15
- Fecha:
- 1 de abril de 2025 - 12:47
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 28′ 56″
- 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:
- 80.82 MBytes