Ficheros 1 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Vale, vamos a grabar la clase, por lo tanto si habláis me dais el consentimiento para que grabe vuestra voz, ¿vale?
00:00:00
Para hacer preguntas y cosas por esto.
00:00:06
Persistencia de datos, entonces vamos a ver ahora uno de los mecanismos que podemos hacer, utilizar en Java para que los datos persistan entre una ejecución y otra de un mismo programa, ¿vale?
00:00:09
Nosotros sabemos que una parte de nuestros programas ya se mantienen entre ejecuciones, ¿vale?
00:00:24
Que son el código, sustancialmente
00:00:30
El código se almacena y ha compilado en dispositivo de almacenamiento como disco duro, ¿vale?
00:00:32
Vosotros sabéis que vosotros escribís el código
00:00:37
Luego, al darle al Java C, sustancialmente, creáis bytecode
00:00:38
Que serían los puntos class
00:00:44
Los puntos class en vuestros proyectos se guardan en la carpeta bin, ¿vale?
00:00:45
La carpeta src contiene punto java
00:00:52
La carpeta bin contiene los puntos class
00:00:55
Y cuando se ejecuta, los puntos Java y el search no se miran
00:00:58
Todo se hace en BIM, ¿vale?
00:01:03
En la parte compilada
00:01:05
Porque la JavaScript Machine entiende los puntos class, ¿vale?
00:01:06
Sin embargo, el resto de los datos
00:01:11
Como son los objetos, las variables, etc.
00:01:14
Eso no se guarda en el disco duro
00:01:17
Eso se guarda en RAM al momento en que se ejecuta
00:01:20
Por lo tanto, existe mientras que la JavaScript Machine está funcionando
00:01:23
Y mientras que yo estoy utilizando mi programa
00:01:27
Cuando la director machine se apaga
00:01:29
Cuando el programa se acaba
00:01:31
Todos estos datos se pierden
00:01:32
¿Vale?
00:01:35
Justo para que os suene
00:01:40
¿Vale?
00:01:41
Los valores de atributos y objetos
00:01:42
No existen en el disco
00:01:45
Cuando se ejecuta una new
00:01:47
¿Vale?
00:01:50
Cuando se hace un nuevo objeto
00:01:50
Se reserva un espacio en la memoria RAM
00:01:52
Un espacio dentro del proceso que es todo el programa
00:01:55
Hay un espacio particular para los objetos que se llama el heap
00:02:00
Esta es la parte de la memoria donde se guardan los objetos
00:02:04
Es una zona especial donde se guardan los objetos
00:02:09
Sin embargo, los otros datos como variables locales, los parámetros de entradas
00:02:12
Los parámetros cuando hago una llamada, etc.
00:02:17
No se guardan en este espacio aquí
00:02:20
Si no se guardan en otra sección que es llamada la stack, la pila
00:02:23
Si os acordáis cuando vimos las pilas y cosas por el estilo
00:02:27
Hablamos de la pila de llamadas, de métodos, etc.
00:02:31
Pues esto funciona como pila porque si pensáis a las variables
00:02:36
Y donde existen las variables, el concepto de ámbito de una variable
00:02:41
Lo vimos al principio
00:02:46
Si os acordáis que una variable existe solo dentro del bloque en el que está declarada
00:02:47
Pues esto es una pila, ¿vale? Cada bloque es una capa nueva de la pila donde existe la información de ese bloque, ¿vale? Cuando yo salgo de ese bloque, pues la última capa se quita y las variables que existían allí desaparecen, ¿vale?
00:02:51
Por eso son locales a ese blog
00:03:10
Entonces, heap y stack son
00:03:13
Heap es como montón en español
00:03:15
Son simplemente dos formas de almacenar los datos
00:03:19
¿Vale? Por eso se llaman así
00:03:24
El stack lo conocemos, la pila
00:03:25
El heap no lo conocemos exactamente como funciona
00:03:27
Pero es, digamos, el tipo de colección
00:03:30
El tipo de estructura que se utiliza para almacenar
00:03:34
Los objetos
00:03:38
Vale
00:03:40
Cuando finaliza el programa
00:03:42
Los datos, los atributos
00:03:44
Etcétera, etcétera, no persisten
00:03:47
¿Vale?
00:03:49
Y los lenguajes orientados a objetos
00:03:50
No suelen prever ningún
00:03:52
Mecanismo automático
00:03:55
Para guardar estos objetos
00:03:57
De forma persistente
00:03:58
O sea, todos los lenguajes orientados a objetos
00:04:01
Por defecto, si yo no hago nada
00:04:03
Si yo no lo hago explícitamente
00:04:05
Lo que hacen es perderán todos los datos cuando se apaga
00:04:06
¿Vale?
00:04:09
Pero prácticamente todos los lenguajes de orientado a objetos
00:04:10
Tendrán sus mecanismos para intentar guardar estos ficheros
00:04:13
Y para que persistan de alguna forma
00:04:18
¿Vale?
00:04:20
Entonces, ¿cómo vamos a almacenar los datos?
00:04:21
¿Vale?
00:04:26
Para conservar estos datos tenemos que trabajar con un sistema de almacenamiento
00:04:26
Que no sea como la RAM, que cuando apaga, cuando ya pierde la corriente se va
00:04:32
Sino algo que pueda persistir, como por ejemplo un disco duro, ¿vale?
00:04:37
¿Cómo se hace esto? Pues, por ejemplo, se puede crear un archivo
00:04:41
Que es lo que aprenderemos a hacer hoy, ¿vale?
00:04:45
Nosotros podemos crear un fichero, dentro de este fichero, que es un trozo de memoria
00:04:48
Al fin y al cabo, podemos meter datos, ¿vale?
00:04:52
Los datos que metemos aquí pueden ser RAW, crudos
00:04:56
O sea, los datos tal y como los tengo
00:05:00
Pues los escribo allí, en bits y bytes
00:05:02
¿Vale?
00:05:05
O en modalidad texto
00:05:06
¿Vale? Si yo lo que estoy utilizando es guardar
00:05:08
Información que son string
00:05:10
Que son texto
00:05:12
O yo tengo otros tipos de datos
00:05:13
Pero los puedo representar
00:05:16
Como un string
00:05:18
Pues entonces lo puedo guardar en modalidad texto
00:05:19
¿Vale?
00:05:23
Entonces en vez de guardarlo byte a byte
00:05:23
En un cierto sentido lo estoy guardando en grupos de bytes
00:05:25
Que luego se corresponderán a carácteres
00:05:28
Y serán secuencias de carácteres
00:05:30
¿Os acordáis algún ejercicio
00:05:32
Que hemos hecho en nuestro
00:05:35
En el curso
00:05:37
En el que se decía
00:05:39
Oye, mira, tenéis que crear, no sé
00:05:40
Tres alumnos, cinco alumnos
00:05:42
Te voy a dar yo un string
00:05:43
¿Vale?
00:05:46
Que pone nombre, coma
00:05:47
O sea, Estefano, coma
00:05:49
Cuarenta, coma
00:05:53
Una dirección, ¿vale?
00:05:55
Punto y coma
00:05:56
Y luego estará paco, coma
00:05:57
37, coma
00:05:59
Y otra dirección, etc, etc
00:06:01
Y esto era una representación
00:06:03
De tipo texto
00:06:05
De los objetos
00:06:06
¿Vale? Entonces se puede hacer
00:06:08
Yo mis objetos los puedo pillar
00:06:11
Decir, vale, cada objeto se representará como
00:06:13
Concatenando de forma string
00:06:15
Una cosa a otra
00:06:18
Y eso me lo guardo como un line text
00:06:19
Está claro que aquí se podría complicar
00:06:21
Que
00:06:23
Pero
00:06:24
En qué sentido
00:06:28
Eso da igual
00:06:30
Eso lo decides tú
00:06:33
Puedes no poner espacio
00:06:34
Puedes ponerlo, puedes poner un asterisco
00:06:35
Eso lo decides tú
00:06:38
Como a ser formado en base a tus necesidades
00:06:40
Mi pregunta es más
00:06:43
A alto nivel, más abstracta
00:06:45
O sea, cuando yo tengo un objeto
00:06:47
Persona
00:06:49
Y lo quiero escribir en un fichero
00:06:50
Como una línea de texto
00:06:52
Si tengo el nombre de la persona
00:06:53
Fácil, es un string, lo pongo
00:06:56
Si tengo la edad de una persona, pues es un int
00:06:58
Vale, pero lo puedo convertir
00:07:01
A un string, poniéndole delante
00:07:02
Dos comillas, y lo puedo escribir tal y cual
00:07:04
Me tengo que acordar que
00:07:07
Cuando lo volveré a leer, ese es un string
00:07:08
Y yo tendré que hacer un integer.partseint
00:07:11
Para revocarlo
00:07:13
Vale, fenomenal
00:07:14
¿Dónde se puede complicar las cosas?
00:07:15
Exacto, cuando
00:07:27
Mis atributos no son primitivos
00:07:28
Definitivos. Porque nosotros sabemos que cuando los atributos de una clase son objetos también, pues no lo guardo directamente con su valor, sino guardo una referencia a otro objeto.
00:07:31
Y claro, si yo estoy haciendo una conversión de mi persona o mi alumno, y mi alumno tiene lista de materias, y lista de materias es una clase, ¿cómo hago la representación textual de esta lista de materias?
00:07:44
Puede ser complejo. Y más complejo todavía. ¿Qué pasa cuando hay referencias de distintos objetos al mismo objeto? O sea, que todos los alumnos de primeros tendrán la misma lista de materias.
00:08:01
Entonces, el objeto lista de materia es único, pero todos los objetos alumnos tienen que referenciarse a este objeto. Pues eso se complica en términos de tener que escribirlo como una cadena de texto.
00:08:16
Ya, pero tú
00:08:30
¿Qué haces? ¿Lo escribes en cada alumno?
00:08:32
¿Escribes toda la lista?
00:08:35
No
00:08:36
¿Cómo referencias un objeto
00:08:36
Pasándolo a string?
00:08:41
No es fácil
00:08:44
No es fácil
00:08:45
¿Vale?
00:08:47
Porque la referencia que te da
00:08:47
Es dinámica
00:08:49
Es que la puedes reutilizar más adelante
00:08:50
Entonces, esto complica un poco las cosas
00:08:53
No siempre se puede utilizar
00:08:56
Este mecanismo
00:08:57
Hay mecanismos más avanzados
00:08:58
Otro mecanismo
00:09:00
Que podemos utilizar es
00:09:03
Pidiéndole a la Java Virtual Machine
00:09:04
Oye mira hazlo tú
00:09:06
No me voy yo
00:09:07
A liar con los datos
00:09:09
Transformándolo a texto
00:09:11
Representando mis objetos
00:09:13
Como formato textual
00:09:16
Si no le digo a la Java Virtual Machine
00:09:17
Oye mira tengo este objeto
00:09:19
Guárdamelo en algún lado
00:09:21
Una vez que me lo has guardado allí
00:09:23
Cuando lo quiero te voy a pedir
00:09:24
Oye dámelo otra vez
00:09:26
¿Vale? Esto se suele hacer serializando el objeto
00:09:27
¿Vale? Existe una forma relativamente fácil para decirle que este objeto es serializable
00:09:32
Serializable es exactamente lo que se puede escribir en serie
00:09:38
Se puede transformar en una secuencia de bytes
00:09:41
Y una vez que se pueda transformar en una secuencia de bytes
00:09:44
Yo esto lo puedo dar a una clase, digamos así, ahora veremos cuál es
00:09:46
Que tiene unos métodos
00:09:54
Y estos métodos lo puede decir
00:09:55
Escribe esta serie de bytes
00:09:56
En un fichero
00:09:58
Y él lo escribirá
00:10:01
Además
00:10:02
Cuando un objeto es serializable
00:10:03
Si contiene solo objetos serializables
00:10:07
Pues en automático
00:10:10
La Java Store Machine se da cuenta
00:10:12
De las varias referencias
00:10:14
Y escribe lo que tiene que escribir
00:10:15
Para que luego más o menos funcione
00:10:17
Aún así
00:10:19
No es
00:10:20
Súper sencillo
00:10:22
¿Vale?
00:10:25
Hay que saber lo que estamos haciendo
00:10:26
Porque, sobre todo
00:10:28
O sea, para...
00:10:30
Yo tengo la clase alumno con sus datos
00:10:32
Y la guardo, guardo un objeto
00:10:34
Y lo vuelvo a pillar
00:10:36
Pues eso es muy fácil
00:10:37
Las cosas se complican cuando hay muchos objetos
00:10:38
Que se referencian a objetos compartidos
00:10:42
Y que haya esto...
00:10:45
Haya que hacer algo
00:10:47
Para que cuando yo vuelva a cargar estos objetos
00:10:48
Se cargue también el objeto compartido
00:10:51
Y que todos referencien a la misma instancia
00:10:53
Eso se complica
00:10:55
¿Vale?
00:10:56
Y si Java no lo entiende
00:10:57
No lo consigue hacer
00:11:00
Pues tendré que ser yo
00:11:01
En mi fase de leer el fichero
00:11:03
Y recuperar los datos
00:11:05
Que haga las cosas bien
00:11:06
Lo habré guardado de tal forma
00:11:08
Que cuando luego lo vuelva a recargar
00:11:09
Pues modifique lo que tenga que modificar
00:11:12
Para que funcione
00:11:15
¿Sí?
00:11:16
Más de eso más adelante
00:11:17
La tercera forma
00:11:18
Es utilizar una base de datos
00:11:20
¿Vale?
00:11:22
Para poder utilizar una base de datos
00:11:24
Que no es sencillo, tengo que encontrar algo
00:11:25
Que me haga un mapeado
00:11:28
Entre mis objetos y las tablas de la base de datos
00:11:30
Que se llama un ORM
00:11:32
Y utilizando estas dos cosas
00:11:34
Pues es una versión
00:11:35
Un poco más eficiente
00:11:38
Y un poco más
00:11:41
Elegante
00:11:42
De hacer esta cosa
00:11:43
Está claro que
00:11:45
Si mi programa es un programa muy sencillo
00:11:46
Montar un sistema de un gestor de base de datos
00:11:49
Con un ORM y todo esto
00:11:52
Pues me lleva más tiempo
00:11:53
Que programar mi programa
00:11:55
Lo que estamos haciendo nosotros es programar cosas muy sencillas
00:11:57
Y por lo tanto esto
00:12:00
Por ahora nos interesa poco o nada
00:12:01
¿Vale?
00:12:04
Está claro también que en un proyecto verdadero
00:12:05
Allá afuera, un sistema que tiene que funcionar
00:12:07
Entre producción
00:12:10
Pues probablemente esto es lo que queremos
00:12:11
También porque
00:12:14
Si hay muchos datos con los que trabajamos
00:12:15
Y cosas por el estilo
00:12:18
Trabajar con archivos es lento
00:12:19
Siempre trabajar con archivos es una cosa lenta
00:12:21
Los sistemas gestores de base de datos
00:12:24
Tienen todos los mecanismos que habéis aprendido
00:12:26
De indicización
00:12:28
De optimización
00:12:30
Para que el acceso a los datos sea mucho más rápido
00:12:31
Con respecto a leer un archivo entero
00:12:34
Y buscar allí algo
00:12:37
Para que no se
00:12:38
¿Vale?
00:12:40
Eso quiere decir que los archivos no se usan
00:12:42
Los archivos siguen allí
00:12:44
Son la base
00:12:46
Muchos datos
00:12:47
Que hay que cargar
00:12:49
O que te interesan todos
00:12:52
Que no hay tanto que buscar
00:12:54
Sino que son datos que tienen que almacenar
00:12:55
Y que cada vez que arrancas tu programa
00:12:57
Los tienes que cargar en memoria
00:12:59
Pues un archivo es una solución
00:13:01
Aceptable
00:13:03
¿Sí?
00:13:04
Entonces, cuando se habla de almacenamiento de datos
00:13:06
Tres opciones
00:13:10
O uso archivos directamente
00:13:11
Y soy yo que le digo
00:13:14
Cómo se escribe y cómo se lee
00:13:15
Tanto en modalidad directamente byte a byte
00:13:17
O en modalidad de cadenas de texto y mensajes
00:13:20
O uso la Java Vector Machine
00:13:24
Lo que me proporciona la Java Vector Machine
00:13:27
Para que sea ella que decida cómo almacenar los datos
00:13:29
Y ahí yo pierdo el control de cómo se almacena este objeto
00:13:32
Es ella que sabe almacenarlo y recuperarlo
00:13:35
O utilizo una base de datos
00:13:38
Estas son las tres opciones
00:13:41
Para utilizar los ficheros
00:13:42
Necesitamos una clase que represente los ficheros
00:13:47
Fijaos, esto no es
00:13:50
File, la clase file
00:13:51
De Java no es un fichero
00:13:54
Es un manejador
00:13:56
De fichero
00:13:58
Representa un fichero
00:13:59
Es una abstracción de un fichero
00:14:01
Es
00:14:04
El handler, el manejador
00:14:05
Que yo puedo tener dentro de mi programa
00:14:08
Para luego trabajar con
00:14:10
El sistema
00:14:12
Con el sistema de ficheros
00:14:13
Y los ficheros de verdad
00:14:15
Tened en cuenta que aquí hay varios pasos
00:14:17
Si yo estoy en un programa
00:14:19
Mi programa está escrito en Java
00:14:20
Y está ahí en un ficherito
00:14:22
Está traducido al class
00:14:24
Nosotros no trabajamos
00:14:25
Directamente con ficheros nunca
00:14:28
Lo que hay en el medio
00:14:30
Hay al menos dos pasos
00:14:32
Por un lado está la Java Virtual Machine
00:14:34
Que interpreta mis comandos
00:14:36
Y que entonces puede ya hacer algo
00:14:38
Allí ella, y luego la Java Virtual Machine
00:14:40
Para poder trabajar sobre los ficheros
00:14:42
No puede ir a trabajar directamente
00:14:44
Necesita una interfaz
00:14:46
Con lo que es el sistema operativo
00:14:48
¿Vale? Entonces, la implementación
00:14:50
De la Java Vector Machine, implementará
00:14:52
Las llamadas de sistemas
00:14:54
Al sistema operativo correctas
00:14:56
Porque la Java Vector Machine, sabéis que si está instalada
00:14:58
En Windows, o en Linux, o en
00:15:00
OSX, o lo que sea
00:15:02
Por lo tanto, al instalar
00:15:04
La Java Vector Machine, ella tendrá
00:15:06
Los mecanismos dentro para poder
00:15:08
Solicitar al sistema operativo
00:15:10
Oye, píllame un trozo
00:15:12
De memoria, ese trozo de memoria
00:15:15
Lo referenciarás con este nombre
00:15:16
Y ahora este sería un fichero
00:15:18
Y yo quiero escribir allí
00:15:19
Entonces hay varios niveles
00:15:20
A nivel nuestro, que es el nivel más abstracto
00:15:23
De todos, nosotros no trabajamos
00:15:26
Directamente, no sabemos si por debajo
00:15:28
Hay un disco duro, si hay un pendrive
00:15:30
Si hay un
00:15:32
Un cd, que se yo
00:15:34
Me da igual
00:15:36
A mi lo que me interesa es
00:15:38
Llamar una entidad file
00:15:39
Y en este file luego podré hacer algo
00:15:41
Como crear un canal de escritura
00:15:44
O crear un canal de lectura
00:15:45
Para poder escribir o leer
00:15:47
¿Vale?
00:15:49
Entonces la clase File me representa este fichero
00:15:50
Normalmente se le da un nombre
00:15:53
De un archivo
00:15:56
¿Vale?
00:15:56
Datos.dat
00:15:58
No se que.txt
00:16:00
¿Vale?
00:16:02
Sabéis que al menos en el mundo de Windows
00:16:03
Las extensiones no sirven prácticamente de nada
00:16:05
La única cosa que sirven
00:16:08
Es para saber con que
00:16:10
Programa se abre en estos
00:16:12
Ficheros
00:16:14
¿Vale? Entonces si es .docx
00:16:16
Se abrirá con Word
00:16:18
Si es .pdf se abrirá con
00:16:19
Un lector de PDFs y cosas por el estilo
00:16:21
¿Vale? Entonces
00:16:24
Esto para decir que cuando me invento un nombre
00:16:25
Le tengo que dar una extensión, pero a lo mejor inventaré
00:16:28
La extensión que me da la gana, ¿vale?
00:16:30
Normalmente
00:16:33
A lo mejor nosotros pues
00:16:34
Utilizaremos un .txt
00:16:35
¿Por qué? Porque luego es fácil ir allí, abrirlo
00:16:37
Con doble clic y ver que hay dentro
00:16:39
Si lo llamo punto algo, pues funciona perfectamente
00:16:41
Pero cuando voy a darle doble clic me dice con qué programa lo tengo que abrir un punto algo
00:16:46
Para crear un fichero en Java se invoca un constructor de la clase File
00:16:50
Hago New File entre paréntesis del nombre y sostancialmente esto me crea un handler
00:16:56
A ese punto con este handler puedo preguntarme, ¿existe este fichero?
00:17:02
Si existe, lo puedo
00:17:06
Utilizar, si no existe
00:17:08
Se puede decir entonces crear
00:17:10
Vale
00:17:12
¿Cómo se leen los datos
00:17:17
Desde un fichero?
00:17:20
¿Vale?
00:17:22
Entonces, para eso existen
00:17:23
Varias clases
00:17:25
Nosotros veremos
00:17:27
Cuatro, cinco
00:17:28
Clases de este tipo, ¿vale?
00:17:31
Que me permiten crear
00:17:33
Un canal de comunicación con el fichero
00:17:34
¿Vale?
00:17:37
La input stream
00:17:37
Es la más genérica
00:17:40
¿Vale? De hecho no se puede crear
00:17:41
Un input stream como tal
00:17:43
¿Vale?
00:17:45
Es sustancialmente
00:17:46
Una idea abstracta
00:17:48
De como se puede
00:17:51
Recibir datos
00:17:53
Un flujo en input
00:17:54
Un flujo en entrada
00:17:56
De datos
00:17:57
Y sustancialmente me da unos métodos
00:17:59
Me proporciona unos métodos muy muy básicos
00:18:02
En plan a leer bytes
00:18:04
Esto sirve
00:18:06
Para sustancialmente
00:18:09
Poder leer byte a byte un fichero
00:18:11
Sin interpretarlo como
00:18:13
Carácteres, sin interpretarlo como
00:18:15
Objetos, sin interpretarlo
00:18:17
No lo interpreto
00:18:18
Voy a pillar un byte y lo leo
00:18:20
Voy a pillar otro byte
00:18:22
Está claro que yo a nivel de Java
00:18:23
Puedo leerme todos los bytes que quiero
00:18:27
Y luego esos bytes
00:18:29
Castearlos, transformarlos en otra cosa
00:18:30
¿Vale? Eso se puede hacer
00:18:33
Pero aquí estoy trabajando solo con bytes
00:18:35
¿Para qué puede servir cosas así?
00:18:38
Por ejemplo, cuando yo quiero copiar un fichero
00:18:41
Y este fichero no es un fichero de texto
00:18:44
Yo tengo un fichero ejecutable, lo quiero copiar
00:18:46
Entonces quiero leer este fichero ejecutable y escribirlo en otro lado
00:18:49
Pues para leerlo, como es un fichero ejecutable
00:18:53
¿Habéis abierto alguna vez un fichero ejecutable con un lector de texto?
00:18:57
No se entiende
00:19:05
Porque son bytes
00:19:06
Y el fichero de editor de texto
00:19:07
Intenta interpretarlo como caracteres
00:19:10
Pero no son caracteres, son bytes
00:19:13
Y por lo tanto no se ve nada
00:19:14
Pues lo mismo
00:19:16
En ficheros como el ejeutable por ejemplo
00:19:17
Si lo tengo que leer
00:19:20
Pues lo mejor es leerlos byte a byte
00:19:22
Porque no me representan caracteres
00:19:24
No me representan objetos, no me representan nada
00:19:26
Si quiero recuperar un mapa
00:19:28
Y se abre y solamente se ven los caracteres
00:19:29
¿Puedes hacer cosas para que
00:19:36
Es difícil, pero allí ya es otra cosa
00:19:38
Allí es porque un Word
00:19:41
En realidad por debajo es un lenguaje de marcas
00:19:42
¿Vale? Especial, lo habéis estudiado
00:19:45
Es un
00:19:47
What you get is what you see
00:19:47
Tipo de lenguaje de marcas
00:19:50
Tú lo ves, pero por debajo cuando se guarda
00:19:52
Le añade toda la marca que quiera él
00:19:54
Está claro que si se ha corrompido alguna de estas marcas
00:19:56
Pues como si en un XML
00:19:58
Tú te pones acá a borrar
00:19:59
Farentesis y borrar
00:20:02
Nodos
00:20:03
Y llega un momento que no te entiende
00:20:05
Pero no es
00:20:07
No son caracteres puros
00:20:10
Habría que ver como se guarda
00:20:12
En los pequeños
00:20:14
Vale
00:20:15
Ahora, yo puedo encapsular
00:20:17
Un input stream
00:20:20
Que es, hemos dicho, un canal de comunicación
00:20:21
Byte a byte
00:20:24
Y puedo decir, oye mira, pero yo no quiero leer byte a byte
00:20:25
Yo quiero
00:20:28
Trabajar con ficheros de texto
00:20:29
Vale
00:20:32
Entonces quiero que sostancialmente
00:20:33
Tú me leas como te da la gana
00:20:35
Pero interprétame lo que estás leyendo
00:20:37
Como char
00:20:40
¿Sí? Con el tamaño que incluye
00:20:41
Char y cosas por el estilo
00:20:43
¿Por qué? Porque el fichero de texto
00:20:44
Que yo estoy utilizando
00:20:46
El fichero que estoy utilizando es un fichero de texto
00:20:48
Guardaré allí dentro texto
00:20:50
Y leeré texto
00:20:52
Si estoy seguro de eso
00:20:54
En vez de utilizar un input stream
00:20:56
Voy a utilizar un input stream reader
00:20:58
Cuando está reader
00:21:00
O writer
00:21:02
Lo que estamos haciendo es no trabajar byte a byte
00:21:03
Sino interpretar los bytes como caracteres
00:21:07
Ahora estoy escribiendo caracteres, leyendo caracteres
00:21:11
¿Por qué se hace esto?
00:21:15
Porque sustancialmente esto me da algunas ventajas
00:21:17
Yo aquí, técnicamente, no puedo escribir un string
00:21:20
Puedo decir, hola, escríbemelo en un fichero
00:21:24
Le tengo que este hola transformarlo en un array de bytes
00:21:28
Porque aquí está transformando solo en byte en byte
00:21:32
¿Sí?
00:21:34
Sin embargo, aquí tendré algunos métodos adicionales
00:21:36
Además de los inputStream, porque están relacionados
00:21:40
Pero tendré algunos métodos especiales que me dirán
00:21:43
En vez de leer byte a byte, léeme un carácter
00:21:46
Entonces puedo leer directamente un carácter
00:21:49
O una red de caracteres, en vez de una red de byte
00:21:51
¿Sí?
00:21:54
En particular, cuando nosotros vamos a utilizar los ficheros
00:21:56
No vamos a crear ni input stream
00:22:01
Ni input stream reader
00:22:03
Pero está la clase file input stream
00:22:05
Para estos de aquí
00:22:08
Y file reader
00:22:09
Para estos de aquí
00:22:10
Tened en cuenta que tanto file input stream
00:22:12
Como file reader si se pueden crear
00:22:15
Pueden hacer una new
00:22:17
Una new de input stream reader directamente
00:22:18
De input stream no lo pueden hacer
00:22:20
Estos son para leer en ficheros
00:22:22
Es posible
00:22:27
Hay otros entornos donde se usan
00:22:30
Input stream, output stream
00:22:32
Y cosas por el estilo
00:22:34
Que es por ejemplo la comunicación entre ordenadores
00:22:35
¿Vale?
00:22:38
Si hacéis en segundo de DAM
00:22:40
Programación de procesos
00:22:41
Y servicios
00:22:44
Pues ahí hay una parte de comunicación
00:22:46
En internet
00:22:48
Donde se ven los sockets
00:22:49
Los sockets son canales de comunicación entre dos ordenadores
00:22:51
Para que dos aplicaciones que están en ordenadores distintos
00:22:54
Se hablen entre ellos
00:22:57
Y para mandarse información una a otra
00:22:58
Pues se usan
00:23:00
Input reader o input stream reader
00:23:01
O input stream
00:23:04
¿Vale?
00:23:05
Hasta que ahora no se usará el file input stream
00:23:06
Porque no estoy hablando con ficheros
00:23:09
Estoy hablando con sockets
00:23:12
Con canales de comunicación
00:23:13
Pero la idea es muy parecida
00:23:14
De hecho esto
00:23:17
Si se puede utilizar
00:23:18
Esta de aquí es una evolución
00:23:19
Todavía más
00:23:24
Hacia la abstracción
00:23:25
Del input del file reader
00:23:26
Que llega a ser
00:23:29
Buffered reader
00:23:32
Buffered reader es un reader
00:23:33
Por lo tanto estoy trabajando con carácteres
00:23:35
Que tiene un buffer
00:23:38
Tiene una memoria
00:23:40
Temporal
00:23:41
En que puede almacenar lo que está recibiendo
00:23:43
Entonces mientras un file reader
00:23:46
Te va leyendo carácter por carácter
00:23:48
Y tengo que hacer algo con estos carácteres
00:23:50
El buffered reader
00:23:52
Estos carácteres los lee
00:23:54
Y lo mete en una memoria
00:23:55
Y yo luego puedo acceder a esta memoria
00:23:57
¿Cuál es la ventaja?
00:23:59
Pues que ahora puedo hacer algunas operaciones
00:24:00
Que antes no podía hacer
00:24:03
Por ejemplo, leer una línea
00:24:05
FileReader
00:24:07
No tiene un método
00:24:10
Léeme una línea
00:24:11
Lo que tendré que hacer es
00:24:12
Léeme un carácter, léeme otro carácter
00:24:15
Y cuando encuentre uno de estos carácters
00:24:17
Que he leído, que es el retorno de carros
00:24:20
El intro
00:24:23
Pues entonces allí asumir
00:24:23
Oye, mira, he llegado al final de la línea
00:24:25
¿Vale?
00:24:28
Sin embargo, el BufferedReader
00:24:29
Me proporciona un método para decir
00:24:31
Lea una línea entera
00:24:33
Porque él se está guardando en un buffer
00:24:34
Todo lo que está leyendo
00:24:37
Y entonces luego puede trabajar con este buffer
00:24:38
¿Sí?
00:24:41
Puede trabajar en esta memoria
00:24:42
¿Sí?
00:24:43
¿Se entiende?
00:24:45
Entonces, la idea es simplemente que
00:24:46
Hacen todo lo mismo
00:24:48
Todo lo que puede hacer con un input stream
00:24:49
Lo puede hacer con un BufferedReader
00:24:51
Todo, ¿vale?
00:24:53
Lo que pasa es que el Buffered Reader
00:24:55
Ya me implementa algunas funciones
00:24:57
Más avanzadas
00:24:59
Que a lo mejor me hacen la vida más sencilla
00:25:00
En vez de tener que ir byte a byte leyéndolo
00:25:03
Pues lo que puedo decir es
00:25:05
Léeme una línea entera
00:25:06
Y voy trabajando en mi fichero diciendo
00:25:07
Por ejemplo, en el caso en que haya guardado
00:25:10
Los alumnos como texto
00:25:13
En mi fichero
00:25:15
Pues yo puedo decir que cada línea
00:25:16
Es un objeto
00:25:19
Entonces le digo al Buffered Reader
00:25:20
Léeme una línea, él me da una línea
00:25:22
Y con los datos que están allí
00:25:25
Con un string tokenizer
00:25:27
Cosa por el estilo, lo separo y creo un objeto
00:25:28
Léeme otra línea
00:25:31
Pillo esa línea de allí
00:25:32
La troceo como tengo que trocearla
00:25:34
La interpreto y creo un segundo objeto
00:25:36
Etcétera, etcétera
00:25:39
Sostancialmente están aquí
00:25:40
Para mejorar
00:25:42
Nuestra calidad de vida
00:25:44
Trabajar con input stream
00:25:46
Es más a bajo nivel
00:25:49
Más complejo
00:25:51
Pero más tienes tú el control
00:25:53
De lo que está pasando
00:25:56
Yendo hacia el Buffered Reader
00:25:57
Es más fácil de utilizar
00:25:59
Me tengo que olvidar
00:26:01
De varias cosas que hacía aquí
00:26:04
Me puedo olvidar tranquilamente
00:26:05
Pero tengo menos control
00:26:07
No voy leyendo carácter por carácter
00:26:09
Voy leyendo frase por frase
00:26:12
O lo que sea
00:26:14
¿Sí? Entonces
00:26:15
Normalmente nosotros tendremos a usar Buffered Reader
00:26:17
Nosotros
00:26:20
Para simplificarnos la vida, tendemos a ir a cosas más genéricas
00:26:21
Entonces vamos a ver un ejemplo de una lectura de un archivo de texto
00:26:28
Imaginaos que yo tengo un archivo de texto, pues ¿cómo lo hago?
00:26:32
Aquí se usan FileReader y BufferedReader
00:26:36
Creo un FileReader y un BufferedReader
00:26:40
Try y catch
00:26:46
Muchas de estas cosas
00:26:48
Tienen a que ver
00:26:50
O pueden lanzar
00:26:52
IO exception
00:26:54
Input output exception
00:26:55
Los estudiamos cuando vimos las excepciones
00:26:57
Porque vimos que había una categoría
00:27:00
Que eran las excepciones
00:27:02
Los problemas que pueden surgir en input output
00:27:04
Como aquí estamos trabajando de eso
00:27:06
De escribir y leer de un fichero
00:27:08
Pues aquí salen un montón de excepciones
00:27:10
De este tipo
00:27:13
¿Vale?
00:27:13
Os recuerdo que hacer una catch de Exception E
00:27:14
Como en el ejemplo aquí
00:27:17
Pues es desaconsejado
00:27:18
¿Vale?
00:27:21
Si yo me estoy focalizando en otra cosa
00:27:23
Pues hago esta de aquí para hacer mis pruebas
00:27:26
Pero en un programa serio
00:27:29
Pues aquí debería tener varios catch
00:27:31
Que si ha pasado esto, hace esto
00:27:32
Si has hecho esta otra cosa, vas a otra cosa
00:27:35
Tanto cuando haremos ejemplos veremos alguno
00:27:37
Y volveremos a ver
00:27:39
Entonces, ¿qué hago?
00:27:40
Pues, el file reader me puede crear un nuevo file reader de un cierto fichero, ¿vale?
00:27:42
Ruta archivo sería un fichero
00:27:51
Eh, nota
00:27:53
Puedo hacer dos formas para identificar mi archivo
00:27:55
Con rutas absolutas o rutas relativas
00:28:00
¿Sabéis qué son rutas absolutas o relativas?
00:28:04
¿Habéis trabajado con ellos?
00:28:08
Por lo tanto, no vuelvo a deciros
00:28:09
¿Vale?
00:28:11
La ruta relativa es desde la carpeta del programa, del proce, del, del, proyecto, ¿vale?
00:28:12
La carpeta del proyecto donde está search, donde está bin, pues allí es donde se guardan los ficheros.
00:28:27
Si yo creo un nuevo fichero, se crea allí, por defecto, ¿vale?
00:28:33
Si luego lo quiero guardar en otro lado
00:28:36
O le pongo una ruta
00:28:39
¿Cómo se dice?
00:28:40
Absoluta, desaconsejado
00:28:45
Poner rutas absolutas
00:28:47
Es siempre desaconsejado porque si cambias
00:28:48
De ordenador ya no te funciona
00:28:50
¿Vale? Pero puedo tener una ruta relativa
00:28:52
Para decir, oye mira, desde
00:28:55
La carpeta del proyecto
00:28:56
Pues entra en otra carpeta, salga
00:28:58
De esa carpeta o vete a buscar
00:29:00
¿Sí?
00:29:02
Vale, el Buffered Reader
00:29:03
Pilla como parámetro
00:29:07
Un File Reader
00:29:09
Entonces, para poder crear un Buffered Reader
00:29:10
En realidad un Input Stream Reader
00:29:13
Que esto es un Input Stream
00:29:15
Pero bueno, le tengo que pasar
00:29:17
Sostancialmente es como si estoy encapsulando
00:29:19
Esto es el que me permite leer
00:29:21
Carácteres, vale, fenomenal
00:29:23
Y esto lo encapsulo
00:29:25
En una cosa más
00:29:27
Poderosa, entre comillas, que me permiten
00:29:29
Leer carácteres y guardarlas
00:29:31
en una memoria para luego poder leer una línea
00:29:33
entera o hacer cosas un poquito más complejas
00:29:35
¿vale? entonces
00:29:37
esto es como
00:29:39
empezaría ¿vale? entonces
00:29:40
creo una línea, una string línea
00:29:42
una variable que me guardará una línea
00:29:45
y luego empiezo con un while
00:29:46
¿vale? ¿qué hace este while?
00:29:49
me dice, mientras
00:29:51
que tú haces
00:29:53
un br.redline
00:29:55
bufferedreader.redline
00:29:57
esto lee una línea
00:29:59
Esta línea la vas a guardar dentro de la variable línea
00:30:01
Y si esta cosa no es null
00:30:04
Es decir, si has leído algo
00:30:07
Si tú has hecho un readline
00:30:09
Y has leído algo
00:30:11
¿Vale?
00:30:13
Quiere decir que has leído una línea
00:30:13
Pues esa línea imprimirá en pantalla
00:30:15
¿Vale?
00:30:17
Este programa aquí
00:30:20
Me pilla lo que hay dentro de root archivo
00:30:21
Y me lo imprime en pantalla
00:30:25
Más o menos
00:30:26
¿Dudas?
00:30:31
Y con esto, antes de la escritura, nos paramos.
00:30:35
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 15
- Fecha:
- 20 de mayo de 2024 - 13:30
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 30′ 51″
- Relación de aspecto:
- 4:3 Hasta 2009 fue el estándar utilizado en la televisión PAL; muchas pantallas de ordenador y televisores usan este estándar, erróneamente llamado cuadrado, cuando en la realidad es rectangular o wide.
- Resolución:
- 960x720 píxeles
- Tamaño:
- 93.14 MBytes