1 00:00:00,500 --> 00:00:06,299 Vale, vamos a grabar la clase, por lo tanto si habláis me dais el consentimiento para que grabe vuestra voz, ¿vale? 2 00:00:06,320 --> 00:00:07,639 Para hacer preguntas y cosas por esto. 3 00:00:09,220 --> 00:00:22,500 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? 4 00:00:24,019 --> 00:00:30,480 Nosotros sabemos que una parte de nuestros programas ya se mantienen entre ejecuciones, ¿vale? 5 00:00:30,500 --> 00:00:32,539 Que son el código, sustancialmente 6 00:00:32,539 --> 00:00:37,219 El código se almacena y ha compilado en dispositivo de almacenamiento como disco duro, ¿vale? 7 00:00:37,219 --> 00:00:38,979 Vosotros sabéis que vosotros escribís el código 8 00:00:38,979 --> 00:00:44,280 Luego, al darle al Java C, sustancialmente, creáis bytecode 9 00:00:44,280 --> 00:00:45,979 Que serían los puntos class 10 00:00:45,979 --> 00:00:52,600 Los puntos class en vuestros proyectos se guardan en la carpeta bin, ¿vale? 11 00:00:52,600 --> 00:00:55,299 La carpeta src contiene punto java 12 00:00:55,299 --> 00:00:58,840 La carpeta bin contiene los puntos class 13 00:00:58,840 --> 00:01:03,539 Y cuando se ejecuta, los puntos Java y el search no se miran 14 00:01:03,539 --> 00:01:05,879 Todo se hace en BIM, ¿vale? 15 00:01:05,939 --> 00:01:06,959 En la parte compilada 16 00:01:06,959 --> 00:01:10,659 Porque la JavaScript Machine entiende los puntos class, ¿vale? 17 00:01:11,159 --> 00:01:14,260 Sin embargo, el resto de los datos 18 00:01:14,260 --> 00:01:17,219 Como son los objetos, las variables, etc. 19 00:01:17,620 --> 00:01:20,420 Eso no se guarda en el disco duro 20 00:01:20,420 --> 00:01:23,480 Eso se guarda en RAM al momento en que se ejecuta 21 00:01:23,480 --> 00:01:27,359 Por lo tanto, existe mientras que la JavaScript Machine está funcionando 22 00:01:27,359 --> 00:01:29,680 Y mientras que yo estoy utilizando mi programa 23 00:01:29,680 --> 00:01:31,379 Cuando la director machine se apaga 24 00:01:31,379 --> 00:01:32,920 Cuando el programa se acaba 25 00:01:32,920 --> 00:01:35,760 Todos estos datos se pierden 26 00:01:35,760 --> 00:01:38,260 ¿Vale? 27 00:01:40,019 --> 00:01:41,980 Justo para que os suene 28 00:01:41,980 --> 00:01:42,599 ¿Vale? 29 00:01:42,719 --> 00:01:45,480 Los valores de atributos y objetos 30 00:01:45,480 --> 00:01:47,140 No existen en el disco 31 00:01:47,140 --> 00:01:50,040 Cuando se ejecuta una new 32 00:01:50,040 --> 00:01:50,840 ¿Vale? 33 00:01:50,939 --> 00:01:52,480 Cuando se hace un nuevo objeto 34 00:01:52,480 --> 00:01:55,819 Se reserva un espacio en la memoria RAM 35 00:01:55,819 --> 00:02:00,700 Un espacio dentro del proceso que es todo el programa 36 00:02:00,700 --> 00:02:04,540 Hay un espacio particular para los objetos que se llama el heap 37 00:02:04,540 --> 00:02:09,639 Esta es la parte de la memoria donde se guardan los objetos 38 00:02:09,639 --> 00:02:12,719 Es una zona especial donde se guardan los objetos 39 00:02:12,719 --> 00:02:17,400 Sin embargo, los otros datos como variables locales, los parámetros de entradas 40 00:02:17,400 --> 00:02:19,740 Los parámetros cuando hago una llamada, etc. 41 00:02:20,259 --> 00:02:23,080 No se guardan en este espacio aquí 42 00:02:23,080 --> 00:02:27,900 Si no se guardan en otra sección que es llamada la stack, la pila 43 00:02:27,900 --> 00:02:31,780 Si os acordáis cuando vimos las pilas y cosas por el estilo 44 00:02:31,780 --> 00:02:35,000 Hablamos de la pila de llamadas, de métodos, etc. 45 00:02:36,379 --> 00:02:41,919 Pues esto funciona como pila porque si pensáis a las variables 46 00:02:41,919 --> 00:02:46,000 Y donde existen las variables, el concepto de ámbito de una variable 47 00:02:46,000 --> 00:02:47,099 Lo vimos al principio 48 00:02:47,099 --> 00:02:51,539 Si os acordáis que una variable existe solo dentro del bloque en el que está declarada 49 00:02:51,539 --> 00:03:10,759 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? 50 00:03:10,759 --> 00:03:13,020 Por eso son locales a ese blog 51 00:03:13,020 --> 00:03:15,900 Entonces, heap y stack son 52 00:03:15,900 --> 00:03:19,699 Heap es como montón en español 53 00:03:19,699 --> 00:03:24,139 Son simplemente dos formas de almacenar los datos 54 00:03:24,139 --> 00:03:25,300 ¿Vale? Por eso se llaman así 55 00:03:25,300 --> 00:03:27,840 El stack lo conocemos, la pila 56 00:03:27,840 --> 00:03:30,840 El heap no lo conocemos exactamente como funciona 57 00:03:30,840 --> 00:03:34,699 Pero es, digamos, el tipo de colección 58 00:03:34,699 --> 00:03:38,759 El tipo de estructura que se utiliza para almacenar 59 00:03:38,759 --> 00:03:40,900 Los objetos 60 00:03:40,900 --> 00:03:42,960 Vale 61 00:03:42,960 --> 00:03:44,539 Cuando finaliza el programa 62 00:03:44,539 --> 00:03:47,240 Los datos, los atributos 63 00:03:47,240 --> 00:03:49,379 Etcétera, etcétera, no persisten 64 00:03:49,379 --> 00:03:49,819 ¿Vale? 65 00:03:50,560 --> 00:03:52,860 Y los lenguajes orientados a objetos 66 00:03:52,860 --> 00:03:55,280 No suelen prever ningún 67 00:03:55,280 --> 00:03:57,219 Mecanismo automático 68 00:03:57,219 --> 00:03:58,939 Para guardar estos objetos 69 00:03:58,939 --> 00:04:01,120 De forma persistente 70 00:04:01,120 --> 00:04:03,620 O sea, todos los lenguajes orientados a objetos 71 00:04:03,620 --> 00:04:05,479 Por defecto, si yo no hago nada 72 00:04:05,479 --> 00:04:06,860 Si yo no lo hago explícitamente 73 00:04:06,860 --> 00:04:09,860 Lo que hacen es perderán todos los datos cuando se apaga 74 00:04:09,860 --> 00:04:10,159 ¿Vale? 75 00:04:10,240 --> 00:04:13,539 Pero prácticamente todos los lenguajes de orientado a objetos 76 00:04:13,539 --> 00:04:18,360 Tendrán sus mecanismos para intentar guardar estos ficheros 77 00:04:18,360 --> 00:04:20,879 Y para que persistan de alguna forma 78 00:04:20,879 --> 00:04:21,360 ¿Vale? 79 00:04:21,980 --> 00:04:26,600 Entonces, ¿cómo vamos a almacenar los datos? 80 00:04:26,779 --> 00:04:26,959 ¿Vale? 81 00:04:26,980 --> 00:04:32,220 Para conservar estos datos tenemos que trabajar con un sistema de almacenamiento 82 00:04:32,220 --> 00:04:37,300 Que no sea como la RAM, que cuando apaga, cuando ya pierde la corriente se va 83 00:04:37,300 --> 00:04:41,300 Sino algo que pueda persistir, como por ejemplo un disco duro, ¿vale? 84 00:04:41,779 --> 00:04:45,500 ¿Cómo se hace esto? Pues, por ejemplo, se puede crear un archivo 85 00:04:45,500 --> 00:04:47,899 Que es lo que aprenderemos a hacer hoy, ¿vale? 86 00:04:48,399 --> 00:04:52,980 Nosotros podemos crear un fichero, dentro de este fichero, que es un trozo de memoria 87 00:04:52,980 --> 00:04:55,500 Al fin y al cabo, podemos meter datos, ¿vale? 88 00:04:56,180 --> 00:05:00,500 Los datos que metemos aquí pueden ser RAW, crudos 89 00:05:00,500 --> 00:05:02,519 O sea, los datos tal y como los tengo 90 00:05:02,519 --> 00:05:05,259 Pues los escribo allí, en bits y bytes 91 00:05:05,259 --> 00:05:05,740 ¿Vale? 92 00:05:06,259 --> 00:05:08,220 O en modalidad texto 93 00:05:08,220 --> 00:05:10,500 ¿Vale? Si yo lo que estoy utilizando es guardar 94 00:05:10,500 --> 00:05:12,259 Información que son string 95 00:05:12,259 --> 00:05:13,399 Que son texto 96 00:05:13,399 --> 00:05:16,180 O yo tengo otros tipos de datos 97 00:05:16,180 --> 00:05:18,600 Pero los puedo representar 98 00:05:18,600 --> 00:05:19,600 Como un string 99 00:05:19,600 --> 00:05:23,160 Pues entonces lo puedo guardar en modalidad texto 100 00:05:23,160 --> 00:05:23,660 ¿Vale? 101 00:05:23,980 --> 00:05:25,860 Entonces en vez de guardarlo byte a byte 102 00:05:25,860 --> 00:05:28,939 En un cierto sentido lo estoy guardando en grupos de bytes 103 00:05:28,939 --> 00:05:30,920 Que luego se corresponderán a carácteres 104 00:05:30,920 --> 00:05:32,740 Y serán secuencias de carácteres 105 00:05:32,740 --> 00:05:35,720 ¿Os acordáis algún ejercicio 106 00:05:35,720 --> 00:05:37,060 Que hemos hecho en nuestro 107 00:05:37,060 --> 00:05:39,000 En el curso 108 00:05:39,000 --> 00:05:40,560 En el que se decía 109 00:05:40,560 --> 00:05:42,439 Oye, mira, tenéis que crear, no sé 110 00:05:42,439 --> 00:05:43,980 Tres alumnos, cinco alumnos 111 00:05:43,980 --> 00:05:46,259 Te voy a dar yo un string 112 00:05:46,259 --> 00:05:47,240 ¿Vale? 113 00:05:47,379 --> 00:05:49,759 Que pone nombre, coma 114 00:05:49,759 --> 00:05:53,199 O sea, Estefano, coma 115 00:05:53,199 --> 00:05:55,139 Cuarenta, coma 116 00:05:55,139 --> 00:05:56,740 Una dirección, ¿vale? 117 00:05:56,800 --> 00:05:57,519 Punto y coma 118 00:05:57,519 --> 00:05:59,939 Y luego estará paco, coma 119 00:05:59,939 --> 00:06:01,800 37, coma 120 00:06:01,800 --> 00:06:03,199 Y otra dirección, etc, etc 121 00:06:03,199 --> 00:06:05,560 Y esto era una representación 122 00:06:05,560 --> 00:06:06,779 De tipo texto 123 00:06:06,779 --> 00:06:08,540 De los objetos 124 00:06:08,540 --> 00:06:11,420 ¿Vale? Entonces se puede hacer 125 00:06:11,420 --> 00:06:13,439 Yo mis objetos los puedo pillar 126 00:06:13,439 --> 00:06:15,620 Decir, vale, cada objeto se representará como 127 00:06:15,620 --> 00:06:18,079 Concatenando de forma string 128 00:06:18,079 --> 00:06:19,160 Una cosa a otra 129 00:06:19,160 --> 00:06:21,899 Y eso me lo guardo como un line text 130 00:06:21,899 --> 00:06:23,779 Está claro que aquí se podría complicar 131 00:06:23,779 --> 00:06:24,000 Que 132 00:06:24,000 --> 00:06:28,660 Pero 133 00:06:28,660 --> 00:06:30,240 En qué sentido 134 00:06:30,240 --> 00:06:33,660 Eso da igual 135 00:06:33,660 --> 00:06:34,819 Eso lo decides tú 136 00:06:34,819 --> 00:06:35,879 Puedes no poner espacio 137 00:06:35,879 --> 00:06:38,939 Puedes ponerlo, puedes poner un asterisco 138 00:06:38,939 --> 00:06:40,800 Eso lo decides tú 139 00:06:40,800 --> 00:06:43,139 Como a ser formado en base a tus necesidades 140 00:06:43,139 --> 00:06:45,220 Mi pregunta es más 141 00:06:45,220 --> 00:06:47,120 A alto nivel, más abstracta 142 00:06:47,120 --> 00:06:49,300 O sea, cuando yo tengo un objeto 143 00:06:49,300 --> 00:06:50,319 Persona 144 00:06:50,319 --> 00:06:52,560 Y lo quiero escribir en un fichero 145 00:06:52,560 --> 00:06:53,939 Como una línea de texto 146 00:06:53,939 --> 00:06:56,899 Si tengo el nombre de la persona 147 00:06:56,899 --> 00:06:58,800 Fácil, es un string, lo pongo 148 00:06:58,800 --> 00:07:01,060 Si tengo la edad de una persona, pues es un int 149 00:07:01,060 --> 00:07:02,819 Vale, pero lo puedo convertir 150 00:07:02,819 --> 00:07:04,959 A un string, poniéndole delante 151 00:07:04,959 --> 00:07:07,139 Dos comillas, y lo puedo escribir tal y cual 152 00:07:07,139 --> 00:07:08,680 Me tengo que acordar que 153 00:07:08,680 --> 00:07:11,199 Cuando lo volveré a leer, ese es un string 154 00:07:11,199 --> 00:07:12,899 Y yo tendré que hacer un integer.partseint 155 00:07:13,620 --> 00:07:14,680 Para revocarlo 156 00:07:14,680 --> 00:07:15,420 Vale, fenomenal 157 00:07:15,420 --> 00:07:17,560 ¿Dónde se puede complicar las cosas? 158 00:07:27,379 --> 00:07:28,519 Exacto, cuando 159 00:07:28,519 --> 00:07:31,060 Mis atributos no son primitivos 160 00:07:31,060 --> 00:07:44,540 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. 161 00:07:44,759 --> 00:08:00,620 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? 162 00:08:01,060 --> 00:08:16,160 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. 163 00:08:16,160 --> 00:08:30,019 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. 164 00:08:30,019 --> 00:08:32,440 Ya, pero tú 165 00:08:32,440 --> 00:08:34,980 ¿Qué haces? ¿Lo escribes en cada alumno? 166 00:08:35,080 --> 00:08:35,960 ¿Escribes toda la lista? 167 00:08:36,679 --> 00:08:36,899 No 168 00:08:36,899 --> 00:08:41,179 ¿Cómo referencias un objeto 169 00:08:41,179 --> 00:08:43,480 Pasándolo a string? 170 00:08:44,360 --> 00:08:45,259 No es fácil 171 00:08:45,259 --> 00:08:47,139 No es fácil 172 00:08:47,139 --> 00:08:47,820 ¿Vale? 173 00:08:47,820 --> 00:08:49,440 Porque la referencia que te da 174 00:08:49,440 --> 00:08:50,200 Es dinámica 175 00:08:50,200 --> 00:08:53,120 Es que la puedes reutilizar más adelante 176 00:08:53,120 --> 00:08:56,000 Entonces, esto complica un poco las cosas 177 00:08:56,000 --> 00:08:57,500 No siempre se puede utilizar 178 00:08:57,500 --> 00:08:58,700 Este mecanismo 179 00:08:58,700 --> 00:09:00,379 Hay mecanismos más avanzados 180 00:09:00,379 --> 00:09:03,000 Otro mecanismo 181 00:09:03,000 --> 00:09:04,519 Que podemos utilizar es 182 00:09:04,519 --> 00:09:06,159 Pidiéndole a la Java Virtual Machine 183 00:09:06,159 --> 00:09:07,399 Oye mira hazlo tú 184 00:09:07,399 --> 00:09:09,700 No me voy yo 185 00:09:09,700 --> 00:09:11,980 A liar con los datos 186 00:09:11,980 --> 00:09:13,659 Transformándolo a texto 187 00:09:13,659 --> 00:09:16,139 Representando mis objetos 188 00:09:16,139 --> 00:09:17,940 Como formato textual 189 00:09:17,940 --> 00:09:19,879 Si no le digo a la Java Virtual Machine 190 00:09:19,879 --> 00:09:21,500 Oye mira tengo este objeto 191 00:09:21,500 --> 00:09:23,159 Guárdamelo en algún lado 192 00:09:23,159 --> 00:09:24,700 Una vez que me lo has guardado allí 193 00:09:24,700 --> 00:09:26,559 Cuando lo quiero te voy a pedir 194 00:09:26,559 --> 00:09:27,440 Oye dámelo otra vez 195 00:09:27,440 --> 00:09:32,259 ¿Vale? Esto se suele hacer serializando el objeto 196 00:09:32,259 --> 00:09:38,580 ¿Vale? Existe una forma relativamente fácil para decirle que este objeto es serializable 197 00:09:38,580 --> 00:09:41,759 Serializable es exactamente lo que se puede escribir en serie 198 00:09:41,759 --> 00:09:44,000 Se puede transformar en una secuencia de bytes 199 00:09:44,000 --> 00:09:46,919 Y una vez que se pueda transformar en una secuencia de bytes 200 00:09:46,919 --> 00:09:54,159 Yo esto lo puedo dar a una clase, digamos así, ahora veremos cuál es 201 00:09:54,159 --> 00:09:55,500 Que tiene unos métodos 202 00:09:55,500 --> 00:09:56,500 Y estos métodos lo puede decir 203 00:09:56,500 --> 00:09:58,720 Escribe esta serie de bytes 204 00:09:58,720 --> 00:10:01,200 En un fichero 205 00:10:01,200 --> 00:10:02,519 Y él lo escribirá 206 00:10:02,519 --> 00:10:03,480 Además 207 00:10:03,480 --> 00:10:07,580 Cuando un objeto es serializable 208 00:10:07,580 --> 00:10:10,700 Si contiene solo objetos serializables 209 00:10:10,700 --> 00:10:12,559 Pues en automático 210 00:10:12,559 --> 00:10:14,220 La Java Store Machine se da cuenta 211 00:10:14,220 --> 00:10:15,539 De las varias referencias 212 00:10:15,539 --> 00:10:17,500 Y escribe lo que tiene que escribir 213 00:10:17,500 --> 00:10:19,539 Para que luego más o menos funcione 214 00:10:19,539 --> 00:10:20,759 Aún así 215 00:10:20,759 --> 00:10:22,279 No es 216 00:10:22,279 --> 00:10:25,820 Súper sencillo 217 00:10:25,820 --> 00:10:26,139 ¿Vale? 218 00:10:26,279 --> 00:10:28,679 Hay que saber lo que estamos haciendo 219 00:10:28,679 --> 00:10:30,759 Porque, sobre todo 220 00:10:30,759 --> 00:10:32,039 O sea, para... 221 00:10:32,039 --> 00:10:34,460 Yo tengo la clase alumno con sus datos 222 00:10:34,460 --> 00:10:36,320 Y la guardo, guardo un objeto 223 00:10:36,320 --> 00:10:37,779 Y lo vuelvo a pillar 224 00:10:37,779 --> 00:10:38,799 Pues eso es muy fácil 225 00:10:38,799 --> 00:10:42,500 Las cosas se complican cuando hay muchos objetos 226 00:10:42,500 --> 00:10:45,500 Que se referencian a objetos compartidos 227 00:10:45,500 --> 00:10:47,120 Y que haya esto... 228 00:10:47,120 --> 00:10:48,600 Haya que hacer algo 229 00:10:48,600 --> 00:10:51,779 Para que cuando yo vuelva a cargar estos objetos 230 00:10:51,779 --> 00:10:53,500 Se cargue también el objeto compartido 231 00:10:53,500 --> 00:10:55,460 Y que todos referencien a la misma instancia 232 00:10:55,460 --> 00:10:56,740 Eso se complica 233 00:10:56,740 --> 00:10:57,679 ¿Vale? 234 00:10:57,899 --> 00:11:00,580 Y si Java no lo entiende 235 00:11:00,580 --> 00:11:01,919 No lo consigue hacer 236 00:11:01,919 --> 00:11:03,460 Pues tendré que ser yo 237 00:11:03,460 --> 00:11:05,539 En mi fase de leer el fichero 238 00:11:05,539 --> 00:11:06,659 Y recuperar los datos 239 00:11:06,659 --> 00:11:08,059 Que haga las cosas bien 240 00:11:08,059 --> 00:11:09,940 Lo habré guardado de tal forma 241 00:11:09,940 --> 00:11:12,879 Que cuando luego lo vuelva a recargar 242 00:11:12,879 --> 00:11:15,360 Pues modifique lo que tenga que modificar 243 00:11:15,360 --> 00:11:16,639 Para que funcione 244 00:11:16,639 --> 00:11:16,820 ¿Sí? 245 00:11:17,399 --> 00:11:18,539 Más de eso más adelante 246 00:11:18,539 --> 00:11:20,539 La tercera forma 247 00:11:20,539 --> 00:11:22,320 Es utilizar una base de datos 248 00:11:22,320 --> 00:11:22,860 ¿Vale? 249 00:11:24,000 --> 00:11:25,980 Para poder utilizar una base de datos 250 00:11:25,980 --> 00:11:28,399 Que no es sencillo, tengo que encontrar algo 251 00:11:28,399 --> 00:11:30,179 Que me haga un mapeado 252 00:11:30,179 --> 00:11:32,740 Entre mis objetos y las tablas de la base de datos 253 00:11:32,740 --> 00:11:34,019 Que se llama un ORM 254 00:11:34,019 --> 00:11:35,960 Y utilizando estas dos cosas 255 00:11:35,960 --> 00:11:38,840 Pues es una versión 256 00:11:38,840 --> 00:11:41,139 Un poco más eficiente 257 00:11:41,139 --> 00:11:42,399 Y un poco más 258 00:11:42,399 --> 00:11:43,879 Elegante 259 00:11:43,879 --> 00:11:45,299 De hacer esta cosa 260 00:11:45,299 --> 00:11:46,200 Está claro que 261 00:11:46,200 --> 00:11:49,299 Si mi programa es un programa muy sencillo 262 00:11:49,299 --> 00:11:52,320 Montar un sistema de un gestor de base de datos 263 00:11:52,320 --> 00:11:53,700 Con un ORM y todo esto 264 00:11:53,700 --> 00:11:55,740 Pues me lleva más tiempo 265 00:11:55,740 --> 00:11:57,759 Que programar mi programa 266 00:11:57,759 --> 00:12:00,539 Lo que estamos haciendo nosotros es programar cosas muy sencillas 267 00:12:00,539 --> 00:12:01,940 Y por lo tanto esto 268 00:12:01,940 --> 00:12:04,139 Por ahora nos interesa poco o nada 269 00:12:04,139 --> 00:12:04,720 ¿Vale? 270 00:12:05,159 --> 00:12:07,779 Está claro también que en un proyecto verdadero 271 00:12:07,779 --> 00:12:10,519 Allá afuera, un sistema que tiene que funcionar 272 00:12:10,519 --> 00:12:11,440 Entre producción 273 00:12:11,440 --> 00:12:14,580 Pues probablemente esto es lo que queremos 274 00:12:14,580 --> 00:12:15,600 También porque 275 00:12:15,600 --> 00:12:18,600 Si hay muchos datos con los que trabajamos 276 00:12:18,600 --> 00:12:19,360 Y cosas por el estilo 277 00:12:19,360 --> 00:12:21,440 Trabajar con archivos es lento 278 00:12:21,440 --> 00:12:24,100 Siempre trabajar con archivos es una cosa lenta 279 00:12:24,100 --> 00:12:26,240 Los sistemas gestores de base de datos 280 00:12:26,240 --> 00:12:28,899 Tienen todos los mecanismos que habéis aprendido 281 00:12:28,899 --> 00:12:30,539 De indicización 282 00:12:30,539 --> 00:12:31,860 De optimización 283 00:12:31,860 --> 00:12:34,519 Para que el acceso a los datos sea mucho más rápido 284 00:12:34,519 --> 00:12:37,220 Con respecto a leer un archivo entero 285 00:12:37,220 --> 00:12:38,820 Y buscar allí algo 286 00:12:38,820 --> 00:12:40,779 Para que no se 287 00:12:40,779 --> 00:12:41,200 ¿Vale? 288 00:12:42,679 --> 00:12:44,679 Eso quiere decir que los archivos no se usan 289 00:12:44,679 --> 00:12:46,259 Los archivos siguen allí 290 00:12:46,259 --> 00:12:47,799 Son la base 291 00:12:47,799 --> 00:12:49,440 Muchos datos 292 00:12:49,440 --> 00:12:52,059 Que hay que cargar 293 00:12:52,059 --> 00:12:54,200 O que te interesan todos 294 00:12:54,200 --> 00:12:55,240 Que no hay tanto que buscar 295 00:12:55,240 --> 00:12:57,779 Sino que son datos que tienen que almacenar 296 00:12:57,779 --> 00:12:59,840 Y que cada vez que arrancas tu programa 297 00:12:59,840 --> 00:13:01,039 Los tienes que cargar en memoria 298 00:13:01,039 --> 00:13:03,120 Pues un archivo es una solución 299 00:13:03,120 --> 00:13:04,840 Aceptable 300 00:13:04,840 --> 00:13:06,259 ¿Sí? 301 00:13:06,740 --> 00:13:10,120 Entonces, cuando se habla de almacenamiento de datos 302 00:13:10,120 --> 00:13:11,500 Tres opciones 303 00:13:11,500 --> 00:13:14,100 O uso archivos directamente 304 00:13:14,100 --> 00:13:15,419 Y soy yo que le digo 305 00:13:15,419 --> 00:13:17,399 Cómo se escribe y cómo se lee 306 00:13:17,399 --> 00:13:20,059 Tanto en modalidad directamente byte a byte 307 00:13:20,059 --> 00:13:24,399 O en modalidad de cadenas de texto y mensajes 308 00:13:24,399 --> 00:13:27,580 O uso la Java Vector Machine 309 00:13:27,580 --> 00:13:29,580 Lo que me proporciona la Java Vector Machine 310 00:13:29,580 --> 00:13:32,379 Para que sea ella que decida cómo almacenar los datos 311 00:13:32,379 --> 00:13:35,460 Y ahí yo pierdo el control de cómo se almacena este objeto 312 00:13:35,460 --> 00:13:38,820 Es ella que sabe almacenarlo y recuperarlo 313 00:13:38,820 --> 00:13:41,279 O utilizo una base de datos 314 00:13:41,279 --> 00:13:42,620 Estas son las tres opciones 315 00:13:42,620 --> 00:13:47,159 Para utilizar los ficheros 316 00:13:47,159 --> 00:13:50,360 Necesitamos una clase que represente los ficheros 317 00:13:50,360 --> 00:13:51,720 Fijaos, esto no es 318 00:13:51,720 --> 00:13:54,559 File, la clase file 319 00:13:54,559 --> 00:13:56,620 De Java no es un fichero 320 00:13:56,620 --> 00:13:58,440 Es un manejador 321 00:13:58,440 --> 00:13:59,100 De fichero 322 00:13:59,100 --> 00:14:01,159 Representa un fichero 323 00:14:01,159 --> 00:14:04,039 Es una abstracción de un fichero 324 00:14:04,039 --> 00:14:05,279 Es 325 00:14:05,279 --> 00:14:08,080 El handler, el manejador 326 00:14:08,080 --> 00:14:10,139 Que yo puedo tener dentro de mi programa 327 00:14:10,139 --> 00:14:12,139 Para luego trabajar con 328 00:14:12,139 --> 00:14:13,539 El sistema 329 00:14:13,539 --> 00:14:15,879 Con el sistema de ficheros 330 00:14:15,879 --> 00:14:17,019 Y los ficheros de verdad 331 00:14:17,019 --> 00:14:19,279 Tened en cuenta que aquí hay varios pasos 332 00:14:19,279 --> 00:14:20,679 Si yo estoy en un programa 333 00:14:20,679 --> 00:14:22,720 Mi programa está escrito en Java 334 00:14:22,720 --> 00:14:24,279 Y está ahí en un ficherito 335 00:14:24,279 --> 00:14:25,860 Está traducido al class 336 00:14:25,860 --> 00:14:28,799 Nosotros no trabajamos 337 00:14:28,799 --> 00:14:30,580 Directamente con ficheros nunca 338 00:14:30,580 --> 00:14:32,899 Lo que hay en el medio 339 00:14:32,899 --> 00:14:34,600 Hay al menos dos pasos 340 00:14:34,600 --> 00:14:36,519 Por un lado está la Java Virtual Machine 341 00:14:36,519 --> 00:14:38,580 Que interpreta mis comandos 342 00:14:38,580 --> 00:14:40,399 Y que entonces puede ya hacer algo 343 00:14:40,399 --> 00:14:42,700 Allí ella, y luego la Java Virtual Machine 344 00:14:42,700 --> 00:14:44,659 Para poder trabajar sobre los ficheros 345 00:14:44,659 --> 00:14:46,259 No puede ir a trabajar directamente 346 00:14:46,259 --> 00:14:48,740 Necesita una interfaz 347 00:14:48,740 --> 00:14:50,480 Con lo que es el sistema operativo 348 00:14:50,480 --> 00:14:52,899 ¿Vale? Entonces, la implementación 349 00:14:52,899 --> 00:14:54,559 De la Java Vector Machine, implementará 350 00:14:54,559 --> 00:14:56,460 Las llamadas de sistemas 351 00:14:56,460 --> 00:14:58,279 Al sistema operativo correctas 352 00:14:58,279 --> 00:15:00,820 Porque la Java Vector Machine, sabéis que si está instalada 353 00:15:00,820 --> 00:15:02,679 En Windows, o en Linux, o en 354 00:15:02,679 --> 00:15:04,200 OSX, o lo que sea 355 00:15:04,200 --> 00:15:06,299 Por lo tanto, al instalar 356 00:15:06,299 --> 00:15:08,580 La Java Vector Machine, ella tendrá 357 00:15:08,580 --> 00:15:10,899 Los mecanismos dentro para poder 358 00:15:10,899 --> 00:15:12,759 Solicitar al sistema operativo 359 00:15:12,759 --> 00:15:15,019 Oye, píllame un trozo 360 00:15:15,019 --> 00:15:16,519 De memoria, ese trozo de memoria 361 00:15:16,519 --> 00:15:18,200 Lo referenciarás con este nombre 362 00:15:18,200 --> 00:15:19,480 Y ahora este sería un fichero 363 00:15:19,480 --> 00:15:20,840 Y yo quiero escribir allí 364 00:15:20,840 --> 00:15:23,120 Entonces hay varios niveles 365 00:15:23,120 --> 00:15:26,600 A nivel nuestro, que es el nivel más abstracto 366 00:15:26,600 --> 00:15:28,480 De todos, nosotros no trabajamos 367 00:15:28,480 --> 00:15:30,220 Directamente, no sabemos si por debajo 368 00:15:30,220 --> 00:15:32,620 Hay un disco duro, si hay un pendrive 369 00:15:32,620 --> 00:15:34,019 Si hay un 370 00:15:34,019 --> 00:15:36,879 Un cd, que se yo 371 00:15:36,879 --> 00:15:38,179 Me da igual 372 00:15:38,179 --> 00:15:39,860 A mi lo que me interesa es 373 00:15:39,860 --> 00:15:41,600 Llamar una entidad file 374 00:15:41,600 --> 00:15:44,000 Y en este file luego podré hacer algo 375 00:15:44,000 --> 00:15:45,840 Como crear un canal de escritura 376 00:15:45,840 --> 00:15:47,559 O crear un canal de lectura 377 00:15:47,559 --> 00:15:49,120 Para poder escribir o leer 378 00:15:49,120 --> 00:15:49,799 ¿Vale? 379 00:15:50,440 --> 00:15:53,240 Entonces la clase File me representa este fichero 380 00:15:53,240 --> 00:15:56,139 Normalmente se le da un nombre 381 00:15:56,139 --> 00:15:56,879 De un archivo 382 00:15:56,879 --> 00:15:57,519 ¿Vale? 383 00:15:58,700 --> 00:16:00,059 Datos.dat 384 00:16:00,059 --> 00:16:02,120 No se que.txt 385 00:16:02,120 --> 00:16:02,679 ¿Vale? 386 00:16:03,100 --> 00:16:05,320 Sabéis que al menos en el mundo de Windows 387 00:16:05,320 --> 00:16:08,720 Las extensiones no sirven prácticamente de nada 388 00:16:08,720 --> 00:16:10,539 La única cosa que sirven 389 00:16:10,539 --> 00:16:12,019 Es para saber con que 390 00:16:12,019 --> 00:16:14,419 Programa se abre en estos 391 00:16:14,419 --> 00:16:16,240 Ficheros 392 00:16:16,240 --> 00:16:18,320 ¿Vale? Entonces si es .docx 393 00:16:18,320 --> 00:16:19,460 Se abrirá con Word 394 00:16:19,460 --> 00:16:21,779 Si es .pdf se abrirá con 395 00:16:21,779 --> 00:16:24,460 Un lector de PDFs y cosas por el estilo 396 00:16:24,460 --> 00:16:25,879 ¿Vale? Entonces 397 00:16:25,879 --> 00:16:28,019 Esto para decir que cuando me invento un nombre 398 00:16:28,019 --> 00:16:30,019 Le tengo que dar una extensión, pero a lo mejor inventaré 399 00:16:30,019 --> 00:16:31,500 La extensión que me da la gana, ¿vale? 400 00:16:33,799 --> 00:16:34,200 Normalmente 401 00:16:34,200 --> 00:16:35,679 A lo mejor nosotros pues 402 00:16:35,679 --> 00:16:37,279 Utilizaremos un .txt 403 00:16:37,279 --> 00:16:39,940 ¿Por qué? Porque luego es fácil ir allí, abrirlo 404 00:16:39,940 --> 00:16:41,740 Con doble clic y ver que hay dentro 405 00:16:41,740 --> 00:16:46,659 Si lo llamo punto algo, pues funciona perfectamente 406 00:16:46,659 --> 00:16:50,679 Pero cuando voy a darle doble clic me dice con qué programa lo tengo que abrir un punto algo 407 00:16:50,679 --> 00:16:56,879 Para crear un fichero en Java se invoca un constructor de la clase File 408 00:16:56,879 --> 00:17:02,259 Hago New File entre paréntesis del nombre y sostancialmente esto me crea un handler 409 00:17:02,259 --> 00:17:06,059 A ese punto con este handler puedo preguntarme, ¿existe este fichero? 410 00:17:06,059 --> 00:17:08,839 Si existe, lo puedo 411 00:17:08,839 --> 00:17:10,980 Utilizar, si no existe 412 00:17:10,980 --> 00:17:12,299 Se puede decir entonces crear 413 00:17:12,299 --> 00:17:17,059 Vale 414 00:17:17,059 --> 00:17:20,259 ¿Cómo se leen los datos 415 00:17:20,259 --> 00:17:22,220 Desde un fichero? 416 00:17:22,339 --> 00:17:22,519 ¿Vale? 417 00:17:23,099 --> 00:17:25,420 Entonces, para eso existen 418 00:17:25,420 --> 00:17:27,599 Varias clases 419 00:17:27,599 --> 00:17:28,980 Nosotros veremos 420 00:17:28,980 --> 00:17:31,140 Cuatro, cinco 421 00:17:31,140 --> 00:17:33,079 Clases de este tipo, ¿vale? 422 00:17:33,079 --> 00:17:34,740 Que me permiten crear 423 00:17:34,740 --> 00:17:37,019 Un canal de comunicación con el fichero 424 00:17:37,019 --> 00:17:37,440 ¿Vale? 425 00:17:37,440 --> 00:17:40,039 La input stream 426 00:17:40,039 --> 00:17:41,700 Es la más genérica 427 00:17:41,700 --> 00:17:43,700 ¿Vale? De hecho no se puede crear 428 00:17:43,700 --> 00:17:45,039 Un input stream como tal 429 00:17:45,039 --> 00:17:45,500 ¿Vale? 430 00:17:46,940 --> 00:17:48,660 Es sustancialmente 431 00:17:48,660 --> 00:17:51,900 Una idea abstracta 432 00:17:51,900 --> 00:17:53,220 De como se puede 433 00:17:53,220 --> 00:17:54,859 Recibir datos 434 00:17:54,859 --> 00:17:56,980 Un flujo en input 435 00:17:56,980 --> 00:17:57,920 Un flujo en entrada 436 00:17:57,920 --> 00:17:59,420 De datos 437 00:17:59,420 --> 00:18:02,420 Y sustancialmente me da unos métodos 438 00:18:02,420 --> 00:18:04,680 Me proporciona unos métodos muy muy básicos 439 00:18:04,680 --> 00:18:06,900 En plan a leer bytes 440 00:18:06,900 --> 00:18:09,519 Esto sirve 441 00:18:09,519 --> 00:18:11,500 Para sustancialmente 442 00:18:11,500 --> 00:18:13,720 Poder leer byte a byte un fichero 443 00:18:13,720 --> 00:18:15,579 Sin interpretarlo como 444 00:18:15,579 --> 00:18:17,579 Carácteres, sin interpretarlo como 445 00:18:17,579 --> 00:18:18,839 Objetos, sin interpretarlo 446 00:18:18,839 --> 00:18:20,619 No lo interpreto 447 00:18:20,619 --> 00:18:22,619 Voy a pillar un byte y lo leo 448 00:18:22,619 --> 00:18:23,339 Voy a pillar otro byte 449 00:18:23,339 --> 00:18:27,259 Está claro que yo a nivel de Java 450 00:18:27,259 --> 00:18:29,539 Puedo leerme todos los bytes que quiero 451 00:18:29,539 --> 00:18:30,779 Y luego esos bytes 452 00:18:30,779 --> 00:18:33,420 Castearlos, transformarlos en otra cosa 453 00:18:33,420 --> 00:18:35,140 ¿Vale? Eso se puede hacer 454 00:18:35,140 --> 00:18:38,960 Pero aquí estoy trabajando solo con bytes 455 00:18:38,960 --> 00:18:41,339 ¿Para qué puede servir cosas así? 456 00:18:41,740 --> 00:18:44,220 Por ejemplo, cuando yo quiero copiar un fichero 457 00:18:44,220 --> 00:18:46,519 Y este fichero no es un fichero de texto 458 00:18:46,519 --> 00:18:49,920 Yo tengo un fichero ejecutable, lo quiero copiar 459 00:18:49,920 --> 00:18:53,819 Entonces quiero leer este fichero ejecutable y escribirlo en otro lado 460 00:18:53,819 --> 00:18:57,619 Pues para leerlo, como es un fichero ejecutable 461 00:18:57,619 --> 00:19:02,660 ¿Habéis abierto alguna vez un fichero ejecutable con un lector de texto? 462 00:19:05,140 --> 00:19:06,099 No se entiende 463 00:19:06,099 --> 00:19:07,480 Porque son bytes 464 00:19:07,480 --> 00:19:10,819 Y el fichero de editor de texto 465 00:19:10,819 --> 00:19:13,000 Intenta interpretarlo como caracteres 466 00:19:13,000 --> 00:19:14,519 Pero no son caracteres, son bytes 467 00:19:14,519 --> 00:19:16,799 Y por lo tanto no se ve nada 468 00:19:16,799 --> 00:19:17,380 Pues lo mismo 469 00:19:17,380 --> 00:19:20,000 En ficheros como el ejeutable por ejemplo 470 00:19:20,000 --> 00:19:22,440 Si lo tengo que leer 471 00:19:22,440 --> 00:19:24,539 Pues lo mejor es leerlos byte a byte 472 00:19:24,539 --> 00:19:26,119 Porque no me representan caracteres 473 00:19:26,119 --> 00:19:28,359 No me representan objetos, no me representan nada 474 00:19:28,359 --> 00:19:29,900 Si quiero recuperar un mapa 475 00:19:29,900 --> 00:19:36,329 Y se abre y solamente se ven los caracteres 476 00:19:36,329 --> 00:19:38,150 ¿Puedes hacer cosas para que 477 00:19:38,150 --> 00:19:41,210 Es difícil, pero allí ya es otra cosa 478 00:19:41,210 --> 00:19:42,690 Allí es porque un Word 479 00:19:42,690 --> 00:19:45,450 En realidad por debajo es un lenguaje de marcas 480 00:19:45,450 --> 00:19:47,329 ¿Vale? Especial, lo habéis estudiado 481 00:19:47,329 --> 00:19:47,849 Es un 482 00:19:47,849 --> 00:19:50,069 What you get is what you see 483 00:19:50,069 --> 00:19:52,069 Tipo de lenguaje de marcas 484 00:19:52,069 --> 00:19:54,609 Tú lo ves, pero por debajo cuando se guarda 485 00:19:54,609 --> 00:19:56,170 Le añade toda la marca que quiera él 486 00:19:56,170 --> 00:19:58,289 Está claro que si se ha corrompido alguna de estas marcas 487 00:19:58,289 --> 00:19:59,750 Pues como si en un XML 488 00:19:59,750 --> 00:20:02,369 Tú te pones acá a borrar 489 00:20:02,369 --> 00:20:03,589 Farentesis y borrar 490 00:20:03,589 --> 00:20:05,849 Nodos 491 00:20:05,849 --> 00:20:07,210 Y llega un momento que no te entiende 492 00:20:07,210 --> 00:20:10,230 Pero no es 493 00:20:10,230 --> 00:20:12,730 No son caracteres puros 494 00:20:12,730 --> 00:20:14,710 Habría que ver como se guarda 495 00:20:14,710 --> 00:20:15,309 En los pequeños 496 00:20:15,309 --> 00:20:17,990 Vale 497 00:20:17,990 --> 00:20:20,710 Ahora, yo puedo encapsular 498 00:20:20,710 --> 00:20:21,869 Un input stream 499 00:20:21,869 --> 00:20:24,490 Que es, hemos dicho, un canal de comunicación 500 00:20:24,490 --> 00:20:25,490 Byte a byte 501 00:20:25,490 --> 00:20:28,670 Y puedo decir, oye mira, pero yo no quiero leer byte a byte 502 00:20:28,670 --> 00:20:29,789 Yo quiero 503 00:20:29,789 --> 00:20:32,829 Trabajar con ficheros de texto 504 00:20:32,829 --> 00:20:33,589 Vale 505 00:20:33,589 --> 00:20:35,890 Entonces quiero que sostancialmente 506 00:20:35,890 --> 00:20:37,349 Tú me leas como te da la gana 507 00:20:37,349 --> 00:20:40,009 Pero interprétame lo que estás leyendo 508 00:20:40,009 --> 00:20:41,049 Como char 509 00:20:41,049 --> 00:20:43,950 ¿Sí? Con el tamaño que incluye 510 00:20:43,950 --> 00:20:44,970 Char y cosas por el estilo 511 00:20:44,970 --> 00:20:46,809 ¿Por qué? Porque el fichero de texto 512 00:20:46,809 --> 00:20:48,329 Que yo estoy utilizando 513 00:20:48,329 --> 00:20:50,609 El fichero que estoy utilizando es un fichero de texto 514 00:20:50,609 --> 00:20:52,869 Guardaré allí dentro texto 515 00:20:52,869 --> 00:20:54,230 Y leeré texto 516 00:20:54,230 --> 00:20:56,170 Si estoy seguro de eso 517 00:20:56,170 --> 00:20:58,170 En vez de utilizar un input stream 518 00:20:58,170 --> 00:21:00,970 Voy a utilizar un input stream reader 519 00:21:00,970 --> 00:21:02,670 Cuando está reader 520 00:21:02,670 --> 00:21:03,509 O writer 521 00:21:03,509 --> 00:21:07,650 Lo que estamos haciendo es no trabajar byte a byte 522 00:21:07,650 --> 00:21:11,990 Sino interpretar los bytes como caracteres 523 00:21:11,990 --> 00:21:15,609 Ahora estoy escribiendo caracteres, leyendo caracteres 524 00:21:15,609 --> 00:21:16,990 ¿Por qué se hace esto? 525 00:21:17,109 --> 00:21:20,009 Porque sustancialmente esto me da algunas ventajas 526 00:21:20,009 --> 00:21:24,890 Yo aquí, técnicamente, no puedo escribir un string 527 00:21:24,890 --> 00:21:28,190 Puedo decir, hola, escríbemelo en un fichero 528 00:21:28,190 --> 00:21:32,390 Le tengo que este hola transformarlo en un array de bytes 529 00:21:32,390 --> 00:21:34,769 Porque aquí está transformando solo en byte en byte 530 00:21:34,769 --> 00:21:35,869 ¿Sí? 531 00:21:36,289 --> 00:21:40,690 Sin embargo, aquí tendré algunos métodos adicionales 532 00:21:40,690 --> 00:21:43,549 Además de los inputStream, porque están relacionados 533 00:21:43,549 --> 00:21:46,750 Pero tendré algunos métodos especiales que me dirán 534 00:21:46,750 --> 00:21:49,289 En vez de leer byte a byte, léeme un carácter 535 00:21:49,289 --> 00:21:51,829 Entonces puedo leer directamente un carácter 536 00:21:51,829 --> 00:21:54,089 O una red de caracteres, en vez de una red de byte 537 00:21:54,089 --> 00:21:55,289 ¿Sí? 538 00:21:56,490 --> 00:22:01,390 En particular, cuando nosotros vamos a utilizar los ficheros 539 00:22:01,390 --> 00:22:03,869 No vamos a crear ni input stream 540 00:22:03,869 --> 00:22:05,009 Ni input stream reader 541 00:22:05,009 --> 00:22:08,089 Pero está la clase file input stream 542 00:22:08,089 --> 00:22:09,289 Para estos de aquí 543 00:22:09,289 --> 00:22:10,849 Y file reader 544 00:22:10,849 --> 00:22:12,329 Para estos de aquí 545 00:22:12,329 --> 00:22:15,690 Tened en cuenta que tanto file input stream 546 00:22:15,690 --> 00:22:17,569 Como file reader si se pueden crear 547 00:22:17,569 --> 00:22:18,349 Pueden hacer una new 548 00:22:18,349 --> 00:22:20,869 Una new de input stream reader directamente 549 00:22:20,869 --> 00:22:22,869 De input stream no lo pueden hacer 550 00:22:22,869 --> 00:22:27,730 Estos son para leer en ficheros 551 00:22:27,730 --> 00:22:30,029 Es posible 552 00:22:30,029 --> 00:22:32,769 Hay otros entornos donde se usan 553 00:22:32,769 --> 00:22:34,430 Input stream, output stream 554 00:22:34,430 --> 00:22:35,230 Y cosas por el estilo 555 00:22:35,230 --> 00:22:38,809 Que es por ejemplo la comunicación entre ordenadores 556 00:22:38,809 --> 00:22:39,430 ¿Vale? 557 00:22:40,049 --> 00:22:41,930 Si hacéis en segundo de DAM 558 00:22:41,930 --> 00:22:44,609 Programación de procesos 559 00:22:44,609 --> 00:22:46,569 Y servicios 560 00:22:46,569 --> 00:22:48,910 Pues ahí hay una parte de comunicación 561 00:22:48,910 --> 00:22:49,670 En internet 562 00:22:49,670 --> 00:22:51,470 Donde se ven los sockets 563 00:22:51,470 --> 00:22:54,450 Los sockets son canales de comunicación entre dos ordenadores 564 00:22:54,450 --> 00:22:57,130 Para que dos aplicaciones que están en ordenadores distintos 565 00:22:57,130 --> 00:22:58,109 Se hablen entre ellos 566 00:22:58,109 --> 00:23:00,509 Y para mandarse información una a otra 567 00:23:00,509 --> 00:23:01,690 Pues se usan 568 00:23:01,690 --> 00:23:04,730 Input reader o input stream reader 569 00:23:04,730 --> 00:23:05,970 O input stream 570 00:23:05,970 --> 00:23:06,529 ¿Vale? 571 00:23:06,789 --> 00:23:09,230 Hasta que ahora no se usará el file input stream 572 00:23:09,230 --> 00:23:12,089 Porque no estoy hablando con ficheros 573 00:23:12,089 --> 00:23:13,190 Estoy hablando con sockets 574 00:23:13,190 --> 00:23:14,630 Con canales de comunicación 575 00:23:14,630 --> 00:23:17,250 Pero la idea es muy parecida 576 00:23:17,250 --> 00:23:18,410 De hecho esto 577 00:23:18,410 --> 00:23:19,990 Si se puede utilizar 578 00:23:19,990 --> 00:23:23,190 Esta de aquí es una evolución 579 00:23:24,230 --> 00:23:25,529 Todavía más 580 00:23:25,529 --> 00:23:26,650 Hacia la abstracción 581 00:23:26,650 --> 00:23:29,950 Del input del file reader 582 00:23:29,950 --> 00:23:32,029 Que llega a ser 583 00:23:32,029 --> 00:23:33,089 Buffered reader 584 00:23:33,089 --> 00:23:35,589 Buffered reader es un reader 585 00:23:35,589 --> 00:23:38,170 Por lo tanto estoy trabajando con carácteres 586 00:23:38,170 --> 00:23:40,109 Que tiene un buffer 587 00:23:40,109 --> 00:23:41,730 Tiene una memoria 588 00:23:41,730 --> 00:23:43,269 Temporal 589 00:23:43,269 --> 00:23:46,250 En que puede almacenar lo que está recibiendo 590 00:23:46,250 --> 00:23:48,309 Entonces mientras un file reader 591 00:23:48,309 --> 00:23:50,690 Te va leyendo carácter por carácter 592 00:23:50,690 --> 00:23:52,549 Y tengo que hacer algo con estos carácteres 593 00:23:52,549 --> 00:23:54,089 El buffered reader 594 00:23:54,089 --> 00:23:55,769 Estos carácteres los lee 595 00:23:55,769 --> 00:23:57,069 Y lo mete en una memoria 596 00:23:57,069 --> 00:23:59,410 Y yo luego puedo acceder a esta memoria 597 00:23:59,410 --> 00:24:00,410 ¿Cuál es la ventaja? 598 00:24:00,769 --> 00:24:03,509 Pues que ahora puedo hacer algunas operaciones 599 00:24:03,509 --> 00:24:05,269 Que antes no podía hacer 600 00:24:05,269 --> 00:24:07,230 Por ejemplo, leer una línea 601 00:24:07,230 --> 00:24:10,369 FileReader 602 00:24:10,369 --> 00:24:11,890 No tiene un método 603 00:24:11,890 --> 00:24:12,910 Léeme una línea 604 00:24:12,910 --> 00:24:15,710 Lo que tendré que hacer es 605 00:24:15,710 --> 00:24:17,430 Léeme un carácter, léeme otro carácter 606 00:24:17,430 --> 00:24:20,809 Y cuando encuentre uno de estos carácters 607 00:24:20,809 --> 00:24:23,170 Que he leído, que es el retorno de carros 608 00:24:23,170 --> 00:24:23,950 El intro 609 00:24:23,950 --> 00:24:25,829 Pues entonces allí asumir 610 00:24:25,829 --> 00:24:28,089 Oye, mira, he llegado al final de la línea 611 00:24:28,089 --> 00:24:28,950 ¿Vale? 612 00:24:29,430 --> 00:24:31,269 Sin embargo, el BufferedReader 613 00:24:31,269 --> 00:24:33,210 Me proporciona un método para decir 614 00:24:33,210 --> 00:24:34,630 Lea una línea entera 615 00:24:34,630 --> 00:24:37,369 Porque él se está guardando en un buffer 616 00:24:37,369 --> 00:24:38,650 Todo lo que está leyendo 617 00:24:38,650 --> 00:24:41,109 Y entonces luego puede trabajar con este buffer 618 00:24:41,109 --> 00:24:42,170 ¿Sí? 619 00:24:42,230 --> 00:24:43,569 Puede trabajar en esta memoria 620 00:24:43,569 --> 00:24:44,809 ¿Sí? 621 00:24:45,109 --> 00:24:45,529 ¿Se entiende? 622 00:24:46,269 --> 00:24:48,230 Entonces, la idea es simplemente que 623 00:24:48,230 --> 00:24:49,410 Hacen todo lo mismo 624 00:24:49,410 --> 00:24:51,690 Todo lo que puede hacer con un input stream 625 00:24:51,690 --> 00:24:53,529 Lo puede hacer con un BufferedReader 626 00:24:53,529 --> 00:24:55,190 Todo, ¿vale? 627 00:24:55,930 --> 00:24:57,549 Lo que pasa es que el Buffered Reader 628 00:24:57,549 --> 00:24:59,769 Ya me implementa algunas funciones 629 00:24:59,769 --> 00:25:00,930 Más avanzadas 630 00:25:00,930 --> 00:25:03,069 Que a lo mejor me hacen la vida más sencilla 631 00:25:03,069 --> 00:25:05,549 En vez de tener que ir byte a byte leyéndolo 632 00:25:05,549 --> 00:25:06,849 Pues lo que puedo decir es 633 00:25:06,849 --> 00:25:07,750 Léeme una línea entera 634 00:25:07,750 --> 00:25:10,230 Y voy trabajando en mi fichero diciendo 635 00:25:10,230 --> 00:25:13,849 Por ejemplo, en el caso en que haya guardado 636 00:25:13,849 --> 00:25:15,690 Los alumnos como texto 637 00:25:15,690 --> 00:25:16,589 En mi fichero 638 00:25:16,589 --> 00:25:19,130 Pues yo puedo decir que cada línea 639 00:25:19,130 --> 00:25:20,329 Es un objeto 640 00:25:20,329 --> 00:25:22,509 Entonces le digo al Buffered Reader 641 00:25:22,509 --> 00:25:25,269 Léeme una línea, él me da una línea 642 00:25:25,269 --> 00:25:27,009 Y con los datos que están allí 643 00:25:27,009 --> 00:25:28,869 Con un string tokenizer 644 00:25:28,869 --> 00:25:31,390 Cosa por el estilo, lo separo y creo un objeto 645 00:25:31,390 --> 00:25:32,690 Léeme otra línea 646 00:25:32,690 --> 00:25:34,390 Pillo esa línea de allí 647 00:25:34,390 --> 00:25:36,970 La troceo como tengo que trocearla 648 00:25:36,970 --> 00:25:39,150 La interpreto y creo un segundo objeto 649 00:25:39,150 --> 00:25:40,009 Etcétera, etcétera 650 00:25:40,009 --> 00:25:42,769 Sostancialmente están aquí 651 00:25:42,769 --> 00:25:44,490 Para mejorar 652 00:25:44,490 --> 00:25:46,529 Nuestra calidad de vida 653 00:25:46,529 --> 00:25:49,450 Trabajar con input stream 654 00:25:49,450 --> 00:25:51,549 Es más a bajo nivel 655 00:25:51,549 --> 00:25:53,109 Más complejo 656 00:25:53,109 --> 00:25:56,150 Pero más tienes tú el control 657 00:25:56,150 --> 00:25:57,130 De lo que está pasando 658 00:25:57,130 --> 00:25:59,529 Yendo hacia el Buffered Reader 659 00:25:59,529 --> 00:26:01,490 Es más fácil de utilizar 660 00:26:01,490 --> 00:26:04,430 Me tengo que olvidar 661 00:26:04,430 --> 00:26:05,809 De varias cosas que hacía aquí 662 00:26:05,809 --> 00:26:07,289 Me puedo olvidar tranquilamente 663 00:26:07,289 --> 00:26:09,170 Pero tengo menos control 664 00:26:09,170 --> 00:26:12,210 No voy leyendo carácter por carácter 665 00:26:12,210 --> 00:26:14,029 Voy leyendo frase por frase 666 00:26:14,029 --> 00:26:15,089 O lo que sea 667 00:26:15,089 --> 00:26:17,049 ¿Sí? Entonces 668 00:26:17,049 --> 00:26:20,210 Normalmente nosotros tendremos a usar Buffered Reader 669 00:26:20,210 --> 00:26:21,009 Nosotros 670 00:26:21,009 --> 00:26:28,269 Para simplificarnos la vida, tendemos a ir a cosas más genéricas 671 00:26:28,269 --> 00:26:32,369 Entonces vamos a ver un ejemplo de una lectura de un archivo de texto 672 00:26:32,369 --> 00:26:35,789 Imaginaos que yo tengo un archivo de texto, pues ¿cómo lo hago? 673 00:26:36,369 --> 00:26:40,150 Aquí se usan FileReader y BufferedReader 674 00:26:40,150 --> 00:26:46,150 Creo un FileReader y un BufferedReader 675 00:26:46,150 --> 00:26:48,430 Try y catch 676 00:26:48,430 --> 00:26:50,490 Muchas de estas cosas 677 00:26:50,490 --> 00:26:52,549 Tienen a que ver 678 00:26:52,549 --> 00:26:54,230 O pueden lanzar 679 00:26:54,230 --> 00:26:55,789 IO exception 680 00:26:55,789 --> 00:26:57,609 Input output exception 681 00:26:57,609 --> 00:27:00,250 Los estudiamos cuando vimos las excepciones 682 00:27:00,250 --> 00:27:02,589 Porque vimos que había una categoría 683 00:27:02,589 --> 00:27:04,309 Que eran las excepciones 684 00:27:04,309 --> 00:27:06,549 Los problemas que pueden surgir en input output 685 00:27:06,549 --> 00:27:08,150 Como aquí estamos trabajando de eso 686 00:27:08,150 --> 00:27:10,369 De escribir y leer de un fichero 687 00:27:10,369 --> 00:27:13,049 Pues aquí salen un montón de excepciones 688 00:27:13,049 --> 00:27:13,990 De este tipo 689 00:27:13,990 --> 00:27:14,450 ¿Vale? 690 00:27:14,950 --> 00:27:17,190 Os recuerdo que hacer una catch de Exception E 691 00:27:17,190 --> 00:27:18,329 Como en el ejemplo aquí 692 00:27:18,329 --> 00:27:21,849 Pues es desaconsejado 693 00:27:21,849 --> 00:27:22,450 ¿Vale? 694 00:27:23,109 --> 00:27:26,809 Si yo me estoy focalizando en otra cosa 695 00:27:26,809 --> 00:27:29,309 Pues hago esta de aquí para hacer mis pruebas 696 00:27:29,309 --> 00:27:31,109 Pero en un programa serio 697 00:27:31,109 --> 00:27:32,970 Pues aquí debería tener varios catch 698 00:27:32,970 --> 00:27:35,509 Que si ha pasado esto, hace esto 699 00:27:35,509 --> 00:27:37,450 Si has hecho esta otra cosa, vas a otra cosa 700 00:27:37,450 --> 00:27:39,470 Tanto cuando haremos ejemplos veremos alguno 701 00:27:39,470 --> 00:27:40,789 Y volveremos a ver 702 00:27:40,789 --> 00:27:42,609 Entonces, ¿qué hago? 703 00:27:42,609 --> 00:27:51,250 Pues, el file reader me puede crear un nuevo file reader de un cierto fichero, ¿vale? 704 00:27:51,589 --> 00:27:53,369 Ruta archivo sería un fichero 705 00:27:53,369 --> 00:27:55,750 Eh, nota 706 00:27:55,750 --> 00:28:00,269 Puedo hacer dos formas para identificar mi archivo 707 00:28:00,269 --> 00:28:04,450 Con rutas absolutas o rutas relativas 708 00:28:04,450 --> 00:28:07,369 ¿Sabéis qué son rutas absolutas o relativas? 709 00:28:08,170 --> 00:28:09,190 ¿Habéis trabajado con ellos? 710 00:28:09,789 --> 00:28:11,150 Por lo tanto, no vuelvo a deciros 711 00:28:11,150 --> 00:28:12,009 ¿Vale? 712 00:28:12,609 --> 00:28:26,809 La ruta relativa es desde la carpeta del programa, del proce, del, del, proyecto, ¿vale? 713 00:28:27,049 --> 00:28:33,089 La carpeta del proyecto donde está search, donde está bin, pues allí es donde se guardan los ficheros. 714 00:28:33,190 --> 00:28:36,450 Si yo creo un nuevo fichero, se crea allí, por defecto, ¿vale? 715 00:28:36,450 --> 00:28:39,130 Si luego lo quiero guardar en otro lado 716 00:28:39,130 --> 00:28:40,450 O le pongo una ruta 717 00:28:40,450 --> 00:28:43,789 ¿Cómo se dice? 718 00:28:45,130 --> 00:28:47,150 Absoluta, desaconsejado 719 00:28:47,150 --> 00:28:48,970 Poner rutas absolutas 720 00:28:48,970 --> 00:28:50,789 Es siempre desaconsejado porque si cambias 721 00:28:50,789 --> 00:28:52,230 De ordenador ya no te funciona 722 00:28:52,230 --> 00:28:55,049 ¿Vale? Pero puedo tener una ruta relativa 723 00:28:55,049 --> 00:28:56,150 Para decir, oye mira, desde 724 00:28:56,150 --> 00:28:58,650 La carpeta del proyecto 725 00:28:58,650 --> 00:29:00,690 Pues entra en otra carpeta, salga 726 00:29:00,690 --> 00:29:02,569 De esa carpeta o vete a buscar 727 00:29:02,569 --> 00:29:03,869 ¿Sí? 728 00:29:03,869 --> 00:29:07,130 Vale, el Buffered Reader 729 00:29:07,130 --> 00:29:09,670 Pilla como parámetro 730 00:29:09,670 --> 00:29:10,809 Un File Reader 731 00:29:10,809 --> 00:29:13,329 Entonces, para poder crear un Buffered Reader 732 00:29:13,329 --> 00:29:15,990 En realidad un Input Stream Reader 733 00:29:15,990 --> 00:29:17,210 Que esto es un Input Stream 734 00:29:17,210 --> 00:29:19,390 Pero bueno, le tengo que pasar 735 00:29:19,390 --> 00:29:21,950 Sostancialmente es como si estoy encapsulando 736 00:29:21,950 --> 00:29:23,589 Esto es el que me permite leer 737 00:29:23,589 --> 00:29:25,390 Carácteres, vale, fenomenal 738 00:29:25,390 --> 00:29:27,690 Y esto lo encapsulo 739 00:29:27,690 --> 00:29:29,230 En una cosa más 740 00:29:29,230 --> 00:29:31,589 Poderosa, entre comillas, que me permiten 741 00:29:31,589 --> 00:29:33,369 Leer carácteres y guardarlas 742 00:29:33,369 --> 00:29:35,369 en una memoria para luego poder leer una línea 743 00:29:35,369 --> 00:29:37,450 entera o hacer cosas un poquito más complejas 744 00:29:37,450 --> 00:29:39,150 ¿vale? entonces 745 00:29:39,150 --> 00:29:40,109 esto es como 746 00:29:40,109 --> 00:29:42,490 empezaría ¿vale? entonces 747 00:29:42,490 --> 00:29:45,410 creo una línea, una string línea 748 00:29:45,410 --> 00:29:46,970 una variable que me guardará una línea 749 00:29:46,970 --> 00:29:49,549 y luego empiezo con un while 750 00:29:49,549 --> 00:29:51,009 ¿vale? ¿qué hace este while? 751 00:29:51,349 --> 00:29:53,269 me dice, mientras 752 00:29:53,269 --> 00:29:55,450 que tú haces 753 00:29:55,450 --> 00:29:57,029 un br.redline 754 00:29:57,029 --> 00:29:59,109 bufferedreader.redline 755 00:29:59,109 --> 00:30:01,009 esto lee una línea 756 00:30:01,009 --> 00:30:04,390 Esta línea la vas a guardar dentro de la variable línea 757 00:30:04,390 --> 00:30:07,809 Y si esta cosa no es null 758 00:30:07,809 --> 00:30:09,750 Es decir, si has leído algo 759 00:30:09,750 --> 00:30:11,450 Si tú has hecho un readline 760 00:30:11,450 --> 00:30:13,269 Y has leído algo 761 00:30:13,269 --> 00:30:13,910 ¿Vale? 762 00:30:13,930 --> 00:30:15,329 Quiere decir que has leído una línea 763 00:30:15,329 --> 00:30:17,869 Pues esa línea imprimirá en pantalla 764 00:30:17,869 --> 00:30:19,970 ¿Vale? 765 00:30:20,269 --> 00:30:21,650 Este programa aquí 766 00:30:21,650 --> 00:30:25,049 Me pilla lo que hay dentro de root archivo 767 00:30:25,049 --> 00:30:26,849 Y me lo imprime en pantalla 768 00:30:26,849 --> 00:30:31,410 Más o menos 769 00:30:31,410 --> 00:30:34,779 ¿Dudas? 770 00:30:35,299 --> 00:30:49,309 Y con esto, antes de la escritura, nos paramos.