1 00:00:00,000 --> 00:00:03,399 bueno, pues escribir 2 00:00:03,399 --> 00:00:05,900 es muy fácil, abro, escribo 3 00:00:05,900 --> 00:00:07,219 y me piro, ya está 4 00:00:07,219 --> 00:00:09,939 la mínima complicación viene 5 00:00:09,939 --> 00:00:12,000 en leer, cuando tú abres el archivo no sabes 6 00:00:12,000 --> 00:00:14,000 que te vas a encontrar, no sabes 7 00:00:14,000 --> 00:00:15,820 cuántos reas tienes que hacer, no sabes 8 00:00:15,820 --> 00:00:17,679 la complicación viene en leer, entonces 9 00:00:17,679 --> 00:00:20,059 vamos a modificar 10 00:00:20,059 --> 00:00:21,359 un pelín esta aplicación 11 00:00:21,359 --> 00:00:24,399 para que cuando arranque 12 00:00:24,399 --> 00:00:33,659 vale, pues vamos a modificar 13 00:00:33,659 --> 00:00:35,539 ahora esta aplicación para que cuando arranque 14 00:00:35,539 --> 00:00:37,539 en el caso de que haya 15 00:00:37,539 --> 00:00:39,539 ya nombres, previamente 16 00:00:39,539 --> 00:00:41,439 los cargue y luego ya 17 00:00:41,439 --> 00:00:43,679 pues te pida más, opere lo que sea 18 00:00:43,679 --> 00:00:45,119 entonces vamos a modificar 19 00:00:45,119 --> 00:00:47,579 esta aplicación para que te 20 00:00:47,579 --> 00:00:49,479 cargue los datos 21 00:00:49,479 --> 00:00:51,439 que hubiera previamente en el fichero 22 00:00:51,439 --> 00:00:52,780 si hubiera ya nombres de antes 23 00:00:52,780 --> 00:00:55,619 porque tal y como lo hemos hecho, esta aplicación 24 00:00:55,619 --> 00:00:57,759 arranca siempre con una cantidad de nombres vacío 25 00:00:57,759 --> 00:01:00,340 Pero se está leyendo aquí todo el rato 26 00:01:00,340 --> 00:01:01,899 ¿Vale? 27 00:01:02,060 --> 00:01:04,239 Porque arranca, lógicamente esto está vacío 28 00:01:04,239 --> 00:01:06,540 Vale, pues vamos a modificarla 29 00:01:06,540 --> 00:01:07,359 Para 30 00:01:07,359 --> 00:01:09,939 Que te cargue 31 00:01:09,939 --> 00:01:12,019 Estos nombres de aquí con los nombres 32 00:01:12,019 --> 00:01:14,359 Que existan en el fichero de existir 33 00:01:14,359 --> 00:01:15,359 Alguno previamente 34 00:01:15,359 --> 00:01:17,780 Entonces la aplicación, tú la arrancas 35 00:01:17,780 --> 00:01:19,939 Tiene ya sus nombres, haces lo que sea con ellos 36 00:01:19,939 --> 00:01:21,019 Y te vas 37 00:01:21,019 --> 00:01:22,540 ¿Vale? 38 00:01:23,799 --> 00:01:24,900 Bueno, con lo que toque 39 00:01:24,900 --> 00:01:26,500 Vamos por partes 40 00:01:26,500 --> 00:01:59,040 A ver, pues venga, entonces lo primero que haríamos aquí es, vale, pues vamos a modificar la aplicación para hacer esto, leer nombres, vamos a hacer este método, vale, vale, pues este es nuestro método leer nombres. 41 00:01:59,040 --> 00:02:01,400 entonces leer 42 00:02:01,400 --> 00:02:02,959 esencialmente 43 00:02:02,959 --> 00:02:04,959 también necesita 44 00:02:04,959 --> 00:02:06,900 sus tres partes, que es 45 00:02:06,900 --> 00:02:09,199 abrir fichero 46 00:02:09,199 --> 00:02:14,740 para leer, en nuestro 47 00:02:14,740 --> 00:02:16,879 caso para leer caracteres, porque es lo que 48 00:02:16,879 --> 00:02:20,819 tiene, hacer la lectura 49 00:02:20,819 --> 00:02:26,699 y luego ya cerrar 50 00:02:26,699 --> 00:02:33,710 esto es lo que va a ver que hace 51 00:02:33,710 --> 00:02:40,550 para desbloquear 52 00:02:41,590 --> 00:02:42,270 el recurso 53 00:02:42,270 --> 00:03:01,909 Cuando tú abres un objeto que está asociado a un recurso externo, sea un fichero, sea un socket, sea algo, pues ese recurso se queda con el sistema de protección de procesos, con los semáforos, con todo eso, se queda bloqueado para que accedan otros procesos. 54 00:03:01,909 --> 00:03:17,009 Entonces, si tú no cierras ese flujo y otro programa quiere acceder a ese archivo, no puedes, no puedes, ¿vale? Cerrarlo es liberarlo. Yo ya me desentiendo de ese fichero, ya se queda liberado, ¿vale? 55 00:03:17,210 --> 00:03:25,650 Que si no lo hace, cuando la aplicación termina, se van a liberar igual todos los recursos que tenga asociados, pero la aplicación podría no terminar y hacer más cosas. 56 00:03:25,650 --> 00:03:28,870 Vale, pues venga, abrir fichero para leer caracteres 57 00:03:28,870 --> 00:03:31,129 Vale, pues vamos a hacerlo con la clase básica 58 00:03:31,129 --> 00:03:34,710 Pues si FileWriter era 59 00:03:34,710 --> 00:03:36,810 Perdón, FileWriter era para 60 00:03:36,810 --> 00:03:37,770 Escribir caracteres 61 00:03:37,770 --> 00:03:40,710 Pues para leer será esta, tiene toda la pinta, ¿verdad? 62 00:03:44,840 --> 00:03:46,419 Que también la instanciamos 63 00:03:46,419 --> 00:03:49,509 Así, vale 64 00:03:49,509 --> 00:03:50,250 Entonces 65 00:03:50,250 --> 00:03:52,849 Aquí lo mismo 66 00:03:52,849 --> 00:03:55,509 Vamos a 67 00:03:55,509 --> 00:03:57,430 Pedir el nombre del fichero 68 00:03:57,430 --> 00:04:03,530 A ver 69 00:04:03,530 --> 00:04:15,319 Me estoy copiando el escáner para leer el nombre del fichero. 70 00:04:18,019 --> 00:04:23,620 Ahora voy a volver a preguntarle de qué fichero quiere. 71 00:04:30,829 --> 00:04:46,170 Vale, nombre fichero. 72 00:04:46,170 --> 00:04:51,430 Y yo aquí podría pasarle este nombre también directamente. 73 00:05:03,569 --> 00:05:06,790 Entonces, estos import que estamos haciendo automáticamente, 74 00:05:06,790 --> 00:05:08,769 mirad que son todos de javaio 75 00:05:08,769 --> 00:05:10,769 los que estamos haciendo aquí automáticamente 76 00:05:10,769 --> 00:05:16,699 bueno pues a ver 77 00:05:16,699 --> 00:05:18,740 file writer ya es un poco más peliaguda 78 00:05:18,740 --> 00:05:20,560 primero porque 79 00:05:20,560 --> 00:05:22,500 aquí te dice oye cuidado 80 00:05:22,500 --> 00:05:25,160 te puede salir una excepción 81 00:05:25,160 --> 00:05:27,000 de tipo file not found 82 00:05:27,000 --> 00:05:27,699 exception 83 00:05:27,699 --> 00:05:31,100 claro porque file writer si el fichero no existe 84 00:05:31,100 --> 00:05:32,759 no pasa nada lo crea 85 00:05:32,759 --> 00:05:33,319 y ya está 86 00:05:33,319 --> 00:05:36,060 como es para escribir yo quiero escribir 87 00:05:36,060 --> 00:05:38,720 no existe pues te lo creo y escribes 88 00:05:38,720 --> 00:05:40,740 pero si es para leer 89 00:05:40,740 --> 00:05:43,240 si el fichero no existe 90 00:05:43,240 --> 00:05:44,800 aquí sí que te da una excepción 91 00:05:44,800 --> 00:05:47,139 no lo crea nuevo para que tú leas 92 00:05:47,139 --> 00:05:49,139 del vacío, no lo puede crear e inventarse 93 00:05:49,139 --> 00:05:49,720 la información 94 00:05:49,720 --> 00:05:53,019 entonces por eso te dice, cuidado que puedes 95 00:05:53,019 --> 00:05:54,699 lanzar una file not found exception 96 00:05:54,699 --> 00:05:56,980 a ver, podríamos capturarla y decir 97 00:05:56,980 --> 00:05:58,939 el fichero no existe, pero bueno 98 00:05:58,939 --> 00:06:00,439 vamos a hacer otra cosa 99 00:06:00,439 --> 00:06:04,670 vale, recordad la clase file 100 00:06:04,670 --> 00:06:06,389 que hemos dicho antes, la clase file 101 00:06:06,389 --> 00:06:08,470 tú la puedes asociar a un archivo 102 00:06:08,470 --> 00:06:10,350 cualquiera, para sacar 103 00:06:10,350 --> 00:06:11,889 información sobre ese archivo 104 00:06:11,889 --> 00:06:14,689 por ejemplo, me voy a crear yo este objeto 105 00:06:14,689 --> 00:06:15,889 file de aquí 106 00:06:15,889 --> 00:06:18,790 asociado a este 107 00:06:18,790 --> 00:06:31,370 vale, pues este objeto 108 00:06:31,370 --> 00:06:33,209 file de aquí, que está asociado 109 00:06:33,209 --> 00:06:35,149 también a ese archivo, no me vale 110 00:06:35,149 --> 00:06:37,370 para leer y escribir, ni nada de eso 111 00:06:37,370 --> 00:06:38,889 pero si me vale para sacar 112 00:06:38,889 --> 00:06:40,410 información sobre ese archivo 113 00:06:40,410 --> 00:06:43,189 por ejemplo, pues 114 00:06:43,189 --> 00:06:44,170 si el fichero existe 115 00:06:44,170 --> 00:06:46,110 vale 116 00:06:46,110 --> 00:06:48,209 entonces, por ejemplo 117 00:06:48,209 --> 00:06:49,930 Pues puedo hacer yo 118 00:06:49,930 --> 00:06:52,310 Si el fichero 119 00:06:52,310 --> 00:06:53,870 Vamos a ver que métodos tiene 120 00:06:53,870 --> 00:06:54,629 Este de aquí 121 00:06:54,629 --> 00:07:11,029 Vale, pues esta clase 122 00:07:11,029 --> 00:07:13,029 Tiene un montón de métodos para sacar información 123 00:07:13,029 --> 00:07:14,730 Si tienes permiso de ejecución 124 00:07:14,730 --> 00:07:16,509 Si tienes permiso de lectura 125 00:07:16,509 --> 00:07:18,269 Para 126 00:07:18,269 --> 00:07:21,370 Si es un directorio 127 00:07:21,370 --> 00:07:22,410 Si es un fichero 128 00:07:22,410 --> 00:07:25,730 Vale, para cambiarle el nombre 129 00:07:25,730 --> 00:07:27,569 Bueno, ya probaremos algunos 130 00:07:27,569 --> 00:07:29,290 Pero en particular 131 00:07:29,290 --> 00:07:31,449 tiene uno que es 132 00:07:31,449 --> 00:07:33,050 este 133 00:07:33,050 --> 00:07:34,850 que es para ver si existe o no 134 00:07:34,850 --> 00:07:41,279 no sabe mucho, tiene muy buena vista 135 00:07:41,279 --> 00:07:42,959 o las dos cosas 136 00:07:42,959 --> 00:07:47,939 vale, pues entonces yo lo que puedo hacer es 137 00:07:47,939 --> 00:07:49,680 si el fichero no existe 138 00:07:49,680 --> 00:07:51,939 pues si el fichero no existe no tiene sentido 139 00:07:51,939 --> 00:07:53,720 leer nombres, pues ya directamente 140 00:07:53,720 --> 00:07:55,379 irme y se acabó 141 00:07:55,379 --> 00:07:57,399 me voy, no hago nada 142 00:07:57,399 --> 00:07:59,439 no modifico el map, no hago nada 143 00:07:59,439 --> 00:08:02,220 vale 144 00:08:02,220 --> 00:08:06,040 si el fichero no existe, me voy 145 00:08:06,040 --> 00:08:07,680 y ya está, vale 146 00:08:07,680 --> 00:08:18,149 Vale, si el fichero existe 147 00:08:18,149 --> 00:08:19,269 Yo ya sigo por aquí 148 00:08:19,269 --> 00:08:20,730 Yo ya sigo por aquí 149 00:08:20,730 --> 00:08:24,470 Aquí, en cualquier caso 150 00:08:24,470 --> 00:08:26,110 File not found, la tengo que capturar 151 00:08:26,110 --> 00:08:27,410 O la tengo que propagar 152 00:08:27,410 --> 00:08:30,089 Pero bueno, aquí me es mucho más cómodo 153 00:08:30,089 --> 00:08:32,389 Sé que no me va a salir, porque ya me iría por aquí 154 00:08:32,389 --> 00:08:33,490 Si el fichero no existe 155 00:08:33,490 --> 00:08:35,830 Entonces me es mucho más cómodo 156 00:08:35,830 --> 00:08:37,629 Mandar el aviso arriba y ya está 157 00:08:37,629 --> 00:08:38,889 Vale 158 00:08:38,889 --> 00:08:50,259 Ah, vale 159 00:08:50,259 --> 00:08:54,559 vale, pues venga, ahora abrir el fichero para leer caracteres 160 00:08:54,559 --> 00:08:58,480 ala, ya está abierto, entonces al constructor de FileReader como al de FileWriter 161 00:08:58,480 --> 00:09:02,440 se le puede pasar tanto el nombre del fichero como el propio objeto file 162 00:09:02,440 --> 00:09:05,240 vale, admite ambas variantes 163 00:09:05,240 --> 00:09:10,519 entonces yo aquí le puedo pasar file también y ya está 164 00:09:10,519 --> 00:09:14,860 es lo mismo, vale, un momento que voy a conectar la batería 165 00:09:14,860 --> 00:09:21,580 aquí si vemos los métodos que tiene este 166 00:09:21,580 --> 00:09:28,940 si vemos los métodos que tiene el file 167 00:09:28,940 --> 00:09:32,830 reader, en particular los 168 00:09:32,830 --> 00:09:33,429 de lectura 169 00:09:33,429 --> 00:09:35,730 vale 170 00:09:35,730 --> 00:09:38,269 pues a ver 171 00:09:38,269 --> 00:09:40,529 tiene muchas posibilidades de métodos 172 00:09:40,529 --> 00:09:42,870 esto, leer todo como si 173 00:09:42,870 --> 00:09:44,230 fuera un único stream 174 00:09:44,230 --> 00:09:46,870 vale, pero bueno, vamos a irnos 175 00:09:46,870 --> 00:09:48,889 al básico para aprender 176 00:09:48,889 --> 00:09:49,970 a hacer un bucle de lectura 177 00:09:49,970 --> 00:09:52,350 entonces, tiene este método 178 00:09:52,350 --> 00:09:54,289 que es el método básico para leer 179 00:09:54,289 --> 00:09:55,970 vale, el de leer 180 00:09:55,970 --> 00:09:57,110 Y ahora 181 00:09:57,110 --> 00:10:01,960 Ahora, este método 182 00:10:01,960 --> 00:10:03,539 Me dice 183 00:10:03,539 --> 00:10:06,059 La ayuda que me devuelve 184 00:10:06,059 --> 00:10:07,919 Esto 185 00:10:07,919 --> 00:10:10,460 ¿Vale? Esto lo vamos a meter ahora en un bucle 186 00:10:10,460 --> 00:10:13,600 Claro, vale 187 00:10:13,600 --> 00:10:16,120 Entonces, este me puede 188 00:10:16,120 --> 00:10:18,100 Dar una excepción, vamos a quitarla cuanto antes 189 00:10:18,100 --> 00:10:20,059 De ioException, vamos a, como no estamos 190 00:10:20,059 --> 00:10:21,019 En el main todavía 191 00:10:21,019 --> 00:10:24,399 No estamos en el main, vamos a propagarla 192 00:10:24,399 --> 00:10:26,139 Para no emborronar 193 00:10:26,139 --> 00:10:28,159 Mucho esto, vamos a propagarla 194 00:10:28,159 --> 00:10:28,940 Vale 195 00:10:28,940 --> 00:10:37,500 vale, a ver, y el rojo 196 00:10:37,500 --> 00:10:39,299 es de arriba, vale 197 00:10:39,299 --> 00:10:41,799 vale, entonces 198 00:10:41,799 --> 00:10:43,419 vamos a completar 199 00:10:43,419 --> 00:10:45,139 ahora esto, claro, a ver, ¿qué hace este método? 200 00:10:45,220 --> 00:10:46,340 que es el método básico 201 00:10:46,340 --> 00:10:48,259 ¿qué hace este método? 202 00:11:01,500 --> 00:11:03,779 el fichero se ha abierto para leer 203 00:11:03,779 --> 00:11:05,720 ¿vale? está posicionado internamente 204 00:11:05,720 --> 00:11:07,840 ahí, para leer, ¿qué hace este método? 205 00:11:08,840 --> 00:11:09,460 te coge 206 00:11:09,460 --> 00:11:12,000 un único carácter 207 00:11:12,000 --> 00:11:14,240 un byte de 8 bits, un único carácter 208 00:11:14,240 --> 00:11:16,100 te lo 209 00:11:16,100 --> 00:11:18,259 guarda en una variable 210 00:11:18,259 --> 00:11:19,940 de tipo int 211 00:11:19,940 --> 00:11:22,059 con lo cual tiene 212 00:11:22,059 --> 00:11:24,159 4 bytes, ¿dónde te lo guarda? 213 00:11:24,700 --> 00:11:25,299 aquí 214 00:11:25,299 --> 00:11:28,240 en el menos significativo 215 00:11:28,240 --> 00:11:30,440 y el resto lo rellena 216 00:11:30,440 --> 00:11:31,580 todo con ceros 217 00:11:31,580 --> 00:11:34,320 vale, y diréis 218 00:11:34,320 --> 00:11:36,120 vosotros, ¿qué necesidad tiene 219 00:11:36,120 --> 00:11:38,419 de devolvértelo 220 00:11:38,419 --> 00:11:40,200 en una variable int cuando son solo 221 00:11:40,200 --> 00:11:42,320 8 bits? podría devolvértelo en una variable 222 00:11:42,320 --> 00:11:44,139 char, en una variable byte que tiene solo 223 00:11:44,139 --> 00:11:45,899 8 bits, ¿qué necesidad tiene 224 00:11:45,899 --> 00:11:48,200 devolverte una indie y completarlo toda con ceros? 225 00:11:49,600 --> 00:11:50,220 Bueno, pues 226 00:11:50,220 --> 00:11:51,559 esa necesidad viene 227 00:11:51,559 --> 00:11:53,679 por el hecho de que 228 00:11:53,679 --> 00:11:56,000 se habilita la opción de avisarte 229 00:11:56,000 --> 00:11:57,700 si has llegado al final 230 00:11:57,700 --> 00:11:59,659 porque la lectura 231 00:11:59,659 --> 00:12:01,899 cada vez que se hace una lectura, tú lees 232 00:12:01,899 --> 00:12:03,399 un carácter y lo guardas 233 00:12:03,399 --> 00:12:05,960 e internamente te quedas posicionado 234 00:12:05,960 --> 00:12:07,960 en el siguiente, con el siguiente 235 00:12:07,960 --> 00:12:10,039 read que hagas, lees un carácter 236 00:12:10,039 --> 00:12:11,740 y lo guardas, y te quedas 237 00:12:11,740 --> 00:12:13,860 internamente posicionado en el siguiente, así 238 00:12:13,860 --> 00:12:15,519 llegará un momento 239 00:12:15,519 --> 00:12:18,360 en que ya haya un read 240 00:12:18,360 --> 00:12:20,519 que buf, error 241 00:12:20,519 --> 00:12:21,659 porque ya me he salido 242 00:12:21,659 --> 00:12:24,399 llegará un momento en que me haya salido, tú no sabes cuándo va a ser 243 00:12:24,399 --> 00:12:25,960 porque no sabes esto como de largo es 244 00:12:25,960 --> 00:12:27,500 entonces 245 00:12:27,500 --> 00:12:30,759 cuando el fread este de aquí 246 00:12:30,759 --> 00:12:34,259 intenta leer ya fuera 247 00:12:34,259 --> 00:12:35,899 porque se ha salido 248 00:12:35,899 --> 00:12:38,220 lo que hace es 249 00:12:38,220 --> 00:12:39,940 devolverte el número 250 00:12:39,940 --> 00:12:41,620 menos 1 251 00:12:41,620 --> 00:12:43,799 que el menos 1 252 00:12:43,799 --> 00:12:47,080 Pues en complemento a 1, ya sabéis que es todo unos en realidad. 253 00:12:49,059 --> 00:12:51,620 Entonces, la forma que tiene este método de avisar, 254 00:12:51,820 --> 00:12:53,779 oye, que lo que te estoy devolviendo ya no es válido, 255 00:12:53,840 --> 00:12:55,299 no es un carácter porque me he salido, 256 00:12:56,159 --> 00:12:58,159 es devolviéndote todo unos aquí, 257 00:12:58,559 --> 00:13:00,740 o lo que es lo mismo devolviéndote el entero menos 1. 258 00:13:01,559 --> 00:13:04,759 Y en cualquier otro caso, cuando ha leído un char válido, 259 00:13:05,279 --> 00:13:07,299 lo que te devuelve son todos ceros aquí, 260 00:13:07,860 --> 00:13:09,059 y aquí el char que sea. 261 00:13:09,679 --> 00:13:10,700 Y aquí el char que sea. 262 00:13:13,500 --> 00:13:13,779 ¿Vale? 263 00:13:15,240 --> 00:13:17,559 entonces, si lo guardara 264 00:13:17,559 --> 00:13:19,519 único char, no habría 265 00:13:19,519 --> 00:13:21,519 forma de avisar si es un 266 00:13:21,519 --> 00:13:23,059 char válido o estoy al final 267 00:13:23,059 --> 00:13:25,399 salvo por excepción, por supuesto, ponernos 268 00:13:25,399 --> 00:13:26,820 file exception que también existe 269 00:13:26,820 --> 00:13:29,580 ¿vale? pero esto es más cómodo 270 00:13:29,580 --> 00:13:30,559 porque no tienes que capturar 271 00:13:30,559 --> 00:13:33,379 si lo que me devuelve el fread es 272 00:13:33,379 --> 00:13:35,139 menos uno, es que ya he terminado 273 00:13:35,139 --> 00:13:37,179 bueno, pues vamos a meterlo en un bucle 274 00:13:37,179 --> 00:13:39,480 entonces, vamos a meterlo en un bucle 275 00:13:39,480 --> 00:13:40,039 de lectura 276 00:13:40,039 --> 00:13:44,210 y nos quedaría 277 00:13:44,210 --> 00:13:49,429 y ya vamos a terminar 278 00:13:49,429 --> 00:13:57,539 por ejemplo, lo vamos a arreglar ahora 279 00:13:57,539 --> 00:14:00,519 para que quede más bonito 280 00:14:00,519 --> 00:14:08,659 vale, bueno, no, como si es muy listo 281 00:14:08,659 --> 00:14:10,259 vamos a hacer directamente ya en el 282 00:14:10,259 --> 00:14:12,259 dentro del bucle 283 00:14:12,259 --> 00:14:17,840 while c 284 00:14:17,840 --> 00:14:19,980 siendo c que el resultado 285 00:14:19,980 --> 00:14:25,519 de leer sea 286 00:14:25,519 --> 00:14:27,559 diferente 287 00:14:27,559 --> 00:14:28,700 de menos uno 288 00:14:28,700 --> 00:14:55,720 vale, pues 289 00:14:55,720 --> 00:14:57,659 este es el bucle de lectura estándar del file 290 00:14:57,659 --> 00:14:59,419 real, vale 291 00:14:59,419 --> 00:15:02,299 Entonces un bucle que está todo el rato 292 00:15:02,299 --> 00:15:04,460 Lee C, haz con él lo que sea 293 00:15:04,460 --> 00:15:07,740 Mientras como no ha sido menos uno 294 00:15:07,740 --> 00:15:10,080 Lee C, no ha sido menos uno 295 00:15:10,080 --> 00:15:11,019 Haz con él lo que sea 296 00:15:11,019 --> 00:15:13,320 Lee C, no ha sido menos uno 297 00:15:13,320 --> 00:15:14,200 Haz con él lo que sea 298 00:15:14,200 --> 00:15:17,559 Cuando el C que acabas de leer ya sea menos uno 299 00:15:17,559 --> 00:15:18,539 Ya el bucle ha terminado 300 00:15:18,539 --> 00:15:19,639 Porque has sacado el fichero 301 00:15:19,639 --> 00:15:21,759 ¿Vale? Es el típico bucle de lectura 302 00:15:21,759 --> 00:15:23,980 Y aquí con este C 303 00:15:23,980 --> 00:15:26,580 Irá siendo los sucesivos caracteres 304 00:15:26,580 --> 00:15:28,419 Ese C irá siendo los sucesivos caracteres 305 00:15:28,419 --> 00:15:31,019 ¿Qué hacemos con ese C? 306 00:15:31,600 --> 00:15:33,779 Pues lo que nos interesa a nosotros 307 00:15:33,779 --> 00:15:35,720 En nuestro caso en particular 308 00:15:35,720 --> 00:15:36,940 Lo que queríamos era 309 00:15:36,940 --> 00:15:40,320 Leer todos los nombres 310 00:15:40,320 --> 00:15:41,480 ¿Vale? Pues vamos a 311 00:15:41,480 --> 00:15:43,000 Concatenarlo en un string 312 00:15:43,000 --> 00:15:44,340 Y de ahí ya lo sacamos 313 00:15:44,340 --> 00:15:46,759 Por ejemplo, podemos hacer esto 314 00:15:46,759 --> 00:15:59,830 ¿Vale? 315 00:16:00,830 --> 00:16:03,490 Entonces, vamos todos concatenándolo 316 00:16:03,490 --> 00:16:05,169 A un string grande que los tiene todos 317 00:16:05,169 --> 00:16:07,070 Ahora ya los vamos a separar 318 00:16:07,070 --> 00:16:07,970 Y ya está 319 00:16:07,970 --> 00:16:13,629 Vale, este bucle de lectura está entendido 320 00:16:13,629 --> 00:16:15,730 Mientras C, siendo C lo que acabo de leer 321 00:16:15,730 --> 00:16:17,889 No es la marca de fin de archivo 322 00:16:17,889 --> 00:16:19,269 Hago con C lo que sea 323 00:16:19,269 --> 00:16:21,450 Y luego el siguiente, luego el siguiente, luego el siguiente 324 00:16:21,450 --> 00:16:23,629 ¿Vale? Ya está, ese es el bucle de lectura 325 00:16:23,629 --> 00:16:24,230 Y se acabó 326 00:16:24,230 --> 00:16:27,789 Y ahora ya, en particular nosotros, ¿qué estamos haciendo? 327 00:16:27,889 --> 00:16:28,830 Ya para practicar 328 00:16:28,830 --> 00:16:31,090 Bueno, estamos concatenando todos 329 00:16:31,090 --> 00:16:33,649 Entonces, este string 330 00:16:33,649 --> 00:16:35,529 Va a ser todo esto 331 00:16:35,529 --> 00:16:37,269 Este string va a ser 332 00:16:37,269 --> 00:16:39,029 Esta lista de aquí 333 00:16:39,029 --> 00:16:40,909 Este string va a ser todo esto 334 00:16:40,909 --> 00:16:43,710 ¿qué podemos hacer nosotros en nuestro caso particular? 335 00:16:44,070 --> 00:16:45,070 vamos a hacer un split 336 00:16:45,070 --> 00:16:46,909 con el salto de línea, un split 337 00:16:46,909 --> 00:16:48,590 y ya está, ya tenemos los nombres 338 00:16:48,590 --> 00:16:49,889 separados 339 00:16:49,889 --> 00:16:57,169 es decir, vamos a hacernos 340 00:16:57,169 --> 00:16:58,970 yo ya tendré 341 00:16:58,970 --> 00:17:00,389 aquí en S todos los nombres 342 00:17:00,389 --> 00:17:02,769 vale, pues S si yo me hago 343 00:17:02,769 --> 00:17:06,480 un split en torno 344 00:17:06,480 --> 00:17:08,059 al salto de línea 345 00:17:08,059 --> 00:17:12,039 este split 346 00:17:12,039 --> 00:17:14,220 ¿qué me va a dar? un array 347 00:17:14,220 --> 00:17:15,359 con todos los nombres 348 00:17:15,359 --> 00:17:22,859 Y yo un array lo puedo convertir en lista 349 00:17:22,859 --> 00:17:23,319 ¿Verdad? 350 00:17:24,319 --> 00:17:26,359 No hay un método de arrays 351 00:17:26,359 --> 00:17:28,160 As list 352 00:17:28,160 --> 00:17:30,319 Que yo le doy un array 353 00:17:30,319 --> 00:17:31,099 Nombres 354 00:17:31,099 --> 00:17:34,140 Y este para afuera 355 00:17:34,140 --> 00:17:35,000 Return 356 00:17:35,000 --> 00:17:41,000 Porque este leer nombres 357 00:17:41,000 --> 00:17:43,519 Ah no, return no 358 00:17:43,519 --> 00:17:45,200 Porque vamos a guardar directamente aquí en nombres 359 00:17:45,200 --> 00:17:47,960 Pues nombres igual 360 00:17:47,960 --> 00:17:54,529 Nombres igual 361 00:17:54,529 --> 00:17:56,630 A 362 00:17:56,630 --> 00:18:02,400 Ah, no, perdón 363 00:18:02,400 --> 00:18:04,819 Claro, es que esto utiliza el mismo nombre 364 00:18:04,819 --> 00:18:06,839 Vale, pues entonces 365 00:18:06,839 --> 00:18:11,319 En lugar de cambiarle el nombre 366 00:18:11,319 --> 00:18:12,640 Lo voy a hacer más bonito todavía 367 00:18:12,640 --> 00:18:14,900 Porque ya somos todos muy listos 368 00:18:14,900 --> 00:18:17,000 Y ya no hace falta que programemos 369 00:18:17,000 --> 00:18:17,740 Todo el rato algo 370 00:18:17,740 --> 00:18:27,400 ¿Dónde está el salto? 371 00:18:30,450 --> 00:18:31,390 En el bucle 372 00:18:31,390 --> 00:18:33,569 A ver, es que cuando yo esté haciendo 373 00:18:33,569 --> 00:18:36,250 Todos los caracteres en mi fichero 374 00:18:36,250 --> 00:18:39,049 el salto de línea es un carácter también 375 00:18:39,049 --> 00:18:41,430 es decir, mi string va a tener 376 00:18:41,430 --> 00:18:43,710 esto, luego esto concatenado 377 00:18:43,710 --> 00:18:45,549 luego esto, luego este salto de línea 378 00:18:45,549 --> 00:18:47,329 lo va a tener ahí también concatenado 379 00:18:47,329 --> 00:18:49,089 porque es un carácter más 380 00:18:49,089 --> 00:18:51,250 que está leyendo y concatenando 381 00:18:51,250 --> 00:18:53,549 luego este, luego otro 382 00:18:53,549 --> 00:18:55,930 salto de línea que va a leer y que va a concatenar 383 00:18:55,930 --> 00:18:57,369 entonces en este string 384 00:18:57,369 --> 00:18:58,769 ese de aquí 385 00:18:58,769 --> 00:19:01,170 en este string de aquí 386 00:19:01,170 --> 00:19:03,490 van a estar todos estos 387 00:19:03,490 --> 00:19:05,349 char concatenados 388 00:19:05,349 --> 00:19:08,130 incluidos los saltos de línea 389 00:19:08,130 --> 00:19:10,009 todos, que es un char más que está leyendo 390 00:19:10,009 --> 00:19:11,950 es un char más, lo que hay aquí es otro char más 391 00:19:11,950 --> 00:19:12,730 que estará leyendo 392 00:19:12,730 --> 00:19:15,410 entonces este string 393 00:19:15,410 --> 00:19:17,130 de aquí 394 00:19:17,130 --> 00:19:18,930 vale 395 00:19:18,930 --> 00:19:21,589 yo ahora ya lo que quiero hacer con este string 396 00:19:21,589 --> 00:19:24,049 es hacerle un split para que lo separen cachos 397 00:19:24,049 --> 00:19:25,930 esos cachos en torno 398 00:19:25,930 --> 00:19:26,890 a que separador 399 00:19:26,890 --> 00:19:30,269 pues el separador este, el carácter salto de línea 400 00:19:30,269 --> 00:19:32,230 vale 401 00:19:32,230 --> 00:19:33,509 entonces 402 00:19:33,509 --> 00:19:35,890 Este split ya me saca un array 403 00:19:35,890 --> 00:19:37,529 De nombres 404 00:19:37,529 --> 00:19:40,309 Y ese array lo convierto en una lista 405 00:19:40,309 --> 00:19:41,650 Y esa lista la guardo aquí 406 00:19:41,650 --> 00:19:45,690 La guardo aquí, que es esta 407 00:19:45,690 --> 00:19:47,170 La que yo quería rellenar 408 00:19:47,170 --> 00:19:50,970 ¿Vale? ¿Entendido más o menos? 409 00:19:51,609 --> 00:19:52,309 ¿Dónde estamos? 410 00:19:53,170 --> 00:19:53,490 Aquí 411 00:19:53,490 --> 00:20:00,170 ¿Hasta dónde? 412 00:20:01,549 --> 00:20:02,670 ¿Dónde quieres que llegue? 413 00:20:04,809 --> 00:20:06,569 Vale, esta es la excepción 414 00:20:06,569 --> 00:20:10,069 ¿Más? 415 00:20:12,309 --> 00:20:16,259 ¿Qué le pasa al salto de línea? 416 00:20:17,440 --> 00:20:19,500 El salto de línea está aquí 417 00:20:19,500 --> 00:20:21,480 Cuando yo he hecho guardar fichero 418 00:20:21,480 --> 00:20:21,920 Aquí 419 00:20:21,920 --> 00:20:26,480 Sí, sí 420 00:20:26,480 --> 00:20:30,900 ¿El menos uno te lo devuelve cuando la siguiente línea no hay nada? 421 00:20:31,059 --> 00:20:31,960 No, cuando ya está 422 00:20:31,960 --> 00:20:33,279 Cuando el archivo se ha cobrado 423 00:20:33,279 --> 00:20:35,700 Claro, cuando ya leíste el último 424 00:20:35,700 --> 00:20:37,039 Y ese intento ya no vale 425 00:20:37,039 --> 00:20:39,200 Cuando ese intento ya no vale 426 00:20:39,200 --> 00:20:40,839 Otra pregunta 427 00:20:40,839 --> 00:20:44,700 ¿El build solamente te cuenta el primer carácter? 428 00:20:45,579 --> 00:20:46,960 Solo te lee un carácter 429 00:20:46,960 --> 00:20:49,660 Y se queda ya posicionado internamente en el siguiente 430 00:20:49,660 --> 00:20:51,519 por si tú quisieras hacer un siguiente read. 431 00:20:53,079 --> 00:20:55,579 O sea, te va contando carácter por carácter. 432 00:20:55,900 --> 00:20:57,160 Claro, carácter por carácter. 433 00:20:57,160 --> 00:20:58,579 Cada read te pasa al siguiente. 434 00:20:58,839 --> 00:21:00,400 Te lee ese y te pasa al siguiente. 435 00:21:00,980 --> 00:21:03,660 Siguiente read, te lee ese y te apunta al siguiente. 436 00:21:04,799 --> 00:21:06,640 Entonces, cada read te va leyendo 437 00:21:06,640 --> 00:21:09,640 y se queda avanzado una posición para el siguiente read, 438 00:21:09,740 --> 00:21:10,420 si lo hicieras. 439 00:21:16,769 --> 00:21:23,089 La cabecera de leer nombres que está aquí. 440 00:21:24,250 --> 00:21:30,150 file not found excepción 441 00:21:30,150 --> 00:21:30,829 se ha cambiado 442 00:21:30,829 --> 00:21:33,390 claro, porque file not found excepción 443 00:21:33,390 --> 00:21:34,849 hereda de io excepción 444 00:21:34,849 --> 00:21:37,230 entonces al propagar io excepción 445 00:21:37,230 --> 00:21:39,230 ya no hace falta que pongas io excepción 446 00:21:39,230 --> 00:21:41,789 como file not found, porque esa incluye la otra 447 00:21:41,789 --> 00:21:43,789 por eso lo ha eliminado 448 00:21:43,789 --> 00:21:44,509 ¿vale? 449 00:21:45,069 --> 00:21:47,630 de hecho si la forzáramos aquí para que propagara 450 00:21:47,630 --> 00:21:48,210 los dos 451 00:21:48,210 --> 00:21:55,359 file not found, algo me diría al respecto 452 00:21:55,359 --> 00:21:57,539 excepción 453 00:21:57,539 --> 00:22:01,269 me diría 454 00:22:01,269 --> 00:22:04,690 File not found exception 455 00:22:04,690 --> 00:22:05,450 Ya, pero 456 00:22:05,450 --> 00:22:07,869 Si la 457 00:22:07,869 --> 00:22:10,109 Pongo bien 458 00:22:10,109 --> 00:22:12,069 Vale, dejarte deja 459 00:22:12,069 --> 00:22:14,230 Pero es que esta hereda de esta otra 460 00:22:14,230 --> 00:22:15,369 Con lo cual no es necesaria 461 00:22:15,369 --> 00:22:16,789 Vale 462 00:22:16,789 --> 00:22:19,490 La puedes quitar 463 00:22:19,490 --> 00:22:25,769 Que cuando, antes de hacer el file 464 00:22:25,769 --> 00:22:26,230 Reader 465 00:22:26,230 --> 00:22:29,170 No, perdón, antes de hacer el read 466 00:22:29,170 --> 00:22:31,589 Cuando habíamos hecho el new solamente 467 00:22:31,589 --> 00:22:36,470 es decir, si esto no existía 468 00:22:36,470 --> 00:22:37,750 cuando esto no existía 469 00:22:37,750 --> 00:22:40,569 el f real no existía 470 00:22:40,569 --> 00:22:44,289 y yo no había hecho este 471 00:22:44,289 --> 00:22:45,049 throws todavía 472 00:22:45,049 --> 00:22:49,569 cuando ese real no existía, la única 473 00:22:49,569 --> 00:22:51,549 sentencia que podía provocar excepción 474 00:22:51,549 --> 00:22:53,309 era esta, y cuál era 475 00:22:53,309 --> 00:22:54,890 la de file not found exception 476 00:22:54,890 --> 00:22:57,690 entonces yo la digo, venga, la propago 477 00:22:57,690 --> 00:23:00,710 y la tengo aquí propagada 478 00:23:00,710 --> 00:23:02,089 entonces ahora ya 479 00:23:02,089 --> 00:23:04,769 cuando habilito este 480 00:23:04,769 --> 00:23:06,309 esta otra parte 481 00:23:06,309 --> 00:23:09,130 esta otra parte 482 00:23:09,130 --> 00:23:11,069 puede provocar 483 00:23:11,069 --> 00:23:11,890 io exception 484 00:23:11,890 --> 00:23:14,710 entonces si yo la propago 485 00:23:14,710 --> 00:23:16,569 si yo la propago 486 00:23:16,569 --> 00:23:18,849 pues aquí tendría que decir 487 00:23:18,849 --> 00:23:20,730 oye además de file not found exception 488 00:23:20,730 --> 00:23:22,950 además puede 489 00:23:22,950 --> 00:23:24,369 lanzar io 490 00:23:24,369 --> 00:23:26,970 exception 491 00:23:26,970 --> 00:23:28,990 vale 492 00:23:28,990 --> 00:23:30,930 y lo puedo dejar así 493 00:23:30,930 --> 00:23:33,289 y no pasa nada, pero esto es redundante 494 00:23:33,289 --> 00:23:35,190 Porque FileNotFoundException 495 00:23:35,190 --> 00:23:37,009 Hereda de esta otra 496 00:23:37,009 --> 00:23:41,470 Entonces, si lanza IOSception 497 00:23:41,470 --> 00:23:43,470 Estoy ya avisando de que puede lanzar 498 00:23:43,470 --> 00:23:45,109 Cualquiera de las subclases también 499 00:23:45,109 --> 00:23:47,529 Entonces esta la puedo quitar 500 00:23:47,529 --> 00:23:48,950 Que es lo que me ha hecho el Eclipse solo 501 00:23:48,950 --> 00:23:51,769 Lo que me ha hecho el Eclipse solo es quitar esta 502 00:23:51,769 --> 00:24:00,809 Y aquí ya 503 00:24:00,809 --> 00:24:01,930 En algún sitio 504 00:24:01,930 --> 00:24:05,109 Vale 505 00:24:05,109 --> 00:24:06,849 Entonces leer nombres 506 00:24:06,849 --> 00:24:08,849 Pues bueno, ya está 507 00:24:08,849 --> 00:24:10,869 Ya tiene los nombres ahí leídos 508 00:24:10,869 --> 00:24:12,650 Vale 509 00:24:12,650 --> 00:24:17,250 Esta ya me dice 510 00:24:17,250 --> 00:24:18,269 Pues 511 00:24:18,269 --> 00:24:21,009 Trycatch 512 00:24:21,009 --> 00:24:22,650 Lee nombres, ya está 513 00:24:22,650 --> 00:24:25,549 No se ha podido leer 514 00:24:25,549 --> 00:24:27,549 Le ponemos aquí que no se ha podido leer 515 00:24:27,549 --> 00:24:29,130 Lo probamos 516 00:24:29,130 --> 00:24:31,170 Y nos damos por satisfechos 517 00:24:31,170 --> 00:24:37,460 Hacer la lectura 518 00:24:38,140 --> 00:24:47,680 No lo he cerrado 519 00:24:47,680 --> 00:24:48,920 Se me ha olvidado, ¿no? 520 00:24:49,420 --> 00:24:51,720 No, no, no, es que se me ha olvidado cerrarlo 521 00:24:51,720 --> 00:24:53,220 Sí, sí, sí 522 00:24:53,220 --> 00:24:55,460 vale, ahora me tocaría 523 00:24:55,460 --> 00:24:56,339 hacer el 524 00:24:56,339 --> 00:24:59,420 fr.close 525 00:24:59,420 --> 00:25:01,460 vale 526 00:25:01,460 --> 00:25:03,079 vamos a ver si hemos hecho algo mal 527 00:25:03,079 --> 00:25:04,740 entonces voy a eliminar este 528 00:25:04,740 --> 00:25:06,980 para ponerle 529 00:25:06,980 --> 00:25:09,420 en lugar de añadirle 530 00:25:09,420 --> 00:25:11,359 10 nombres, añadirle solo 2 531 00:25:11,359 --> 00:25:13,279 para no estar 532 00:25:13,279 --> 00:25:18,740 aquí, le vamos a añadir 533 00:25:18,740 --> 00:25:19,859 solamente 2 534 00:25:19,859 --> 00:25:23,240 y que cuando escriba 535 00:25:23,240 --> 00:25:25,180 añada los que ya hubiera 536 00:25:25,180 --> 00:25:26,859 En guardar 537 00:25:26,859 --> 00:25:29,480 En guardar nombres 538 00:25:29,480 --> 00:25:31,740 Guardar 539 00:25:31,740 --> 00:25:33,240 Le voy a poner true 540 00:25:33,240 --> 00:25:35,140 Para que me añada los que ya hubiera 541 00:25:35,140 --> 00:25:37,619 Y voy a ver si el funcionamiento 542 00:25:37,619 --> 00:25:39,640 Que sale es coherente o hemos hecho algo raro 543 00:25:39,640 --> 00:25:44,430 Vale, esto es 544 00:25:44,430 --> 00:25:46,970 Lo primero que hace es pedirme el fichero 545 00:25:46,970 --> 00:25:49,089 Para leer los nombres iniciales 546 00:25:49,089 --> 00:25:50,950 Vale, el fichero 547 00:25:50,950 --> 00:25:52,529 Le voy a dar cualquier cosa, no tiene nada 548 00:25:52,529 --> 00:25:54,970 El fichero no va a existir, con lo cual me ignora 549 00:25:54,970 --> 00:25:56,390 Vale, me ignora 550 00:25:56,390 --> 00:25:59,309 Esto que ha hecho ahora es, como el fichero no existe 551 00:25:59,309 --> 00:26:00,549 Ha hecho el leer nombres 552 00:26:00,549 --> 00:26:02,849 Ha hecho este, leer nombres 553 00:26:02,849 --> 00:26:05,609 Pero como el fichero que le he dado no ha existido 554 00:26:05,609 --> 00:26:07,069 Ha salido, y ya está 555 00:26:07,069 --> 00:26:08,950 Eso es lo primero que ha hecho, leer nombres 556 00:26:08,950 --> 00:26:11,630 Ahora, me empieza a pedir los nombres 557 00:26:11,630 --> 00:26:12,750 Que van a ser dos solo 558 00:26:12,750 --> 00:26:14,650 Vale 559 00:26:14,650 --> 00:26:16,390 Este y este 560 00:26:16,390 --> 00:26:19,390 Y en qué fichero 561 00:26:19,390 --> 00:26:21,150 Quiere guardar, pues nombres 562 00:26:21,150 --> 00:26:22,509 Vale 563 00:26:22,509 --> 00:26:28,660 entonces 564 00:26:28,660 --> 00:26:29,859 aquí están 565 00:26:29,859 --> 00:26:33,289 perdón, aquí están 566 00:26:33,289 --> 00:26:35,309 5 567 00:26:35,309 --> 00:26:36,390 refresh 568 00:26:36,390 --> 00:26:39,190 ¿dónde está? 569 00:26:42,180 --> 00:26:43,460 vale, aquí están 570 00:26:43,460 --> 00:26:47,579 venga, ahora 571 00:26:47,579 --> 00:26:49,680 vamos a trabajar con la aplicación 572 00:26:49,680 --> 00:26:51,720 añadiendo otros dos nombres más 573 00:26:51,720 --> 00:26:53,539 entonces lo primero que va a hacer 574 00:26:53,539 --> 00:26:54,400 leer es el fichero 575 00:26:54,400 --> 00:26:57,619 y que yo le ponga añadirlos 576 00:26:57,619 --> 00:26:58,099 a esos 577 00:26:58,099 --> 00:26:59,559 Añadirlos a esos 578 00:26:59,559 --> 00:27:02,160 Pues venga, vamos a ver si hace eso 579 00:27:02,160 --> 00:27:04,039 Nombre del fichero 580 00:27:04,039 --> 00:27:06,279 Lo he llamado nombre sin más, no sin txt 581 00:27:06,279 --> 00:27:08,539 Pues nombre del fichero 582 00:27:08,539 --> 00:27:09,099 Nombres 583 00:27:09,099 --> 00:27:12,599 Entonces, va a leer esos dos 584 00:27:12,599 --> 00:27:14,759 Si lo hemos hecho bien, los va a guardar 585 00:27:14,759 --> 00:27:15,940 En la lista 586 00:27:15,940 --> 00:27:17,640 Se supone que está en la lista 587 00:27:17,640 --> 00:27:19,099 Ahora voy a añadir otros dos 588 00:27:19,099 --> 00:27:24,119 Pues aquí ya hay una cosa que hemos hecho mal 589 00:27:24,119 --> 00:27:25,579 Anx 590 00:27:25,579 --> 00:27:26,859 Eh 591 00:27:26,859 --> 00:27:29,119 Que poca información me da 592 00:27:29,119 --> 00:27:46,980 Uff, qué mal rollo estaba aquí.