Persistencia datos 1: I/O texto - 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 vuestro consentimiento de grabar vuestro.
00:00:00
Entonces, hoy vamos a empezar a ver lo que es la persistencia de datos.
00:00:07
¿Qué es la persistencia de datos?
00:00:11
Nosotros hemos tenido un problema desde el principio de este curso,
00:00:13
que es que nuestros programas funcionan sólo al darle el play
00:00:16
y que se acuerdan de todo mientras que el programa funcione,
00:00:22
pero en cuanto el programa se acaba, todo lo que he hecho se destruye.
00:00:25
Ahora, si mi programa es, te doy un número y me dices si es par o impar, ¿qué más me da? ¿Vale? Se apaga, lo lanzo otra vez y le digo otro número para saber si es par o impar. Interesantísimo.
00:00:30
Si mi sistema es una escuela donde tiene tu menú que dice, ¿qué quieres hacer? ¿Quieres añadir un alumno? ¿Quieres asignar una materia a un alumno? ¿Quieres asignar una nota a una materia de un alumno? Y cosas por el estilo.
00:00:40
Tú cuando lo has creado y empiezas a poner alumnos, cada vez que apagas y reenciendes, tu sistema es sin alumnos. Es a cero. Y eso es feo. Entonces, nosotros necesitamos un modo para, sustancialmente, hacer persistir los datos entre ejecuciones.
00:00:55
ahora nosotros sabemos que dentro del mundo de la informática hay una cosa que se llama jerarquía de
00:01:13
memoria donde empezamos desde la memoria más pequeña pequeña pequeña pequeña y más rápida
00:01:19
rápida rápida vida que son los registros gracias no sé quién ha dicho luego vamos un poquito más
00:01:28
grande llegamos a un pollo más grande un poquito más lento llegamos a saltar un par más caché
00:01:45
la que pone cuando te compras un procesador y te pone memoria de caché de nivel 2 de 64 mega
00:01:56
y luego hay nivel 3 pues esas son todas siempre memorias más grandes pero más lentas que se alejan
00:02:08
del procesador vale los registros son los más cercanos luego están los que están en el chip
00:02:20
del procesador que son estas memorias caché vale de dos o tres niveles y luego se llega
00:02:24
a la ram y hasta aquí todas estas son exactos volátiles qué quiere decir que cada vez que
00:02:30
apago el ordenador todo el contenido de estas memorias desaparece la ram en particular que es
00:02:44
mi memoria de trabajo es donde he trabajado hasta ahora vale todos mis programas han utilizado la
00:02:51
y cuando yo apago el ordenador y lo enciendo, no hay nada. Virtualmente hablando, cuando yo cierro
00:02:57
la java virtual machine, o sea, cuando vosotros le dais al botón verde y se enciende la java virtual machine
00:03:04
e interpreta vuestro programa y hay el botón rojo abajo, que a veces cuando hacéis un while eterno
00:03:09
se queda ahí rojo y le tenéis que pinchar para pararlo. A ver, que vos lo paráis, borráis el proceso y el
00:03:15
proceso es? Es un proceso. Esta pregunta te la he hecho ya hace un momento, efectivamente. O sea, cuando he ejecutado el
00:03:22
programa, entonces se ha creado el proceso con todos los recursos. Cuando el proceso se quita, se le
00:03:35
desasigna también el trozo de RAM que se le había dado al proceso y por lo tanto toda
00:03:40
mi memoria se ha borrado. Si sigo con la jerarquía de memoria, la siguiente memoria sería el escuduro.
00:03:45
la memoria secundaria. Disco duro sea como sea, de qué tipo sea, pero eso sí que es la primera memoria
00:03:56
no volátil. La memoria que cuando apago e enciendo mi ordenador pues sigue allí. De lo que hemos
00:04:03
hecho nosotros, ¿qué está en la memoria no volátil? El programa como tal, el código fuente. El código se
00:04:11
se escribe en disco duro. Cuando yo arranco el programa, en realidad lo que escribimos
00:04:28
nosotros está en el punto java, pero lo que se utiliza para arrancar no es el punto java,
00:04:36
es el punto class, se hace la compilación, se escribe el punto class por algún lado,
00:04:40
cuando arranco la java de esta máquina, arranco mi programa, el programa va a pillar este
00:04:45
punto clas lo carga en memoria ram y empieza a trabajar con todos los datos
00:04:49
que yo creo las variables la cosa así que creo dentro de mi programa se crean
00:04:59
donde
00:05:05
en la memoria ram en un espacio dedicado porque al ejecutar el programa y
00:05:11
transformándose en un proceso se hace una llamada de sistema al sistema
00:05:18
operativo que le dice oye mira de toda la RAM que tienes reserva un poquito de RAM para mí por favor
00:05:22
y él dice toma esta es tu RAM entonces yo trabajo allí dentro vale ese es mi trozo de memoria si
00:05:28
necesito más tendré posibilidad de pedir más al sistema operativo si necesito sólo esa me quedo
00:05:34
con esa allí pero tengo mi RAM dedicada otros procesos no pueden acceder a mi RAM si no es un
00:05:42
problema. Es un problema que en C se puede lograr a veces con una segmentation fault,
00:05:49
cosa por el estilo, que es un enemigo malvado de C, porque aparece siempre que os equivocáis con
00:05:54
algo de malloc o de gestión de memoria mal hecha. Dicho todo esto, dentro del espacio de RAM que yo
00:05:59
tengo, por un lado cargaré los trozos de código o el código de mi programa y lo tendré allí,
00:06:11
Ahí trabajo dónde están las instrucciones que tengo que ejecutar.
00:06:17
Fenomenal.
00:06:21
Que copiaré, si este es todo mi programa,
00:06:22
un trocito lo copiaré en nivel 3,
00:06:25
un trocito de este nivel 3 en nivel 2,
00:06:27
un trocito de este nivel 2 me lo cargo en los registros
00:06:29
y desde los registros lo ejecuto en el procesador.
00:06:33
¿Vale?
00:06:37
Siempre tengo como trocitos siempre más grandes
00:06:37
cerca del procesador para que sea mucho más rápido
00:06:41
cambiar de ejecución y cosas por el estilo.
00:06:43
Ahí.
00:06:45
funcionalidad. Esto lo habéis estudiado, ¿no?
00:06:45
¿No?
00:06:49
Sistema informático, ¿no?
00:06:50
Hay todo un mecanismo en el
00:06:52
ordenador para que prevea
00:06:54
lo que tú vas a utilizar y lo
00:06:55
cargue en las zonas
00:06:58
de memoria más cercana
00:07:00
al procesador. Si lo hace bien
00:07:02
tu programa va bien, si lo hace mal
00:07:04
llega un momento en que tiene que
00:07:06
pararse a buscar esta información
00:07:08
en un lado o en el otro, en el caso peor
00:07:10
desde el disco duro y por lo tanto
00:07:11
ralentiza todo el proceso.
00:07:13
Mi ram, parte, está allí con el código del OJD, y lo de otra parte de la ram, donde
00:07:15
yo creo las variables que yo creo.
00:07:23
Y aquí hay dos cosas, hay el heap, que es donde se crean los objetos, no todas las variables,
00:07:26
Y el stack, la pila.
00:07:45
¿Sabéis cuando se decía llamada de métodos?
00:07:56
Era la pila de la llamada de métodos.
00:07:59
Pues a esta está asociada una pila en la memoria
00:08:01
donde en cada bloque que yo apilo en esta pila
00:08:03
creo las variables locales de ese método.
00:08:07
Las llamadas de métodos corresponden a
00:08:10
construcción de variables locales a ese método.
00:08:13
Cuando yo quito ese método, pues toda la variable local
00:08:16
de ese método se pierde.
00:08:19
Esto lo vimos con los scope
00:08:21
de las variables en
00:08:22
octubre.
00:08:25
Entonces, todo esto
00:08:30
memoria volátil.
00:08:31
Ahora lo que queremos hacer nosotros
00:08:33
es hacer que persistan estos datos. Quiere decir
00:08:35
que cuando llegue un momento
00:08:37
determinado, yo puedo decirle
00:08:39
a mi programa, vale, muy bien, lo que tú
00:08:40
tengas ahora en memoria RAM,
00:08:43
guárdalo, cópialo, escríbelo
00:08:45
de alguna forma en la memoria
00:08:46
secundaria para que cuando yo
00:08:49
apague este programa
00:08:51
los datos se queden allí
00:08:52
y cuando yo vuelva a encender
00:08:54
este programa, el programa mismo
00:08:57
puede preguntarse, oye mira, ¿has guardado
00:08:59
algo anteriormente?
00:09:01
o podría decirme, oye mira
00:09:04
¿quieres cargar algún fichero?
00:09:05
y yo le puedo decir, mira, vete
00:09:08
a este fichero de aquí, allí dentro
00:09:09
encontrarás algo y con
00:09:11
ese algo, sácame los datos
00:09:13
para volver al mismo estado
00:09:15
o un estado lo más parecido posible de cuando apague la última vez.
00:09:17
Eso puede ser que lo haga de forma automática, en el sentido de que yo arranco
00:09:22
y él, sin preguntarme nada, vaya a buscar un particular fichero
00:09:25
y si ese fichero está, lo cargue en memoria,
00:09:29
o puede ser que simplemente arranque siempre en vacío
00:09:32
y que tú digas, oye, mira, lo ad este de aquí, ¿vale?
00:09:35
Nosotros empezaremos ahora, porque este año lo hacemos al revés,
00:09:39
con forma
00:09:42
de forma, digamos, textual
00:09:44
le pediremos que hagan las cosas
00:09:46
mandándole comandos que creamos
00:09:48
nosotros o dándole a uno para
00:09:49
cargar o lo que sea, ¿vale? Como hemos hecho
00:09:51
los menús. La cosa interesante
00:09:53
será después, pues, todas
00:09:55
estas opciones hacerlas a través de una
00:09:57
interfacturación, ¿vale? El año pasado
00:09:59
para quien estaba el año pasado o quien
00:10:01
había visto vídeos del año pasado
00:10:03
empezamos con la
00:10:05
parte, digamos, antes gráfica
00:10:07
y luego hicimos esta de aquí
00:10:09
pues este año intentamos al revés
00:10:11
porque
00:10:14
no está claro si es mejor
00:10:15
hacer una cosa o la otra
00:10:18
¿Conceptos?
00:10:19
El código en la
00:10:23
programación orientada a objetos, los objetos
00:10:24
sobre que se funda
00:10:26
¿Vale?
00:10:27
Datos y código ejecutable
00:10:29
¿Vale? Esto de aquí son
00:10:32
el repaso de lo que acabamos de decir toda hora
00:10:33
¿Vale? Nosotros cuando
00:10:36
cuando trabajamos con programación
00:10:38
orientada a objetos, por un lado tenemos
00:10:40
los atributos que son los datos del objeto
00:10:42
por otro lado tenemos los métodos que es código
00:10:44
¿vale? esto se guardará por algún lado
00:10:46
el código almacenado
00:10:48
en el dispositivo de almacenamiento con un disco duro
00:10:50
¿vale? es el código compilado
00:10:52
que se guarda allí, o sea los métodos
00:10:54
no se guardan en el heap
00:10:56
los métodos están guardados por otro lado
00:10:58
y siguen allí, son el código que yo he
00:11:00
escrito, sin embargo los atributos
00:11:02
dependen de la ejecución ¿vale?
00:11:04
de lo que estoy haciendo con el objeto
00:11:06
O sea, que el comportamiento en un cierto sentido, una vez escrito, se compila y se queda allí, los datos sobre los que se trabaja pueden mudar durante la ejecución.
00:11:08
Yo lo que no puedo modificar es cómo funciona un método mientras lo estoy ejecutando y mientras lo estoy utilizando.
00:11:18
Para eso debería parar el sistema, crear un nuevo método, compilarlo y en ese punto utilizaría el nuevo método.
00:11:26
Cuando ejecutamos un programa sobre una Javita Machine, el código compilado se carga en memoria RAM y se ejecuta, lo hemos dicho.
00:11:32
Cuando la electricidad se apaga, el programa desaparece de la memoria, pero persiste en el disco, el programa, el código, sigue ahí.
00:11:39
Los atributos. Los valores de atributos de los objetos no existen previamente en el disco, ¿vale?
00:11:49
Todo lo que yo defino en el código está en el código, pero no existe una zona de memoria con la que yo pueda trabajar tanto con objetos como con variables de tipo primitivo y cosas por el estilo.
00:11:56
Se van creando a la hora de ejecutar el objeto, hay algunas instrucciones como la declaración de variables o la asignación de valores a variables creadas que me permiten sostantivamente crear lo que necesito en RAM.
00:12:08
Una vez en la introducción del programa, cuando se ejecuta una new, se crea en un espacio de memoria RAM, que es el int,
00:12:20
toda la estructura necesaria para que este objeto exista y que pueda trabajar con él.
00:12:29
El resto de datos, como variables locales, parámetros de entradas, los parámetros de los métodos que se asigna desde formal a actual, etc.
00:12:35
Se guardan en una zona de memoria llamada stack, una pila, stack en inglés.
00:12:45
porque efectivamente se va creando
00:12:50
cuando yo llamo un método, creo todas las cosas de este método
00:12:53
en un bloque que voy apilando, cada llamada
00:12:56
yo siempre ejecuto la última llamada del método
00:12:59
lo vimos cuando vimos la stack de llamadas a método
00:13:02
yo llamo el método main, pues estoy ejecutando el main
00:13:05
si desde el main se llama el método calcularArea
00:13:07
dejo colgado el main
00:13:10
me voy a calcular, creo un nuevo bloque
00:13:15
donde aquí puede haber nuevas variables y uso estas
00:13:17
que son visibles desde este método, son locales a este método. Cuando acaba este método, este nuevo
00:13:20
bloque se destruye y vuelvo a donde estaba antes, que era la llamada del main, y por lo tanto,
00:13:26
a la línea siguiente de la llamada al método calcular era del main. ¿Entiendes? Este contenido
00:13:31
es volátil en el sentido que se libera cada vez que se acaba la ejecución y todo esto es RAM,
00:13:42
vale, entonces cuando acaba
00:13:48
vale
00:13:50
cuando finaliza el programa los datos de los atributos
00:13:51
del IP no persisten, aunque
00:13:54
en muchos casos sería deseable, vale
00:13:56
este es el concepto de, tengo mi escuela
00:13:58
he hecho mis alumnos y ahora
00:14:00
no puedo
00:14:02
cruzar los dedos diciendo, mientras que
00:14:03
este ordenador no se apague, tengo aquí
00:14:06
los alumnos y si
00:14:08
mañana se va la luz, pues tengo
00:14:10
que volver a poner los 1200 alumnos de este año
00:14:12
vale
00:14:14
los lenguajes orientados a objetos
00:14:15
no prevén de ningún mecanismo automático
00:14:18
de persistencia
00:14:21
por tanto debemos programar
00:14:22
¿qué datos queremos que sean persistentes?
00:14:23
no existe normalmente
00:14:27
a nivel de programación de orientados a objetos
00:14:28
un método mágico que dice
00:14:30
esto cuárdame todo por ahí
00:14:32
se puede lograr hasta un cierto nivel
00:14:34
con estas cosas de Evernet
00:14:36
facilitan
00:14:38
el hacerlo
00:14:39
a precio
00:14:42
de tener que configurarlo y tener que saber
00:14:44
lo que estoy haciendo. O sea, a cambio de una formación previa que me permite
00:14:48
utilizarlo, luego me facilita el último. Nosotros
00:14:51
no estamos a ese nivel, estaremos a un nivel mucho más bajo.
00:14:55
Como muchas cosas que hemos hecho, tendemos a empezar desde niveles
00:15:00
más bajos de abstracción, más cercanos a
00:15:04
lo que podría ser el lenguaje máquina, aun si estamos en un lenguaje de alto
00:15:08
nivel y por lo tanto muchas cosas reales se esconden y luego a partir de allí construimos
00:15:12
encima clases o métodos o abstracciones que nos permiten sustancialmente hacer lo que a
00:15:18
bajo nivel son muchas instrucciones con una instrucción sola que digamos esconde lo que
00:15:25
hay por debajo un poco si queremos verlo con lo que hemos hecho con ArrayList nosotros antes
00:15:31
hemos aprendido como funciona un array
00:15:35
como se añade un elemento a un array
00:15:38
y cosas por el estilo, luego hicimos un paso
00:15:40
intermedio que era crear nuestra
00:15:42
clase gestión
00:15:44
array que me permitía hacer cosas
00:15:46
mágicas sobre los arrays sin toquetear
00:15:48
los arrays directamente porque lo he tocado una vez
00:15:50
y a partir de ahora uso un método
00:15:52
que me añade el elemento sin
00:15:54
tocar el array y luego ver
00:15:56
que esta cosa efectivamente es tan lista
00:15:58
que alguien lo ha hecho y ha creado una clase
00:15:59
arrayist que sustancialmente
00:16:02
me permite añadir cosas
00:16:04
sin tener que estar pendiente de lo mismo.
00:16:06
¿Sí?
00:16:08
Un viaje desde muy bajo nivel
00:16:09
a niveles más altos de astral.
00:16:11
¿Vale?
00:16:15
Para conservar el valor
00:16:17
un dato en un dispositivo
00:16:18
de almacenamiento.
00:16:21
Se puede hacer de varias maneras.
00:16:23
¿Vale?
00:16:25
Entonces, nosotros
00:16:25
cuando tenemos un dato
00:16:26
y lo queremos guardar
00:16:29
en el sentido de no en RAM
00:16:32
a nivel de persistencia, podemos tener varias formas de arte. Nosotros nos centraremos y tendremos en cuenta tres,
00:16:34
en esta parte dos de ellas, pero para que tengáis una idea. Primero es crear un archivo. ¿Qué es un archivo?
00:16:45
Es un trozo de memoria dentro de un disco duro, ¿vale?
00:16:55
Habéis visto un archivo o cosa por el estilo.
00:17:03
Hay dos tipos de archivos, grosso modo.
00:17:05
Uno son los archivos normales con extensión que conocéis,
00:17:08
y el otro son las carpetas.
00:17:11
Las carpetas son archivos especiales que tienen dentro,
00:17:13
sustancialmente, punteros a otros archivos.
00:17:15
Pero al fin y al cabo son archivos ellos también.
00:17:18
¿Vale? Entonces, yo tengo este archivo,
00:17:20
tengo este espacio de memoria, quiero guardar mis datos, los guardo
00:17:23
en modo row, ¿vale? crudo en inglés, es decir
00:17:27
me invento un formato en el que yo pillo
00:17:31
los valores que normalmente conforman mi objeto y
00:17:34
escribo estos valores con un determinado formato inventado por mí
00:17:38
separado por coma, entre paréntesis, lo que me dé la gana
00:17:42
en un fichero, ¿vale? sea como en tipo
00:17:46
texto sea en hexadecimal sea en lo que yo necesite en un formato que yo decido y cuando tengo este
00:17:50
alumno que se llama stefano y que tiene todos 10 es en sus asignaturas claramente toda media
00:17:57
10 pues lo que hacemos es guardar en un fichero stefano dos puntos 10 vale para mí esto punto y
00:18:03
coma esto es un alumno vale y si hay otro alumno que se llama no lo sé y que tiene cinco de media
00:18:10
pues después del punto y coma pondré
00:18:17
no lo sé, dos puntos, cinco
00:18:19
punto y coma. Y así, me invento
00:18:21
un método mío. Podría no ser
00:18:23
texto.
00:18:25
Podría ser binario
00:18:27
si hace falta.
00:18:29
Pero tengo una forma para
00:18:31
tengo un objeto, lo escribo así
00:18:33
en un fichero.
00:18:35
Cuando tenga este fichero con esta cosa escrita
00:18:37
con un determinado formato, puedo leer este
00:18:39
formato para reconstruir
00:18:41
el objeto.
00:18:43
Tenemos que controlar nosotros el formato de dicho archivo. El formato es mío, el propietario, me invento yo como sea.
00:18:44
Segunda opción, pidiendo a la Llamator Machine que almacene todos los datos del objeto en un archivo, pero dejando la gestión del formato a ella.
00:18:55
Esto lo hacemos serializando el objeto, lo que implementa la interfaz Serializable.
00:19:08
Esto es sustancialmente, hago una extracción, esto lo estoy haciendo yo.
00:19:21
Aquí voy a perder el control sobre el formato y a cambio le digo a la Javeton Machine,
00:19:26
usa tus métodos para guardar estos objetos.
00:19:33
¿Cómo se guardan? No lo sé, no lo quiero saber.
00:19:37
Pero si te digo, guárdame este objeto, tú lo guardarás con el mecanismo que te parezca a ti,
00:19:40
que alguien más habrá implementado de un formato que yo a lo mejor no sé, no quiero saber,
00:19:46
porque yo no voy luego a hurgar en ese formato,
00:19:51
sino que voy simplemente a trabajar con ese fichero diciendo, guárdame el objeto, recupérame el objeto.
00:19:54
Finalmente, pidiéndole a un sistema gestor de bases de datos que almacene los datos en
00:19:58
algunas estructuras, tablas y cosas por el estilo.
00:20:06
Entonces, para que esto funcione necesitaría tener una base de datos activa, una posibilidad
00:20:10
de conectarme a esta base de datos y, sustancialmente, lo que se llama un ORM, un Object Relational
00:20:15
que sería sustancialmente un mecanismo entre medias
00:20:22
en el que yo hablo con él diciendo
00:20:28
oye mira, yo necesito guardar este objeto
00:20:30
él mapea los datos de este objeto con tablas
00:20:33
y con la estructura de una base de datos que guarda este objeto
00:20:38
y a ese punto él en automático guarda en la base de datos
00:20:42
a la que tiene que conectarse, por lo tanto la base de datos tiene que estar encendida
00:20:45
guarda todos los datos de ese objeto
00:20:48
En los tres casos, la parte compleja no es guardar el objeto.
00:20:50
La parte compleja es el persistir de las referencias entre objetos.
00:21:01
Porque mientras que yo guardo alumno con nombre Estefano y nota media 10, es muy fácil.
00:21:10
pero cuando guardo profesor
00:21:17
que dentro tiene una lista de alumnos
00:21:20
y una lista de materias
00:21:22
y estos alumnos se refieren a estas materias
00:21:24
y las materias a notas
00:21:27
y cosas por el estilo
00:21:28
cuando guardo estas cosas
00:21:29
no tengo que guardar solo los valores
00:21:31
tengo que también guardar las relaciones
00:21:33
que tienen estos valores
00:21:35
porque cuando luego recargo esa información
00:21:37
no solo quiero saber los valores
00:21:40
sino que tengo también
00:21:42
que las relaciones
00:21:44
los punteros que trabajaban antes
00:21:46
mantengan los punteros
00:21:48
a las mismas cosas, y que si
00:21:50
había dos punteros que apuntaban al mismo objeto
00:21:52
no quiero ahora crear dos copias
00:21:54
del mismo objeto con punteros separados
00:21:56
quiero crear una vez el objeto
00:21:58
y luego punteros que tengan
00:21:59
el mismo objeto, ¿vale?
00:22:02
y esa es la parte compleja, sobre todo aquí
00:22:03
¿vale?
00:22:06
porque como aquí hago todo yo
00:22:08
nadie me da una mano
00:22:10
en preservar estas
00:22:12
conexiones
00:22:14
esto te estoy diciendo, no, no, el formato es mío
00:22:15
lo hago yo, pues entonces tú tendrás que escribir
00:22:19
cuando guardas alumno, también las referencias
00:22:21
a otros objetos posibles que
00:22:24
están dentro del propio alumno
00:22:26
aquí a mitad
00:22:30
en el sentido que le estoy dando a la Jabberton Machine
00:22:32
o ya hace esto, entonces si lo hago de golpe
00:22:36
o si no le pido cosas extremadamente
00:22:39
complejas, más o menos lo entiende y me
00:22:42
preserva él, porque como lo está haciendo
00:22:45
él, pues, lo hará bien
00:22:47
él, ¿vale? Entonces, más
00:22:49
o menos puede funcionar. Lo mejor
00:22:51
sería aquí, porque estas son cosas mucho
00:22:53
más avanzadas, y cuando hace el
00:22:55
ORM, el Object Relational Mapping,
00:22:57
pues, debería, si está bien
00:22:59
hecho, y si lo ha configurado bien,
00:23:01
pues, preservar también
00:23:03
las varias referencias a objetos,
00:23:04
a otros objetos, ¿vale?
00:23:07
También pensarlo a nivel de base de datos,
00:23:09
si yo puedo crear que cada objeto, puedo
00:23:11
asignarle una
00:23:13
una clave primaria
00:23:14
entonces cuando luego tengo desde otros
00:23:16
objetos, referirme a un
00:23:19
objeto de estos, puedo usar esta clave primaria
00:23:21
para decir exactamente este objeto de aquí
00:23:23
entonces se mantendría
00:23:25
la posibilidad de
00:23:27
gestionar referencias al mismo
00:23:29
objeto en base a esta clave primaria
00:23:31
que yo tengo, ¿vale? aún así
00:23:33
no es trivial, no es trivial
00:23:35
implementarlo en un sistema como este
00:23:37
no lo implementamos nosotros, sería
00:23:38
una buena práctica de unos
00:23:41
también el hacer que arranque que funcione es lo de siempre si lo sabes hacer no es una cosa
00:23:42
tremendamente difícil a lo mejor se acomoda pero llegar al nivel de saber que estoy toqueteando
00:23:52
y que todo funcione bien pues requiere de su formación dudas hay una clase de java y que
00:23:58
representa un muy bien, un fichero o un file. Representa el nombre de un archivo concreto o
00:24:12
los nombres de archivos de un directorio. Vale, file me vale tanto por directorio como por fichero
00:24:24
porque el directorio es un fichero al fin y al cabo. Dependiendo de cuando la creo le puedo
00:24:29
decir si es un directorio o no y le puedo preguntar oye fichero eres un directorio o no.
00:24:34
Hay una función, si no me equivoco, que es isdir, o algo por el estilo, que devuelve true si es una directory,
00:24:42
y falsa si es un archivo normal y correcto.
00:24:47
Cuando yo creo un objeto de tipo file, yo tengo una representación a nivel de Java de un fichero que está en el disco duro.
00:24:55
Pero son dos cosas distintas.
00:25:09
yo puedo tener una representación de un objeto sin tener el fichero en el disco duro.
00:25:12
Está claro que si yo lo estoy leyendo, entonces voy allí y digo, este file es este fichero.
00:25:20
Vale, si no está, explota. Si está, pues lo tengo.
00:25:25
Pero si yo voy a crear un fichero nuevo y digo, mira, en este fichero voy a poner este texto,
00:25:28
hasta que no lo haya creado el fichero, pues no está.
00:25:34
Es una referencia a un objeto en Java. Es una... ¿Cómo decir? Es una abstracción, es un manejador, es la idea de un fichero.
00:25:39
Pero luego hay comandos para decir, ok, yo tengo esta representación de fichero, ahora créamelo de verdad.
00:25:57
y entonces hablará la Java Virtual Machine con el sistema operativo y dirá a mí en el sistema operativo
00:26:02
me están solicitando de crear un fichero. Por lo tanto, pilla un trozo de memoria,
00:26:08
márcalo como fichero y guárdalo para mí. Vale, entonces a ese punto sí que aparecerá el sistema.
00:26:13
¿Vale? Me está claro que en el momento en que yo le digo file, vuestra mente ha pensado,
00:26:19
exacto ha pensado que gana tengo de irme al api y leer todos los métodos de file para ver qué
00:26:28
puede hacer qué puedo hacer con un file muy bien así piensa un programador además del file que es
00:26:40
la base digamos para decir vale con esto manipuló manejo los ficheros tengo una serie de señores que
00:26:49
me permiten crear stream, crear flujos de información que van desde mi programa al
00:26:59
fichero o desde el fichero a mi programa dependiendo de si son input o output. Aquí
00:27:09
tenéis varios ejemplos que van desde más bajo nivel a más alto nivel.
00:27:18
siempre la misma idea. Hay metoditos,
00:27:27
hay funciones, hay clases que me permiten hacer
00:27:31
las cosas a muy bajo nivel, más cerca posible
00:27:35
a los bits, a los unos y los ceros. Y una vez que yo tengo
00:27:39
algo que puede hacer algo así a bajo nivel, pues le construyo encima
00:27:43
métodos para que sea más sencillo manejar esa cosa.
00:27:46
Porque si yo tengo que escribir un texto, hola, ¿qué tal?
00:27:50
y para escribirlo tengo que ponerlo en binario,
00:27:54
a mí, ser humano, me molesta.
00:27:57
No me gusta para decir, hola, ¿qué tal poner 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0?
00:28:00
Feo, porque no me acuerdo la H en binario.
00:28:06
Sin embargo, a la máquina le flipa el binario.
00:28:09
Él quiere todo en binario.
00:28:12
Entonces, tengo que crear algo en el medio, ¿vale?
00:28:14
Que puede ser más hacia la máquina o más hacia mí, ¿vale?
00:28:18
Y es un poco esto.
00:28:22
El input stream es un poco más cerca de la máquina, muy lejos de la máquina, porque
00:28:24
la máquina está en binario, encima del binario está el asemblador, por encima del asemblador
00:28:31
está no sé qué, por encima del no sé qué estará esto, y luego llega un momento en
00:28:35
que tengo el Java y por encima del Java tengo el input stream.
00:28:40
Hay niveles, pero dentro de estos tres métodos es el más cerca a la cosa.
00:28:45
¿Qué quiere decir? Que sustancialmente me permite, estos son input, ¿vale?
00:28:51
Pero input es recibir datos, leer datos, ¿vale?
00:28:56
Pero si yo uso un input stream, leeré, tengo un flujo de información en input,
00:29:00
siempre el concepto de input-output se considera desde la óptica del programa.
00:29:07
Yo soy un programa, input es lo que desde fuera llega dentro del programa,
00:29:13
Output es el que genera el programa y suelta afuera.
00:29:17
Por eso System.out es un output a la pantalla, por ejemplo.
00:29:21
Cuando nosotros teníamos el escáner, el parámetro que poníamos era System.in,
00:29:28
porque es un input desde el teclado a mi programa.
00:29:35
Entonces, este de aquí es un input stream, es un flujo stream de información
00:29:40
que va desde fuera, desde no sé qué, hacia mi programa.
00:29:44
Si yo este de aquí lo asocio con un fichero, tendré un fichero en el disco duro
00:29:50
y cuando aquí le digo lee, pues estará leyendo datos desde el fichero.
00:29:54
Si yo en vez de un fichero aquí conecto otro proceso de mi programa,
00:29:59
cuando le diré lee, pues recibiré datos desde este otro proceso.
00:30:03
Si yo aquí en vez de ponerle un proceso de otro programa le pongo un socket,
00:30:08
Pues tendré una lectura desde Internet.
00:30:12
Y cuando otro ordenador se conecte a ese socket y me mande datos,
00:30:16
yo leeré desde este socket con InputStream.
00:30:20
Cuando vosotros otra vez estaréis en segundo de DAM,
00:30:24
en programación de procesos y servicios,
00:30:30
veréis, reutilizaréis estas cosas de aquí,
00:30:33
diciendo, es que en primero no lo hemos dado, ¿vale?
00:30:36
Pero sí, lo habéis dado ahora.
00:30:40
grabado. Y usaréis los mismos métodos, pero en vez de conectarnos a ficheros os
00:30:42
conectaréis a otros procesos o a software, a otros, digamos, programas en red.
00:30:48
Encapsula un flujo de bits para leer que pueden provenir del teclado de un
00:30:59
fichero de una conexión de red. Proporciona métodos para leerlos byte a byte. Es muy
00:31:04
bajo nivel. Aquí estamos trabajando con bytes. Tú puedes decir, léeme un byte. ¿Y qué es este byte?
00:31:10
No tengo ni idea. Podría ser un carácter, entonces luego lo puedo leer como una letra,
00:31:15
puede ser un trocito de un fichero de audio, podría ser un trocito de un objeto que luego
00:31:20
tendré que reconstruir, no lo sé. Pero voy leyendo byte a byte. Estamos muy a bajo nivel porque lo
00:31:29
que voy a hacer es trabajar con binario. Voy leyendo los bytes, cuando tengo cuatro bytes
00:31:34
los puedo juntar y hacer un entero, por ejemplo. ¿Os acordáis que un entero ocupa cuatro bytes?
00:31:40
Si hubiese leído cuatro bytes, podría hacer un entero. O leo ocho bytes y con estos ocho bytes puedo sacar un...
00:31:52
por ejemplo no lo sé pero aquí yo estoy trabajando le puedo decir oye leme un string
00:31:59
y esperar o saber cuántos bytes tengo que leer para leer el string entero cuando lo
00:32:11
he leído decir y este es un string y porque en mi formato por ejemplo he almacenado string de
00:32:23
10 bytes siempre. Si tengo un texto más largo, lo debo a 10 bytes, 10 bytes, 10 bytes. Entonces luego leo de 10 bytes en 10 bytes, por ejemplo.
00:32:30
Depende de mi formulario. Sí, ahora yo sé, pero, que voy a trabajar con letras, con carácteres, porque he almacenado ficheros de texto,
00:32:38
ficheros binarios, ahora pasamos a ficheros de texto. En vez de utilizar un input stream más secas, puedo usar un input stream reader.
00:32:51
esta parte de Reader
00:33:00
me está diciendo, oye mira
00:33:02
no eres un input stream de más bajo
00:33:04
nivel posible, eres un poquito
00:33:06
más abstracto, asumes
00:33:08
que aquí dentro tú no has puesto
00:33:10
byte por byte, mas has puesto
00:33:12
caracteres, que serán siempre byte
00:33:14
por byte, por debajo este va
00:33:16
a leer byte por byte, pero
00:33:18
tendrá algunos métodos
00:33:20
más que un input stream básico
00:33:22
que me permitan, en vez de
00:33:25
decir lee y me da un byte
00:33:26
decir lee y me da un char
00:33:28
directamente
00:33:31
yo interpretaré
00:33:34
leeré cuantos bytes tengo que leer
00:33:35
para que sea un char
00:33:38
y te devuelvo el char directamente
00:33:39
¿se entiende?
00:33:41
vale
00:33:45
si yo trabajo
00:33:46
con file
00:33:49
en vez de utilizar input stream
00:33:50
o input stream reader
00:33:54
tengo file input stream
00:33:55
y FileReader, que son mecanismos de lectura más específicos
00:33:58
para trabajar no con cualquier posible input,
00:34:04
sino en particular con ficheros.
00:34:08
Son los que usaremos nosotros principalmente junto al último.
00:34:10
Entonces, cuando el flujo de caracteres proviene de un fichero,
00:34:16
podemos utilizar estas clases especializadas en ficheros
00:34:19
en lugar de InputStream y InputStreamReader.
00:34:22
normalmente, pero estos dentro tienen
00:34:25
un input stream o un input stream reader.
00:34:27
Lo veremos.
00:34:29
Finalmente,
00:34:32
está el buffer reader. ¿Qué es un buffer?
00:34:33
No es caso.
00:34:39
Es un buffer. Personaje
00:34:43
que lanza hechizos
00:34:48
que potencian...
00:34:50
Sí, eso también es un buffer, pero
00:34:52
no este buffer de aquí.
00:34:53
Es el numerito que aparece
00:35:02
cuando vosotros le dais al Netflix.
00:35:03
Miráis vuestra serie
00:35:06
y aparece un numerito que hace 0,
00:35:07
un 99%? Pues ese es el
00:35:09
base. ¿Qué es? Es una
00:35:12
memoria temporal que se va
00:35:14
llenando, ¿vale?
00:35:16
Para que tú, cuando vas a procesar
00:35:17
las cosas, en vez de procesar
00:35:20
directamente la fuente,
00:35:21
vas haciendo como
00:35:24
un cojín entre
00:35:26
la lectura desde la fuente y
00:35:27
lo que se está reproduciendo de verdad. ¿Por qué?
00:35:29
Porque si tu
00:35:32
velocidad de red tiene algunas
00:35:33
fluctuaciones, a veces va un poquito más rápida,
00:35:35
a veces un poquito más lenta, no tienes
00:35:38
un parón en tu vídeo
00:35:40
o en tu audio, en tú lo que
00:35:42
estás haciendo, cada vez que tu red va
00:35:44
un poquito más lenta, mantiene un margen
00:35:46
de unos megas
00:35:48
de información, que si la
00:35:50
red, por ejemplo, se bloquea un segundo
00:35:52
pues tú vas tirando de este
00:35:54
buffer y cuando vuelve la red
00:35:56
pues lo rellena otra vez
00:35:57
¿sí?
00:35:59
pues
00:36:03
misma cosa
00:36:03
solo que aquí ahora nuestra fuente de información es el fichero o es internet o es lo que sea
00:36:04
y yo cuando leo del fichero, si todo está bien, lo leo tranquilamente
00:36:14
si hay muchos programas que están pidiendo de fichero, si el disco duro tiene que leer un poco de esto, un poco de esto, un poco de esto
00:36:19
y cosas por el estilo, mientras que el procesador está haciendo otra cosa
00:36:24
entonces un poco me puede hacer caso, pero a veces no me puede hacer caso, está haciendo otros procesos
00:36:28
pues yo tenga
00:36:33
la posibilidad de leer
00:36:35
un trozo y sacar
00:36:37
el trozo de golpe
00:36:40
¿vale?
00:36:41
sustancialmente es
00:36:44
una abstracción más
00:36:45
con respecto al reader
00:36:48
que me permite en vez de leer
00:36:49
carácter por carácter
00:36:52
si el input stream lee byte por byte
00:36:53
el reader permite leer
00:36:56
carácter por carácter
00:36:58
esto permite leer líneas enteras por ejemplo
00:36:59
O sea, una línea entera.
00:37:02
¿Sí?
00:37:04
Este aquí añade uno de los métodos más cómodos para nosotros, que es el Readline.
00:37:06
O sea, lee una línea entera de un fichero.
00:37:10
¿Sí?
00:37:14
Entonces lee todas las líneas hasta llegar a un retorno de tarra, un intro.
00:37:16
¿Vale? Y todo esto me lo devuelve de golpe.
00:37:20
¿Sí?
00:37:23
Irá baserizando todos los caracteres.
00:37:24
¿Qué lee? ¿Leo un carácter?
00:37:28
Es un intro, no. Entonces leer otro. Vale. Es un intro, no. Es otro, es otro.
00:37:30
Cuando encuentras un intro, dice todo lo que has leído aquí en un bonito string
00:37:34
te lo das.
00:37:38
Este de aquí lee bytes, este de aquí lee char, este de aquí
00:37:41
lee string.
00:37:46
¿Todas esas clases serán de file o de cada una de las dos?
00:37:53
No, no. Ninguna es file.
00:37:56
File será el parámetro
00:37:58
que tú pones por algún lado aquí
00:38:01
para decir, oye mira, tú eres un input stream
00:38:03
sí, de qué fichero, de este file
00:38:05
un puntito de la mano
00:38:07
pero el file representa un fichero
00:38:12
esto representa una información
00:38:15
que viene de un fichero, para decirle
00:38:17
para decirle
00:38:19
qué fichero, tú te crearás un file
00:38:21
este es el file, vale
00:38:23
lo pasas como parámetro a este file reader
00:38:25
y ahora tienes algo que lee de ese fichero
00:38:27
estas son
00:38:29
crean tubos de conexión
00:38:34
entre el fichero y tu programa
00:38:37
y cada vez que tu programa
00:38:39
dirá, pilla algo de este tubo
00:38:40
le llegará información desde el fichero
00:38:43
hacia adentro
00:38:45
lo que nosotros
00:38:47
hacíamos con el teclado
00:38:49
solo que en vez del teclado la información viene de un fichero
00:38:50
pues
00:38:54
preguntas
00:38:57
igual que los dos anteriores, pero está mejorado
00:38:59
el funcionamiento es para poder
00:39:06
leer líneas enteras
00:39:07
de caracteres como por ejemplo strings
00:39:10
¿si?
00:39:12
entonces, más o menos
00:39:14
la idea es esta, yo tengo por un lado
00:39:15
posibilidad de manejar
00:39:18
los ficheros, por otro lado posibilidad
00:39:20
de manejar canales de comunicaciones
00:39:21
con este fichero, esto es input
00:39:24
habrá también
00:39:25
output, si input
00:39:27
me permite leer desde
00:39:29
teclado desde el fichero de cosas e incluirla en mi programa en mi programa lo puedo modificar y
00:39:31
hacer lo que me haga cuando los quiero guardar pues lo que hago es escribirlas en un fichero
00:39:39
normalmente el formato de escritura y de lectura tiene que ser el mismo si yo decido guardar mis
00:39:48
mis objetos como cadenas de texto, pues tendré que escribir cadenas de textos y leer cadenas
00:39:54
de textos. No puedo, o es desaconsejado, escribir una cosa y leer otra. Se puede hacer en determinados
00:40:01
Por ejemplo, quiero leer un fichero .txt de la lista de la compra. ¿Qué uso?
00:40:09
De los en negrita. ¿Qué uso?
00:40:23
No, uso password reader. ¿Por qué? Porque en la lista, cada línea será una cosa que quiero comprar,
00:40:44
y le digo, dime la primera, dime la segunda, dime la tercera. ¿Por qué uso reader?
00:40:53
¿Por qué de todas estas uso un blablabla reader? No, no te oí.
00:41:03
¿Y por qué uso un reader? ¿Por qué puedo usar un reader? Claro, porque hemos dicho que yo estoy
00:41:12
leyendo un fichero .txt. Estoy leyendo un fichero de texto. ¿Sí? ¿Lo habéis notado?
00:41:35
Está en un fichero de texto.
00:41:44
Lo ha dicho el profe, pero ¿para qué?
00:41:46
Las limitas soy también.
00:41:51
Vale, entonces uso un líder porque como es un fichero de texto,
00:41:53
voy a utilizar algo que me permite leer carácteres.
00:41:57
Y como es una lista de la compra,
00:42:00
¿y alguna vez en mi vida he hecho la compra?
00:42:03
¿Y me he escrito una lista?
00:42:07
¿Y escribo cada cosa en una línea?
00:42:10
Pues qué buen binario.
00:42:12
Entonces, me puedo imaginar que una lista al ordenador esté hecha de cada producto
00:42:19
en una línea.
00:42:28
Si no, tenéis un problema, ahí lo habláis con vuestro psicólogo.
00:42:30
Por esto, el bachelor en 3D podría ser útil para decir, leo una ley hasta si la escrita
00:42:35
todas separadas por coma, ¿vale?
00:42:40
Que soy raro, pero no tanto.
00:42:42
Pues me leo toda una línea
00:42:43
y luego lo pasa a un split con
00:42:45
regex coma y me la
00:42:48
divide. ¿Sí? ¿Están de acuerdo?
00:42:50
Pero me puede valer,
00:42:52
en un fichero de este tipo, me puede valer
00:42:53
poder leer una string.
00:42:55
¿Vale? Lo leeré varias veces
00:42:58
hasta que haya líneas y cada
00:42:59
línea diré, oh, compra esto también, compra esto
00:43:02
también. ¿Sí? Ahora,
00:43:04
quiero leer
00:43:06
un fichero
00:43:08
audio. ¿Qué uso? Input string. ¿Vale? No puedo leer un reader. ¿Sí? Porque en un fichero de audio
00:43:09
habrá datos, habrá bits, pero estos bits no son caracteres. ¿Vale? Representarán un formato que
00:43:33
sello de la frecuencia que tiene que hacer el no sé qué para poder codificar para decodificar y
00:43:41
modular un determinado sonido vale por lo tanto eso no lo puedo representar como una letra vale
00:43:48
entonces una de estas dos y como es un fichero pues posiblemente optaré por file in bootstream
00:43:53
Que dentro probablemente tenga un inputStream.
00:44:01
¿Sí? ¿Entienden?
00:44:03
Entonces, ¿cuál se usa?
00:44:05
Pues depende de lo que quiero usar.
00:44:07
¿Sí? Dependiendo de lo que quiero
00:44:09
hacer, pues puedo utilizarlo.
00:44:11
Ahora, ¿puedo yo, si tengo
00:44:13
mi fichero de lista de la compra
00:44:15
.txt, utilizar un inputStream?
00:44:17
Sí, ¿por qué no?
00:44:19
¿Vale?
00:44:21
Es decir, lo leeré byte por
00:44:23
byte, será un infierno
00:44:25
porque luego tengo que pillar estos bytes y
00:44:27
yo en mi programa castigarlos a algo que sea leíble como un char y identificar qué char era.
00:44:29
¿Puedo, si yo tengo el fichero de audio, leerlo línea por línea con un buffer reader? Claro,
00:44:37
pero es todavía más infernal porque lo que leeré es una string que no tiene ningún sentido y luego
00:44:48
tendré que pillar char por char, transformarlo a binario y ese binario
00:44:57
interpretarlo como un sonido. La transformación está ahí. Es como cuando abrís en
00:45:01
formato de texto un powerpoint y salen caracteres infernales. ¿Por qué? Porque no
00:45:06
es código de texto, no es texto plano y entonces el bloque de notas intenta
00:45:12
interpretar cada ocho bits como una letra y salen carácteres que
00:45:19
depende de las preguntas muy bien le damos un archivo de texto vale se
00:45:28
utiliza la clave la clase es file reader o va a ser el reader
00:45:39
entonces me creo un file reader no es necesaria aquí lo que voy a crear
00:45:43
directamente aquí, pero bueno, fileReader es igual a null, va a ser el reader es igual a null, ¿vale?
00:45:48
Primero hago un new fileReader con una ruta de archivo, ¿vale? Esta de aquí será el fichero.
00:45:54
Si yo le pongo directamente lista.txt, asumo que el fichero esté en la carpeta principal de mi
00:46:02
proyecto si en vez le pongo una ruta distinta pues
00:46:10
estará donde está la ruta aquí no necesariamente le pongo lista compra
00:46:18
punto txt puedo ponerse dos puntos barra no sé cuánto barra no sé cuánta ancora
00:46:23
barra si para navegar cuidado con poner rutas absolutas porque es la clave para
00:46:28
nos funciona y nosotros ponéis un fichero en el escritorio hacéis vuestro programa en casa luego
00:46:36
lo lleváis aquí diciendo profe mira que funciona y como en el escritorio en parte de la ruta está
00:46:44
vuestro usuario que aquí no tenéis nuestro programa que no funciona pero esto lo sabéis de sobra de
00:46:50
lenguaje marca cuántas veces el lenguaje marca nos ha funcionado el css porque habéis puesto una
00:46:56
ruta absoluta en vez de una ruta relativa
00:47:02
por lo tanto aquí no lo vais a ver este de aquí me crea un file reader una
00:47:08
conexión que puede leer caracteres desde un fichero y este es el fichero
00:47:15
creo que aquí le puedes poner un file en vez de ponerle un string de la ruta le
00:47:21
pones un objeto file. Y luego, por encima de esto, como wrapper a esto, tú dices, me
00:47:28
crea un buffer reader, que es un buffer reader, es un lector que puede hacer strings, ¿vale?
00:47:35
Al que le pasas este de aquí. Sostantivamente está diciendo, yo tengo algo que puede leer
00:47:40
carácter por carácter, ¿vale? Ahora creo algo que usa este leer carácter por carácter,
00:47:44
pero en vez de darme carácter por carácter, me da el string entero. ¿Entiendes? Entonces,
00:47:49
a partir de aquí
00:47:56
br es lo que va a utilizar
00:47:57
es un objeto
00:48:00
mágico, que si yo le digo
00:48:02
léeme una línea, me lee una línea del fichero
00:48:04
sean cuantas sean las líneas del fichero
00:48:06
me creo string línea
00:48:08
y digo, mientras
00:48:10
línea es igual a br.redline
00:48:11
not null
00:48:15
¿qué quiere decir esto?
00:48:16
si, dice, ve a este br
00:48:26
lee una línea
00:48:28
hay dos opciones
00:48:29
o hay una línea para leer
00:48:31
y me la has leído
00:48:33
o no has podido leer nada
00:48:34
bien porque en el fichero no estaba
00:48:37
bien porque has llegado al final del fichero
00:48:39
y entonces me devolverá null
00:48:41
si no es null
00:48:43
mientras que no sea null
00:48:45
quieres decir que algo lo has leído
00:48:47
y te lo has guardado en línea
00:48:49
entonces ahora
00:48:51
lo imprime en pantalla
00:48:52
o lo parcheo
00:48:54
o lo transformo en un objeto
00:48:56
O le cambio la letra B por la letra S.
00:48:58
Lo que tengas dentro de tu programa, ¿vale?
00:49:03
Va a procesar esta línea, ¿sí?
00:49:06
Touch exception, por si cuando hago algo de esto explota,
00:49:10
veréis que ahora os lo pide, os aportáis que las excepciones
00:49:15
había dos tipos, algunas que podías no controlar
00:49:17
y algunas que sí tenías que controlar como las...
00:49:20
Exacto, muy bien, hoy estáis así, ¿eh?
00:49:28
la IO exception, ¿vale?
00:49:31
La excepción es de input-output.
00:49:33
Input-output, pues, eran de las que tenías que controlar, ¿vale?
00:49:35
Entonces, si tú intentas hacer uno de estos de aquí,
00:49:39
Fire Reader o Buzzer Reader, sin poner un try-catch,
00:49:42
te va a decir no.
00:49:46
Tienes dos posibilidades.
00:49:48
O try-catch o throws.
00:49:50
Para poner aquí ese throw, perdón.
00:49:57
Pones que aquí, aquí no está, pero en la declaración del método,
00:49:59
pones que throw esta cosa, entonces
00:50:03
estás diciendo, no, la voy a gestionar yo
00:50:05
esta sección, la va a gestionar quien me
00:50:07
llama.
00:50:09
Muy bien.
00:50:12
Y aquí, finally,
00:50:13
try if the error is not null
00:50:15
a error.cruise.
00:50:17
Esto de aquí, cada vez que abrís un
00:50:19
file reader o cosa por el estilo,
00:50:22
en algún momento de vuestra vida, deberías
00:50:23
cerrarlo. ¿Vale? Todos estos
00:50:25
recursos, lo vimos en el
00:50:27
scanner.
00:50:29
Nosotros hemos creado scanners en nuestra vida
00:50:31
y nunca los hemos cerrado
00:50:33
y hemos ignorado un warning que decía
00:50:34
deberías cerrarlo. Y nosotros, ¿qué más
00:50:36
debemos dar? ¿Vale? Porque nuestros
00:50:38
programas duran 20 segundos, luego
00:50:40
se quitan y entonces
00:50:42
tampoco es un problema. ¿Vale?
00:50:44
Pero si tú te metes a abrir C-Share
00:50:46
o si nunca lo cierras, si nunca lo cierras,
00:50:48
si nunca lo cierras, tienes lo que se llama un
00:50:50
memory leak. O sea que
00:50:52
tu programa
00:50:54
crea recursos y no los cierra.
00:50:56
Crea recursos y no los cierra. Crea recursos
00:50:58
y no los cierra. Y esto,
00:51:00
estos recursos van creciendo
00:51:01
y creciendo y creciendo
00:51:03
y en un mes nada, en tres meses nada
00:51:05
en seis años tienes un programa
00:51:07
que raramente
00:51:09
ocupa el triplo de lo que debería ocupar
00:51:10
dices, ¿por qué será?
00:51:13
o un programa que cada seis meses colapsa
00:51:15
porque le acaba la memoria, lo reinicias
00:51:17
y va todo bien por los dos años
00:51:19
¿eh? por eso
00:51:20
un 95% de los
00:51:24
problemas de informática se solucionan
00:51:26
¡muy bien!
00:51:29
¿Dudas?
00:51:33
¿Se entiende esto?
00:51:35
¿Mecanismo?
00:51:37
¿Sí?
00:51:39
Escritura de un archivo de texto.
00:51:46
¿Vale? Vamos a escribir.
00:51:48
Para escribir, claramente,
00:51:50
no puedo usar ni el Reader,
00:51:52
ni el Input,
00:51:54
ni el Buffer Reader.
00:51:56
Voy a utilizar, en vez de Reader,
00:51:58
Writer.
00:52:00
En vez de Input,
00:52:02
Aquí, por ejemplo, tenemos un FileWriter y un PrintWriter, ¿vale?
00:52:04
Entonces, parecido a antes, me creo un FileWriter,
00:52:12
que sustancialmente es un punto de acceso en salida a un fichero de mi sistema operativo,
00:52:17
y lo involucro en un PrintWriter.
00:52:22
¿Habéis visto alguna vez un PrintWriter en vuestra vida?
00:52:24
Sí, desde el primer día de este curso.
00:52:29
desde que pusiste System.out
00:52:33
System.out
00:52:36
es un objeto de clase
00:52:38
PrintWrite
00:52:40
y que tiene dentro el objeto
00:52:41
el método
00:52:44
Println
00:52:45
que normalmente
00:52:47
en el System.out está conectado
00:52:49
con
00:52:52
la consola
00:52:52
y por lo tanto cuando vosotros hacéis un System.out
00:52:57
Println lo veis en consola
00:52:59
lo que habéis escrito, sin embargo
00:53:01
Pero aquí este printwriter estará conectado con este fichero, entonces que cuando yo escribo
00:53:04
println, ¿dónde escribirá?
00:53:13
Muy bien.
00:53:19
Entonces, por int igual a cero diez veces, tv, que es printwriter, es este objeto de
00:53:20
aquí, está por un lado, este, punto println, ¿vale?, línea, más i, entonces ¿qué hará
00:53:27
este señor?
00:53:34
¿Escriben un fichero o qué?
00:53:35
¿En qué sentido?
00:53:44
No escriben nueve líneas.
00:53:45
¿Qué escriben?
00:53:50
Literalmente esto escribe línea 1, línea 2, línea 3, línea 4, línea 5...
00:53:53
Bueno, concretamente, línea 0, línea 1, línea 2, línea 3, hasta línea 9.
00:53:57
10 líneas
00:54:02
y por cada línea
00:54:04
escribe línea más i
00:54:06
que va de 0 a 9
00:54:07
¿sí? ¿lo veis?
00:54:09
esto crea un fichero
00:54:13
que si yo abro con el
00:54:14
no hace par más más, me encuentro dentro literalmente
00:54:15
línea 0 y debajo línea 1
00:54:18
línea 2 hasta línea 9
00:54:20
¿sí?
00:54:22
bla bla bla se explota
00:54:25
bla bla bla
00:54:26
¿sí?
00:54:27
una pregunta, va a mostrar 10 líneas
00:54:29
¿Puedo mostrar siempre la misma o mostrar una y luego hacer un salto de líneas a la siguiente?
00:54:32
Contéstate.
00:54:40
Lm, next line, ok.
00:54:41
Exactamente como si tú, piensa esto, si en vez de fuera de la prueba fuera de la system.out,
00:54:45
¿qué te daría?
00:54:51
Pues eso, en vez que en consola, es escrito en un fichero, ¿sí?
00:54:52
Falso, esto no va a funcionar en la vida, ¿vale?
00:54:57
Esta es la idea de las cosillas porque Java intenta optimizar las cosas y si vosotros tenéis una empresa de camión y de transporte y una persona, tipo Amazon, imaginaos, y una persona ordena un cepillo de dientes,
00:55:02
¿Vosotros qué hacéis? ¿Lo metéis en el camión y decís, sal, llévalo esto? ¿O esperáis que se llene el camión y cuando está lleno mandáis todo?
00:55:28
Misma cosa, ¿vale? Cuando tú le dices, escribe, escribe, escribe, escribe, él ni te mira, ¿vale? Lo haré, ¿vale?
00:55:39
Es la diferencia entre, por un lado está el mundo de Java y la RAM, y por otro lado está el disco duro.
00:55:47
Disco duro es lento. No quiero trabajar con disco duro. Quiero trabajar con disco duro lo menos
00:55:54
posible. Si me pongo por cada cosa a hacerlo, mi programa va muy lento. Mucho más lento, porque con
00:56:00
respecto a la RAM es horriblemente más lento el disco duro. Vosotros que sois jóvenes, ¿habéis arrancado
00:56:08
alguna vez un ordenador que no tiene ssd ssd si habéis notado diferencia
00:56:17
y hoy en día parece que está roto y ahora lo que hacemos nosotros por esos
00:56:29
viejos toda la vida el ssd mucho más lento de la rama
00:56:35
todos imaginamos todas estas cosas la rama dice ok el programa dice ok lo voy
00:56:40
a hacer me lo guardo aquí y ya cuando tengo suficientes datos para hacerlo de golpe lo voy
00:56:46
a hacer más de aquí por el problema es que en la vista real tú metes muchos datos llegará un
00:56:53
momento que tiene todo suficiente lo guardo lo que sea nosotros no no haremos nunca datos
00:57:01
suficientes entonces por aquí en algún lado habrá un momento en que tú tendrás que decirle vale lo
00:57:05
que tienes guardado ejecútate esfuerzo a ejecutar lo que tú tenías pendiente que tenía marcado en
00:57:11
la dama esto lo voy a escribir vale pues escríbelo de verdad porque yo tendré por un lado el fichero
00:57:18
real y por otro lado una copia de este fichero en la ram y mi programa usa esta copia aquí trabaja
00:57:26
sobre esto lee está inscribe está pero tengo que tener un determinado momento en que digo no
00:57:33
asegúrate que esta copia aquí, ahora la copias aquí. ¿Es lento? Sí, lo sé, pero hazlo, porque si no, lo pierdo.
00:57:38
Nuevamente se hace con un tv.flush, que es como decir, manda. En teoría también cuando hace una close,
00:57:46
como última operación, debería hacer una flash. Pero esto es un territorio raro de Java, en el que
00:57:58
a veces lo hace, a veces no, y a veces
00:58:07
vosotros lo hacéis todo bien y no escribe
00:58:09
nada, y luego le ponéis un flash
00:58:11
por algún lado y de repente escribe.
00:58:13
Vamos a probarlo, ¿vale?
00:58:23
Antes de seguir. En los próximos días
00:58:25
lo que vamos a hacer es
00:58:27
ver otras cosas. Esto, por ejemplo, es un programa
00:58:28
que copia un fichero.
00:58:31
¿Vale? Esta es la copia de un fichero.
00:58:34
Me das un fichero, me das
00:58:35
dónde lo quieres copiar, y yo te copio
00:58:37
esto en otro lado. Y para copiar
00:58:39
un fichero, se usa
00:58:41
input stream y output stream
00:58:43
o sea, se hace byte por byte
00:58:45
porque tú no sabes qué fichero
00:58:47
estás copiando, no copias un fichero de texto
00:58:49
puedes copiar un fichero ejecutable
00:58:51
puedes copiar un fichero de audio
00:58:53
entonces aquí se usa
00:58:54
input stream
00:58:56
luego entraceremos
00:58:58
a trabajar con objetos, ¿vale?
00:59:00
por ahora estamos solo en lectura y escritura de datos
00:59:02
luego decimos, sí, va a ver, pero si
00:59:05
lo que quiero escribir en vez de un texto es un
00:59:07
objeto, ¿qué hago?
00:59:09
lo veremos aquí
00:59:11
- 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:
- 1
- Fecha:
- 10 de marzo de 2026 - 14:05
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 59′ 17″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 497.42 MBytes