1 00:00:02,160 --> 00:00:37,490 Vale, pues nuestra aplicación editor de texto era esta de aquí, que tenía un menú, tenía este menú de aquí, para abrir un nuevo fichero, perdón, crear un fichero nuevo, abrir un fichero, poniendo ahí el contenido de texto que tuviera, guardarlo, guardar como, cerrar, ahora ya podemos hacer todo esto con ficheros. 2 00:00:37,490 --> 00:00:39,710 vale, entonces 3 00:00:39,710 --> 00:00:40,829 vamos a 4 00:00:40,829 --> 00:00:43,890 copiar este proyecto 5 00:00:43,890 --> 00:00:45,810 en otro, para este no tocarle, que este estaba 6 00:00:45,810 --> 00:00:47,850 con la versión de maps, los ficheros 7 00:00:47,850 --> 00:00:50,009 estaban en realidad, eran una variable 8 00:00:50,009 --> 00:00:50,770 string en un map 9 00:00:50,770 --> 00:00:53,770 pues vamos a ver 10 00:00:53,770 --> 00:00:55,729 si yo puedo 11 00:00:55,729 --> 00:01:03,500 a ver si aquí fuera tan listo de hacerme 12 00:01:03,500 --> 00:01:07,769 un copiar 13 00:01:07,769 --> 00:01:09,650 y pegar con otro nombre, yo creo que va a ser 14 00:01:09,650 --> 00:01:11,530 sí, aplicación 15 00:01:11,530 --> 00:01:12,890 editor de texto 2 16 00:01:12,890 --> 00:01:29,010 Vale, pues aquí la tenemos 17 00:01:29,010 --> 00:01:30,209 Editor de texto 2 18 00:01:30,209 --> 00:01:38,810 Bueno, pues ¿dónde estaban nuestros ficheros en este caso? 19 00:01:39,750 --> 00:01:40,469 Estaban aquí 20 00:01:40,469 --> 00:01:43,409 No había ficheros en realidad como tal 21 00:01:43,409 --> 00:01:46,750 Nuestras unidades de trabajo, nuestros ficheros 22 00:01:46,750 --> 00:01:47,829 Eran cadenas 23 00:01:47,829 --> 00:01:51,209 Que estaban guardadas en un map 24 00:01:51,209 --> 00:01:53,849 Este era su contenido 25 00:01:53,849 --> 00:01:55,650 Y este era su nombre 26 00:01:55,650 --> 00:01:57,689 este era su contenido y su nombre 27 00:01:57,689 --> 00:02:00,069 ahora no necesitamos esta clase, ya no necesitamos 28 00:02:00,069 --> 00:02:02,230 porque nuestros ficheros están en el sistema 29 00:02:02,230 --> 00:02:03,629 de archivos con el nombre que sea 30 00:02:03,629 --> 00:02:06,390 esto ya no le necesitamos esta clase 31 00:02:06,390 --> 00:02:08,270 en absoluto 32 00:02:08,270 --> 00:02:10,150 bueno pues entonces 33 00:02:10,150 --> 00:02:12,409 de nuestra aplicación editor de texto 2 34 00:02:12,409 --> 00:02:14,270 todo este paquete de ficheros 35 00:02:14,270 --> 00:02:15,270 ya directamente fuera 36 00:02:15,270 --> 00:02:18,389 no nos hace falta esa clase, nuestros ficheros 37 00:02:18,389 --> 00:02:20,509 están ahora en nuestro sistema de archivos 38 00:02:20,509 --> 00:02:21,550 cada uno con su nombre 39 00:02:21,550 --> 00:02:25,590 vale, y ahora ya si 40 00:02:25,590 --> 00:02:27,590 nuestro editor de texto habrá que cambiar 41 00:02:27,590 --> 00:02:28,770 las funcionalidades. 42 00:02:30,689 --> 00:02:31,009 Ahora, 43 00:02:31,669 --> 00:02:32,770 nuestro editor de texto 44 00:02:32,770 --> 00:02:34,169 tenía 45 00:02:34,169 --> 00:02:37,669 una etiqueta, perdón, una referencia 46 00:02:37,669 --> 00:02:39,889 que era el nombre del archivo 47 00:02:39,889 --> 00:02:41,770 con el que estábamos siempre trabajando. 48 00:02:41,770 --> 00:02:43,449 El nombre del archivo que estaba abierto, 49 00:02:43,889 --> 00:02:45,509 que habíamos creado nuevo, 50 00:02:45,650 --> 00:02:47,729 el nombre del archivo que en ese momento estaba en el editor. 51 00:02:48,509 --> 00:02:50,009 Bueno, pues eso nos sigue valiendo. 52 00:02:50,509 --> 00:02:51,870 El nombre del archivo que está en ese momento 53 00:02:51,870 --> 00:02:53,849 en el editor. Ahora, ¿qué es lo que va a cambiar? 54 00:02:53,849 --> 00:02:56,250 ahora lo que va a cambiar es los eventos 55 00:02:56,250 --> 00:02:58,349 ¿no? ahora ya 56 00:02:58,349 --> 00:03:00,169 pues cuando le demos a 57 00:03:00,169 --> 00:03:03,389 a nuevo 58 00:03:03,389 --> 00:03:05,750 pues no creará un nuevo 59 00:03:05,750 --> 00:03:07,990 estrinometra en el map, no, tendrá que 60 00:03:07,990 --> 00:03:09,889 crear un nuevo archivo y dejarlo ahí 61 00:03:09,889 --> 00:03:11,909 abierto para escribir lo que 62 00:03:11,909 --> 00:03:13,750 fuera, entonces los eventos cambiarán 63 00:03:13,750 --> 00:03:15,990 eso lo único que cambiará, pues venga 64 00:03:15,990 --> 00:03:17,930 vamos a hacer algunos, por ejemplo el de 65 00:03:17,930 --> 00:03:19,909 abrir un archivo, vamos a hacer el de 66 00:03:19,909 --> 00:03:21,930 abrir, vamos a 67 00:03:21,930 --> 00:03:23,830 abrir un archivo de nuestro sistema de archivos 68 00:03:23,830 --> 00:03:25,909 El evento de abrir 69 00:03:25,909 --> 00:03:28,349 Estaba 70 00:03:28,349 --> 00:03:29,409 Aquí 71 00:03:29,409 --> 00:03:33,000 Era este 72 00:03:33,000 --> 00:03:37,710 Vale, pues entonces 73 00:03:37,710 --> 00:03:42,560 Opción nuevo 74 00:03:42,560 --> 00:03:44,460 Vamos a hacer primero la opción abrir 75 00:03:44,460 --> 00:03:45,919 Que es más fácil de entender 76 00:03:45,919 --> 00:03:47,699 Opción abrir 77 00:03:47,699 --> 00:03:49,860 Pues venga, solicitamos nombre de archivo 78 00:03:49,860 --> 00:03:51,800 Pues ya está 79 00:03:51,800 --> 00:03:53,379 El nombre de archivo 80 00:03:53,379 --> 00:03:57,180 Lo cogíamos de 81 00:03:57,180 --> 00:03:59,560 Aquí 82 00:03:59,560 --> 00:04:04,080 introduzca nombre de archivo del jActionPanel 83 00:04:04,080 --> 00:04:04,479 vale 84 00:04:04,479 --> 00:04:06,419 y ahora 85 00:04:06,419 --> 00:04:12,969 ahora 86 00:04:12,969 --> 00:04:14,469 ¿cómo podemos cambiar esto? 87 00:04:14,610 --> 00:04:16,430 para que quede más profesional 88 00:04:16,430 --> 00:04:18,930 en lugar de pedir el nombre de archivo 89 00:04:18,930 --> 00:04:21,089 ¿no teníamos un jFileChooser 90 00:04:21,089 --> 00:04:23,089 que nos permite seleccionar 91 00:04:23,089 --> 00:04:24,589 un nombre de archivo directamente? 92 00:04:25,110 --> 00:04:26,730 en lugar de ponérselo a mano 93 00:04:26,730 --> 00:04:28,730 pues sí, entonces vamos a cambiar 94 00:04:28,730 --> 00:04:29,790 esto 95 00:04:29,790 --> 00:04:31,750 por un jFileChooser 96 00:04:31,750 --> 00:04:33,290 Que se abra 97 00:04:33,290 --> 00:04:35,810 Y nos permita elegir el nombre del archivo 98 00:04:35,810 --> 00:04:36,529 Que queremos abrir 99 00:04:36,529 --> 00:04:37,910 ¿No? 100 00:04:39,050 --> 00:04:41,350 Vale, pues entonces todo esto se va afuera 101 00:04:41,350 --> 00:04:43,230 ¿Vale? Solitar el nombre del archivo 102 00:04:43,230 --> 00:04:44,069 No lo vamos a hacer así 103 00:04:44,069 --> 00:04:46,829 Lo vamos a hacer con un objeto file chooser 104 00:04:46,829 --> 00:04:48,589 Que esto como funcionaba 105 00:04:48,589 --> 00:04:51,509 Pues hacíamos 106 00:04:51,509 --> 00:04:53,970 Un jfilechooser de estos 107 00:04:53,970 --> 00:04:55,930 Este 108 00:04:55,930 --> 00:04:57,550 Si me acordáis en que ejercicio está 109 00:04:57,550 --> 00:04:58,649 Para hacer el 110 00:04:58,649 --> 00:05:01,009 Copia y pega 111 00:05:01,009 --> 00:05:02,750 Y así tardamos menos 112 00:05:02,750 --> 00:05:06,790 Porque este no sé si se podía instanciar 113 00:05:06,790 --> 00:05:08,449 Con el constructor así vacío 114 00:05:08,449 --> 00:05:12,319 Sí, tenía un constructor 115 00:05:12,319 --> 00:05:14,060 Entonces instanciábamos el objeto 116 00:05:14,060 --> 00:05:16,519 Y ahora el JFileChooser este 117 00:05:16,519 --> 00:05:19,300 Tenía para abrir la ventanita 118 00:05:19,300 --> 00:05:20,699 ShowOpen 119 00:05:20,699 --> 00:05:21,899 Esta de aquí 120 00:05:21,899 --> 00:05:24,399 OpenDialog 121 00:05:24,399 --> 00:05:25,019 Vale 122 00:05:25,019 --> 00:05:32,019 Si le poníamos null es que asociado al frame 123 00:05:32,019 --> 00:05:33,620 Y ahora 124 00:05:33,620 --> 00:05:35,939 este nos devolvía en un int 125 00:05:35,939 --> 00:05:38,939 si le habíamos dado a abrir o a cancelar 126 00:05:38,939 --> 00:05:41,740 creo recordar 127 00:05:41,740 --> 00:05:43,480 y ahora 128 00:05:43,480 --> 00:05:45,060 si 129 00:05:45,060 --> 00:05:47,540 la opción 130 00:05:47,540 --> 00:05:50,160 es igual 131 00:05:50,160 --> 00:05:51,339 a 132 00:05:51,339 --> 00:05:59,709 punto 133 00:05:59,709 --> 00:06:01,990 a proof option 134 00:06:01,990 --> 00:06:05,189 a la opción 135 00:06:05,189 --> 00:06:05,810 de 136 00:06:05,810 --> 00:06:08,610 de aceptar 137 00:06:08,610 --> 00:06:10,170 de abrir, sería esta 138 00:06:10,170 --> 00:06:12,089 pues entonces ahora ya que tenemos 139 00:06:12,089 --> 00:06:13,850 recogemos el nombre del archivo 140 00:06:13,850 --> 00:06:16,490 el nombre del archivo, entonces el nombre del archivo 141 00:06:16,490 --> 00:06:18,209 estaría aquí 142 00:06:18,209 --> 00:06:19,329 en 143 00:06:19,329 --> 00:06:21,589 tendría un get, ¿no? 144 00:06:22,509 --> 00:06:23,949 o como era esto 145 00:06:23,949 --> 00:06:36,250 get selected 146 00:06:36,250 --> 00:06:37,449 get 147 00:06:37,449 --> 00:06:43,319 podría ser, pero 148 00:06:43,319 --> 00:06:45,100 no recuerdo 149 00:06:45,100 --> 00:06:47,079 get selected file, ese justo 150 00:06:47,079 --> 00:06:49,040 vale 151 00:06:49,040 --> 00:06:50,639 y esto lo ponemos en nombre 152 00:06:50,639 --> 00:07:00,259 GetSelectedFile 153 00:07:00,259 --> 00:07:01,699 Pero esto no te lo devolvía en 154 00:07:01,699 --> 00:07:03,920 Streams, sino... Ah, te lo devolvía 155 00:07:03,920 --> 00:07:04,800 En File, vale 156 00:07:04,800 --> 00:07:06,480 Entonces 157 00:07:06,480 --> 00:07:09,779 Directamente te lo devuelve ya en 158 00:07:09,779 --> 00:07:11,800 ObjetoFile, con lo cual ya podemos cambiar 159 00:07:11,800 --> 00:07:13,240 Por lo tanto lo que nos interesa ahora 160 00:07:13,240 --> 00:07:16,629 Es esto 161 00:07:16,629 --> 00:07:18,709 File e importamos 162 00:07:18,709 --> 00:07:26,019 Vale, pues ya hemos hecho 163 00:07:26,019 --> 00:07:28,579 Con el FileChooser hemos abierto una ventanita 164 00:07:28,579 --> 00:07:30,300 Y hemos cogido el 165 00:07:30,300 --> 00:07:32,319 ObjetoFile que nos ha devuelto como 166 00:07:32,319 --> 00:07:34,759 Que es el que hemos seleccionado nosotros 167 00:07:34,759 --> 00:07:36,120 y lo hemos guardado aquí 168 00:07:36,120 --> 00:07:38,180 ese es el fichero a abrir 169 00:07:38,180 --> 00:07:39,699 y ahora que tenemos que hacer con él 170 00:07:39,699 --> 00:07:42,779 entonces este do while era 171 00:07:42,779 --> 00:07:43,459 mientras no 172 00:07:43,459 --> 00:07:47,519 mientras no escribas uno que exista 173 00:07:47,519 --> 00:07:48,759 este do while ya no existe 174 00:07:48,759 --> 00:07:50,579 porque lo estamos seleccionando con un file chooser 175 00:07:50,579 --> 00:07:53,060 entonces este do while ya es que no hace ninguna falta 176 00:07:53,060 --> 00:07:58,670 vale pues entonces 177 00:07:58,670 --> 00:08:00,430 ya tenemos 178 00:08:00,430 --> 00:08:02,589 el fichero seleccionado 179 00:08:02,589 --> 00:08:03,730 para abrir en file 180 00:08:03,730 --> 00:08:05,949 ahora nuestro archivo de trabajo 181 00:08:05,949 --> 00:08:07,529 El que ahora se queda abierto 182 00:08:07,529 --> 00:08:08,649 Nuestro archivo de trabajo 183 00:08:08,649 --> 00:08:10,149 Pues 184 00:08:10,149 --> 00:08:11,829 Ahora 185 00:08:11,829 --> 00:08:18,949 Nuestro archivo de trabajo 186 00:08:18,949 --> 00:08:20,410 Ahora tiene mucho más sentido 187 00:08:20,410 --> 00:08:23,410 Que en lugar de guardarlo 188 00:08:23,410 --> 00:08:25,449 En nombre 189 00:08:25,449 --> 00:08:26,250 Que está aquí 190 00:08:26,250 --> 00:08:28,550 Este sea un file 191 00:08:28,550 --> 00:08:31,149 Nuestro archivo de trabajo 192 00:08:31,149 --> 00:08:32,750 Que sea un file, ya tenemos la clase file 193 00:08:32,750 --> 00:08:33,450 Que sea un file 194 00:08:33,450 --> 00:08:38,570 Y ahora ya nuestro archivo de trabajo 195 00:08:38,570 --> 00:08:40,450 Se convierte en 196 00:08:40,450 --> 00:08:41,570 Opción abrir 197 00:08:41,570 --> 00:08:44,409 Se convierte en este 198 00:08:44,409 --> 00:08:45,190 Vale 199 00:08:45,190 --> 00:08:48,490 Ahora nos toca ponerlo en la etiqueta 200 00:08:48,490 --> 00:08:49,129 Ahora ya 201 00:08:49,129 --> 00:08:54,539 Esto era para poner el texto del archivo en la etiqueta 202 00:08:54,539 --> 00:08:55,919 En el text field 203 00:08:55,919 --> 00:08:56,679 Eso lo quitamos 204 00:08:56,679 --> 00:09:00,000 Y esto era para poner el nombre del archivo en la etiqueta nombre archivo 205 00:09:00,000 --> 00:09:02,059 Aquí tendremos que poner 206 00:09:02,059 --> 00:09:03,779 Esto.getName 207 00:09:03,779 --> 00:09:07,289 Este es el objeto file 208 00:09:07,289 --> 00:09:08,690 Y ahora que nos falta aquí 209 00:09:08,690 --> 00:09:12,080 Leer el archivo 210 00:09:12,080 --> 00:09:16,320 Y poner su contenido en el área de texto 211 00:09:16,320 --> 00:09:17,220 Es lo que nos falta 212 00:09:17,220 --> 00:09:23,220 En el área de texto 213 00:09:23,220 --> 00:09:26,590 Esto es lo que antes lo hacíamos 214 00:09:26,590 --> 00:09:28,210 Cogiéndolo del map con el get 215 00:09:28,210 --> 00:09:30,769 Lo cogíamos del map y lo plantamos en el área de texto 216 00:09:30,769 --> 00:09:32,269 Porque el contenido estaba en el map 217 00:09:32,269 --> 00:09:33,809 Ahora el contenido 218 00:09:33,809 --> 00:09:37,029 Lo vamos a sacar abriendo el archivo para leer 219 00:09:37,029 --> 00:09:38,929 Cogiendo los caracteres, etc 220 00:09:38,929 --> 00:09:41,470 Pues venga, ahora ya vamos a leer del archivo 221 00:09:41,470 --> 00:09:42,970 Entonces vamos a hacer un file 222 00:09:42,970 --> 00:09:44,429 Reader 223 00:09:44,429 --> 00:09:47,549 asociado a este archivo 224 00:09:47,549 --> 00:09:49,350 que he cogido del file chooser 225 00:09:49,350 --> 00:09:56,019 que se llama 226 00:09:56,019 --> 00:09:56,539 nombre 227 00:09:56,539 --> 00:10:01,379 o archivo trabajo porque he guardado uno en el otro 228 00:10:01,379 --> 00:10:02,419 me da igual, vale 229 00:10:02,419 --> 00:10:04,700 importamos 230 00:10:04,700 --> 00:10:10,960 file reader, vale 231 00:10:10,960 --> 00:10:12,779 ahora 232 00:10:12,779 --> 00:10:15,559 vamos a concatenar sobre un string 233 00:10:15,559 --> 00:10:17,460 todo el contenido de ese archivo 234 00:10:17,460 --> 00:10:19,559 para luego plantarlo 235 00:10:19,559 --> 00:10:20,539 en el área de texto 236 00:10:20,539 --> 00:10:23,539 Y ahora ya sí que hacemos el bucle de lectura. 237 00:10:30,470 --> 00:10:39,769 Mientras C, siendo C el resultado de leer del archivo sea diferente de menos 1, 238 00:10:41,269 --> 00:10:48,259 ¿qué hacemos? Concatenar sobre contenido. 239 00:10:48,419 --> 00:10:49,940 Con suena contador. 240 00:10:52,299 --> 00:10:55,460 Contenido más igual C. 241 00:10:55,460 --> 00:10:59,240 ala, cuando este bucle ha terminado 242 00:10:59,240 --> 00:11:01,120 ya podemos cerrar el 243 00:11:01,120 --> 00:11:04,519 el file reader 244 00:11:04,519 --> 00:11:07,259 y ahora ya nos falta ponerlo en el área 245 00:11:07,259 --> 00:11:08,659 de texto, que el área de texto 246 00:11:08,659 --> 00:11:10,279 no tenía que haberla borrado 247 00:11:10,279 --> 00:11:12,379 porque ya no sé que área 248 00:11:12,379 --> 00:11:14,539 se llama esta textarea 249 00:11:14,539 --> 00:11:15,100 se llamará 250 00:11:15,100 --> 00:11:18,980 un segundito que me encuentre 251 00:11:18,980 --> 00:11:21,000 que estoy 252 00:11:21,000 --> 00:11:24,740 en opción 253 00:11:25,639 --> 00:11:30,860 estoy 254 00:11:30,860 --> 00:11:33,200 opción abrir, estoy aquí, vale 255 00:11:33,200 --> 00:11:35,440 a ver 256 00:11:35,440 --> 00:11:36,120 que no he puesto 257 00:11:36,120 --> 00:11:42,190 vale, vale, que he puesto 258 00:11:42,190 --> 00:11:43,950 perdón, vale 259 00:11:43,950 --> 00:11:46,509 vale, y ahora en text area 260 00:11:46,509 --> 00:11:48,370 que se llamaba así 261 00:11:48,370 --> 00:11:53,799 ponemos 262 00:11:53,799 --> 00:11:58,019 el contenido que acabamos de leer 263 00:11:58,019 --> 00:12:00,639 contenido 264 00:12:00,639 --> 00:12:02,460 contenido 265 00:12:02,460 --> 00:12:09,419 bueno, pues la opción 266 00:12:09,419 --> 00:12:11,559 de abrir, ahora se transformaría en esto 267 00:12:11,559 --> 00:12:13,220 cojo el file 268 00:12:13,220 --> 00:12:14,580 con el file chooser 269 00:12:14,580 --> 00:12:16,299 cojo el file seleccionado 270 00:12:16,299 --> 00:12:18,200 leo su contenido 271 00:12:18,200 --> 00:12:20,559 y una vez que tengo su contenido 272 00:12:20,559 --> 00:12:21,720 lo coloco en el área de texto 273 00:12:21,720 --> 00:12:24,440 y además fijo mi variable de fichero 274 00:12:24,440 --> 00:12:25,539 con el que estoy trabajando 275 00:12:25,539 --> 00:12:28,100 a ese, la fijo 276 00:12:28,100 --> 00:12:30,340 para que luego en la opción de guardar 277 00:12:30,340 --> 00:12:32,100 pues coja el área de texto 278 00:12:32,100 --> 00:12:34,720 y eso se vaya sobre archivo en el que estoy trabajando 279 00:12:34,720 --> 00:12:38,360 entonces para poder probarlo vamos a 280 00:12:38,360 --> 00:12:40,039 comentar el resto de opciones 281 00:12:40,039 --> 00:12:42,539 porque están mal, claro, porque siguen tirando 282 00:12:42,539 --> 00:12:42,960 del map 283 00:12:42,960 --> 00:12:45,399 Las vamos a comentar todas 284 00:12:45,399 --> 00:12:46,679 Para poder ejecutarlo 285 00:12:46,679 --> 00:12:49,240 La opción de abrir al menos 286 00:12:49,240 --> 00:12:51,860 Vamos a comentar 287 00:12:51,860 --> 00:12:54,419 El resto de opciones 288 00:12:54,419 --> 00:12:55,940 La de guardar 289 00:12:55,940 --> 00:12:57,539 La de nuevo 290 00:12:57,539 --> 00:13:01,080 Que también 291 00:13:01,080 --> 00:13:07,620 Tira de archivos 292 00:13:07,620 --> 00:13:08,279 Con lo cual 293 00:13:08,279 --> 00:13:10,220 Está mal 294 00:13:10,220 --> 00:13:11,120 Vale 295 00:13:11,120 --> 00:13:13,379 Entonces 296 00:13:13,379 --> 00:13:15,740 La de nuevo está comentada 297 00:13:15,740 --> 00:13:17,399 La de abrir es la que acabamos de hacer 298 00:13:17,399 --> 00:13:22,960 La de guardar 299 00:13:22,960 --> 00:13:24,820 Está comentada 300 00:13:24,820 --> 00:13:27,559 La de guardar como también hay que comentarla 301 00:13:27,559 --> 00:13:40,200 La de cerrar 302 00:13:40,200 --> 00:13:41,759 Era ponerlo todo a nulo 303 00:13:41,759 --> 00:13:42,779 Así que esta nos vale 304 00:13:42,779 --> 00:13:44,299 Y luego venían las utilidades 305 00:13:44,299 --> 00:13:48,919 Y me sigue quedando algo aquí 306 00:13:48,919 --> 00:13:50,539 Las excepciones 307 00:13:50,539 --> 00:13:53,620 Ahora ya tengo las excepciones 308 00:13:53,620 --> 00:13:54,440 Estas de aquí 309 00:13:54,440 --> 00:13:57,899 Entonces como estoy en una acción perform 310 00:13:57,899 --> 00:13:59,740 Aquí no tiene sentido que yo haga un throws 311 00:13:59,740 --> 00:14:02,080 Y le ponga el throws a la acción perform 312 00:14:02,080 --> 00:14:04,879 vale, no tiene sentido 313 00:14:04,879 --> 00:14:07,220 es que este método no debería tocarlo 314 00:14:07,220 --> 00:14:09,000 entonces aquí vamos ya a capturar 315 00:14:09,000 --> 00:14:11,139 vamos ya a capturar 316 00:14:11,139 --> 00:14:13,740 y vamos a meter 317 00:14:13,740 --> 00:14:19,470 esto en un try catch 318 00:14:19,470 --> 00:14:21,009 veis, de hecho, ni me ofrece 319 00:14:21,009 --> 00:14:22,490 la opción de throws, ni me la ofrece 320 00:14:22,490 --> 00:14:24,070 pero es que estoy dentro de un método 321 00:14:24,070 --> 00:14:26,990 del que tengo que respetar la cabecera 322 00:14:26,990 --> 00:14:28,549 no puedo añadir en esa cabecera 323 00:14:28,549 --> 00:14:29,230 lo que me dé la gana 324 00:14:29,230 --> 00:14:31,809 vale, pues entonces 325 00:14:31,809 --> 00:14:35,509 Ya hemos metido 326 00:14:35,509 --> 00:14:36,610 Esto en un try catch 327 00:14:36,610 --> 00:14:39,110 ¿Vale? ¿Qué más? 328 00:14:39,649 --> 00:14:41,450 Este también puede dar 329 00:14:41,450 --> 00:14:43,070 Un, pues nada 330 00:14:43,070 --> 00:14:44,470 A try catch también 331 00:14:44,470 --> 00:14:47,470 Ala, y ese también 332 00:14:47,470 --> 00:14:48,590 Pues a try catch 333 00:14:48,590 --> 00:14:53,450 ¿Y qué más tiene? 334 00:14:55,950 --> 00:14:57,370 Error por ahí abajo 335 00:14:57,370 --> 00:15:00,769 Ah, la opción está de nuevo 336 00:15:00,769 --> 00:15:02,429 De aquí 337 00:15:02,429 --> 00:15:15,659 Vale 338 00:15:15,659 --> 00:15:19,460 y aquí arriba esto que ya no existe 339 00:15:19,460 --> 00:15:22,080 esto ya no existe porque he borrado ese paquete 340 00:15:22,080 --> 00:15:25,299 entonces ahora ya la aplicación solamente tiene 341 00:15:25,299 --> 00:15:28,519 funcionalidad la parte del menú de abrir 342 00:15:28,519 --> 00:15:30,799 es la unidad que tiene, que es esta 343 00:15:30,799 --> 00:15:34,539 cuando le demos la de abrir 344 00:15:34,539 --> 00:15:37,059 es la unidad que tiene funcionalidad, el resto no van a hacer nada 345 00:15:37,059 --> 00:15:38,100 porque están todas comentadas 346 00:15:38,100 --> 00:15:41,139 y la única funcionalidad que tiene la de abrir es esto 347 00:15:41,139 --> 00:15:45,059 mediante el file chooser nos permite seleccionar un objeto file 348 00:15:45,059 --> 00:15:47,559 que guardamos aquí, ese objeto file 349 00:15:47,559 --> 00:15:49,720 lo fijamos este como mi archivo de trabajo 350 00:15:49,720 --> 00:15:51,100 a partir de ese momento 351 00:15:51,100 --> 00:15:53,679 para luego las opciones 352 00:15:53,679 --> 00:15:54,639 de guardar 353 00:15:54,639 --> 00:15:57,700 y ahora ya 354 00:15:57,700 --> 00:15:59,620 leemos el contenido 355 00:15:59,620 --> 00:16:01,759 colocamos el área de texto 356 00:16:01,759 --> 00:16:03,379 y listo 357 00:16:03,379 --> 00:16:05,159 venga, pues vamos a 358 00:16:05,159 --> 00:16:07,779 ejecutar el editor de texto 359 00:16:07,779 --> 00:16:09,840 a ver 360 00:16:09,840 --> 00:16:14,309 venga, vamos a abrir uno 361 00:16:14,309 --> 00:16:16,389 pues venga, vamos a abrir 362 00:16:16,389 --> 00:16:20,070 El escritorio 363 00:16:20,070 --> 00:16:22,009 Tengo aquí alguno de texto 364 00:16:22,009 --> 00:16:23,269 Pruebas, ficheros 365 00:16:23,269 --> 00:16:24,909 Ahí tenía uno de texto 366 00:16:24,909 --> 00:16:25,730 A abrir 367 00:16:25,730 --> 00:16:29,950 ¿Esto es lo que tenía en el fichero de texto? 368 00:16:32,149 --> 00:16:34,090 Y me pone aquí el nombre, fichero de texto 369 00:16:34,090 --> 00:16:36,269 Pues tiene toda la pinta de que es muy raro 370 00:16:36,269 --> 00:16:37,549 Que tuvieras en el fichero de texto 371 00:16:37,549 --> 00:16:38,570 Vamos a ver 372 00:16:38,570 --> 00:16:44,850 No lo tengo, ¿qué es lo que ha pasado? 373 00:16:46,629 --> 00:16:47,970 Que no he hecho la conversión 374 00:16:47,970 --> 00:16:49,370 Achar 375 00:16:49,370 --> 00:16:51,370 recordáis que el rea te lee como int 376 00:16:51,370 --> 00:16:53,649 vale, entonces 377 00:16:53,649 --> 00:16:54,409 aquí 378 00:16:54,409 --> 00:16:57,490 cuando contenido 379 00:16:57,490 --> 00:16:59,710 más, vamos a 380 00:16:59,710 --> 00:17:03,210 ahí 381 00:17:03,210 --> 00:17:05,829 yo leo, me lo guarda como entero 382 00:17:05,829 --> 00:17:07,569 lo concateno 383 00:17:07,569 --> 00:17:09,970 lo convierto en char y ya voy concatenando 384 00:17:09,970 --> 00:17:11,750 en contenido que empieza habiendo cero, etc 385 00:17:11,750 --> 00:17:13,730 entonces vamos a poner aquí 386 00:17:13,730 --> 00:17:14,529 un contenido 387 00:17:14,529 --> 00:17:17,890 que se entienda para 388 00:17:17,890 --> 00:17:22,579 a ver 389 00:17:22,579 --> 00:17:25,920 Vamos a ver este archivo si me lo abre el editor nuestro 390 00:17:25,920 --> 00:17:27,299 Este fuera 391 00:17:27,299 --> 00:17:39,980 Vale, pues venga, abrimos 392 00:17:39,980 --> 00:17:44,539 Nos vamos al escritorio 393 00:17:44,539 --> 00:17:46,819 Este, este 394 00:17:46,819 --> 00:17:49,359 Le damos a abrir 395 00:17:49,359 --> 00:17:52,779 Y ahora pues ya me abre el archivo y es este 396 00:17:52,779 --> 00:17:53,400 Vale 397 00:17:53,400 --> 00:17:56,779 Luego podemos implementar nuestra opción de guardar 398 00:17:56,779 --> 00:17:58,240 La de guardar, pues ¿cuál sería? 399 00:17:58,240 --> 00:18:00,940 Pues abrir 400 00:18:00,940 --> 00:18:02,940 El fichero de trabajo 401 00:18:02,940 --> 00:18:05,119 Que es este, abrirlo ahora como file writer 402 00:18:05,119 --> 00:18:06,980 Y escribirle 403 00:18:06,980 --> 00:18:08,599 Esto, y ya está 404 00:18:08,599 --> 00:18:10,519 O sea, yo aquí ya escribo lo que sea 405 00:18:10,519 --> 00:18:13,559 Y ahora cuando le de a guardar 406 00:18:13,559 --> 00:18:15,019 Ahora mismo 407 00:18:15,019 --> 00:18:15,700 Esto no hace nada 408 00:18:15,700 --> 00:18:18,160 Pero que tendría que hacer simplemente 409 00:18:18,160 --> 00:18:20,039 El archivo de trabajo 410 00:18:20,039 --> 00:18:21,900 Abrirlo con el file writer 411 00:18:21,900 --> 00:18:24,440 Y mandarle todo este text area 412 00:18:24,440 --> 00:18:25,500 Y mandárselo 413 00:18:25,500 --> 00:18:26,660 y ya está 414 00:18:26,660 --> 00:18:28,380 sobre escribiendo lo que hubiera 415 00:18:28,380 --> 00:18:30,640 y un mensajito pues ya está, se escribió en el archivo 416 00:18:30,640 --> 00:18:32,319 cuando lo vuelva a abrir 417 00:18:32,319 --> 00:18:34,339 pues volveremos a ver 418 00:18:34,339 --> 00:18:36,259 que efectivamente se ha guardado el archivo, etc 419 00:18:36,259 --> 00:18:39,019 entonces el resto de funcionalidades 420 00:18:39,019 --> 00:18:40,000 pues son 421 00:18:40,000 --> 00:18:41,420 sencillas de hacer 422 00:18:41,420 --> 00:18:44,819 vale, las podéis completar 423 00:18:44,819 --> 00:18:46,359 ya tirando de archivos 424 00:18:46,359 --> 00:18:48,579 si queréis 425 00:18:48,579 --> 00:18:56,930 bueno 426 00:18:56,930 --> 00:19:00,039 dudas 427 00:19:00,039 --> 00:19:03,289 preguntas 428 00:19:03,289 --> 00:19:08,660 vale, pues quedaos con esas clases 429 00:19:08,660 --> 00:19:10,539 FileReader, FileWriter, como se usan 430 00:19:10,539 --> 00:19:12,559 BufferReader cuando quiero leer una línea 431 00:19:12,559 --> 00:19:13,079 de golpe 432 00:19:13,079 --> 00:19:16,640 y la clase 433 00:19:16,640 --> 00:19:17,680 File, claro 434 00:19:17,680 --> 00:19:21,750 vamos a hacer lo del listado recursivo 435 00:19:21,750 --> 00:19:23,109 a ver, ¿lo habéis hecho? 436 00:19:24,690 --> 00:19:25,809 y así probamos la 437 00:19:25,809 --> 00:19:26,410 recursividad 438 00:19:26,410 --> 00:19:30,109 venga, pues vámonos 439 00:19:30,109 --> 00:19:34,490 otra vez a 440 00:19:34,490 --> 00:19:36,069 ejemplos, entrada, salida 441 00:19:36,069 --> 00:19:43,299 aquí 442 00:19:43,299 --> 00:19:52,460 Venga, vamos a hacer un paquete aparte 443 00:19:52,460 --> 00:19:53,460 Para no mezclar 444 00:19:53,460 --> 00:19:55,880 Listado 445 00:19:55,880 --> 00:19:57,160 Recur 446 00:19:57,160 --> 00:20:03,440 El que tenía creado 447 00:20:03,440 --> 00:20:08,819 Sí 448 00:20:08,819 --> 00:20:11,279 Que podía en esa clase haber puesto ese método 449 00:20:11,279 --> 00:20:12,920 Pero bueno, lo hago en una parte 450 00:20:12,920 --> 00:20:15,319 Porque como la recursividad no es algo 451 00:20:15,319 --> 00:20:16,640 Que os vayamos a preguntar 452 00:20:16,640 --> 00:20:18,019 Pues bueno, para que no 453 00:20:18,019 --> 00:20:20,640 Se quede mezclado con el resto 454 00:20:20,640 --> 00:20:22,460 De las clases que sí son 455 00:20:22,460 --> 00:20:23,960 Contenido que os tenéis que estudiar 456 00:20:23,960 --> 00:20:28,970 pero realmente 457 00:20:28,970 --> 00:20:31,589 salir de primero sin haber hecho un poquito 458 00:20:31,589 --> 00:20:33,549 de recursividad, pues hombre, no es deseable 459 00:20:33,549 --> 00:20:35,690 entonces, no está mal 460 00:20:35,690 --> 00:20:36,349 que lo hagamos 461 00:20:36,349 --> 00:20:39,509 pues venga, vamos a hacernos un proyecto cualquiera para meter ese método 462 00:20:39,509 --> 00:20:40,789 y se acabó 463 00:20:40,789 --> 00:20:43,589 listado recursivo 464 00:20:44,490 --> 00:21:04,500 aquí, nueva clase 465 00:21:04,500 --> 00:21:16,059 bueno, pues lo que son 466 00:21:16,059 --> 00:21:16,859 recursivos 467 00:21:16,859 --> 00:21:19,920 son los métodos o las funciones 468 00:21:19,920 --> 00:21:22,460 dicho en términos generales 469 00:21:22,460 --> 00:21:25,460 porque método es la terminología de Java 470 00:21:25,460 --> 00:21:28,339 o en general de la programación orientada a objetos 471 00:21:28,339 --> 00:21:29,279 para llamar a las funciones 472 00:21:29,279 --> 00:21:31,779 pero la función es un concepto más amplio 473 00:21:31,779 --> 00:21:35,559 una función es un trozo de código 474 00:21:35,559 --> 00:21:37,859 que puede ser código de script de un sistema operativo 475 00:21:37,859 --> 00:21:41,319 un trozo de código de SQL 476 00:21:41,319 --> 00:21:44,019 un trozo de código recogido bajo un nombre 477 00:21:44,019 --> 00:21:47,880 y uno lo llama cuando quiere con ese nombre y se ejecuta ese código 478 00:21:47,880 --> 00:21:50,519 en términos generales es lo que significa función 479 00:21:50,519 --> 00:21:54,140 y la programación de entrada de objetos a eso lo llama método 480 00:21:54,140 --> 00:21:57,279 porque tiene la particularidad de que va metida en objetos 481 00:21:57,279 --> 00:21:59,319 en declaraciones de clases 482 00:21:59,319 --> 00:22:03,819 y lo que significa conceptualmente es que son cosas 483 00:22:03,819 --> 00:22:05,920 que los objetos pueden ejecutar 484 00:22:05,920 --> 00:22:07,980 es decir, es comportamiento de los objetos 485 00:22:07,980 --> 00:22:10,980 entonces como tiene unas particularidades relacionadas 486 00:22:10,980 --> 00:22:13,480 con el significado de la programación de entrada de objetos 487 00:22:13,480 --> 00:22:14,920 pues lo llama método, ya está 488 00:22:14,920 --> 00:22:17,000 pero no deja de ser un trozo de código bajo un nombre 489 00:22:17,000 --> 00:22:19,900 bueno, pues lo que pueden ser recursivas 490 00:22:19,900 --> 00:22:24,039 son las funciones o los métodos, como las clases y nada de eso. 491 00:22:24,660 --> 00:22:27,720 Es decir, una función o método recursivo 492 00:22:27,720 --> 00:22:31,319 es el que se llama a sí mismo para 493 00:22:31,319 --> 00:22:36,000 completar su funcionamiento. Necesita llamarse a sí mismo. 494 00:22:36,819 --> 00:22:40,500 Entonces, la recursividad se basa. 495 00:22:42,759 --> 00:22:44,619 Bueno, vamos a hacer esto así. 496 00:22:44,619 --> 00:22:48,779 Vale, pues entonces nuestra función era, lo que nosotros queríamos resolver 497 00:22:48,779 --> 00:22:50,220 era un método 498 00:22:50,220 --> 00:22:52,859 vamos a hacerlo aquí estático 499 00:22:52,859 --> 00:22:53,880 claro, un método 500 00:22:53,880 --> 00:22:58,640 listado de un directorio 501 00:22:58,640 --> 00:23:01,400 donde le pasamos un directorio 502 00:23:01,400 --> 00:23:04,769 y él tiene que 503 00:23:04,769 --> 00:23:06,789 listar todo su contenido 504 00:23:06,789 --> 00:23:10,910 si tiene subcarpetas 505 00:23:10,910 --> 00:23:12,730 a su vez el contenido de subcarpetas y así 506 00:23:12,730 --> 00:23:14,950 todo el rato, entonces eso es lo que tiene que hacer 507 00:23:14,950 --> 00:23:16,769 una vez que hemos tenido lo que tiene que hacer 508 00:23:16,769 --> 00:23:18,430 pues ahora ya vamos mirando que 509 00:23:18,430 --> 00:23:20,309 métodos tenemos para ayudarnos 510 00:23:20,309 --> 00:23:22,970 bueno, pues nosotros ya vimos ayer 511 00:23:22,970 --> 00:23:23,349 que 512 00:23:23,349 --> 00:23:26,470 la clase file 513 00:23:26,470 --> 00:23:28,630 tiene 514 00:23:28,630 --> 00:23:30,670 un método 515 00:23:30,670 --> 00:23:32,670 para listar el contenido 516 00:23:32,670 --> 00:23:34,829 de directorio, de hecho tiene varios 517 00:23:34,829 --> 00:23:37,150 list files te lo da ya 518 00:23:37,150 --> 00:23:38,630 como array de file 519 00:23:38,630 --> 00:23:39,910 y list 520 00:23:39,910 --> 00:23:42,210 te da un array de los nombres 521 00:23:42,210 --> 00:23:44,569 entonces hombre, es más práctico el list file 522 00:23:44,569 --> 00:23:45,789 porque te lo da ya en file 523 00:23:45,789 --> 00:23:47,690 y de file puedes sacar mucha información 524 00:23:47,690 --> 00:23:50,470 el list te da solo el nombre del archivo 525 00:23:50,470 --> 00:23:52,369 tendrías que volver a hacer luego 526 00:23:52,369 --> 00:23:54,289 el new file, si quieres meterte en él 527 00:23:54,289 --> 00:23:56,230 lo que fuera, entonces el list file es más práctico 528 00:23:56,230 --> 00:23:58,130 porque te da toda la lista de objetos 529 00:23:58,130 --> 00:24:00,349 files contenido, entonces 530 00:24:00,349 --> 00:24:01,410 este método 531 00:24:01,410 --> 00:24:06,289 ya nos permite sacar todo 532 00:24:06,289 --> 00:24:07,549 el contenido 533 00:24:07,549 --> 00:24:09,609 de ese directorio 534 00:24:09,609 --> 00:24:10,890 ¿vale? 535 00:24:13,049 --> 00:24:18,079 entonces, ahora esto 536 00:24:18,079 --> 00:24:20,119 simplemente, pues tendríamos que ir 537 00:24:20,119 --> 00:24:22,059 uno por uno, ¿verdad? 538 00:24:24,940 --> 00:24:26,460 para cada file 539 00:24:26,460 --> 00:24:28,240 f en contenido 540 00:24:28,240 --> 00:24:31,779 ¿qué ocurre? 541 00:24:32,420 --> 00:24:33,440 aquí ya 542 00:24:33,440 --> 00:24:35,000 si f es fichero 543 00:24:35,000 --> 00:24:37,099 ya está, lo único que hay que hacer 544 00:24:37,099 --> 00:24:38,279 es 545 00:24:38,279 --> 00:24:41,359 mostrar su nombre 546 00:24:41,359 --> 00:24:42,740 se acabó 547 00:24:42,740 --> 00:24:45,839 entonces, ¿cómo sabemos si f es fichero 548 00:24:45,839 --> 00:24:47,420 o directorio? 549 00:24:47,779 --> 00:24:49,160 porque tenemos un método 550 00:24:49,160 --> 00:24:50,799 que es 551 00:24:50,799 --> 00:24:53,240 isFile 552 00:24:53,240 --> 00:24:55,240 entonces si es file, entonces 553 00:24:55,240 --> 00:24:57,559 si esto me da true, o no hace falta 554 00:24:57,559 --> 00:24:58,859 que ponga true, claro 555 00:24:58,859 --> 00:25:01,319 entonces ahora ya simplemente mostramos 556 00:25:01,319 --> 00:25:02,200 por consola 557 00:25:02,200 --> 00:25:05,839 f.getName 558 00:25:05,839 --> 00:25:09,339 y ala 559 00:25:09,339 --> 00:25:12,400 ¿pero qué ocurre? 560 00:25:13,339 --> 00:25:15,200 si f es directorio 561 00:25:15,200 --> 00:25:24,160 si f es directorio 562 00:25:24,160 --> 00:25:26,279 pues entonces ahora 563 00:25:26,279 --> 00:25:28,299 ¿qué tenemos que hacer? 564 00:25:29,259 --> 00:25:29,599 pues 565 00:25:29,599 --> 00:25:32,299 listar todo el 566 00:25:32,299 --> 00:25:33,220 contenido de f 567 00:25:33,220 --> 00:25:34,940 listar todo su contenido 568 00:25:34,940 --> 00:25:38,359 ¿cómo listamos todo su contenido? 569 00:25:38,920 --> 00:25:40,279 pues podríamos 570 00:25:40,279 --> 00:25:42,500 otra vez hacer f list files 571 00:25:42,500 --> 00:25:46,359 y otra vez nos tendríamos que meter en un for 572 00:25:46,359 --> 00:25:48,200 y luego para 573 00:25:48,200 --> 00:25:50,380 dentro de ese for en el save 574 00:25:50,380 --> 00:25:52,680 otra vez hacer un list file 575 00:25:52,680 --> 00:25:54,299 eso no acabaría nunca 576 00:25:54,299 --> 00:25:56,200 pero es que claro, tenemos un método 577 00:25:56,200 --> 00:25:58,339 que se llama listado directorio que ya lo hace 578 00:25:58,339 --> 00:26:00,319 o que pretendemos que lo haga 579 00:26:00,319 --> 00:26:02,500 tenemos un método listado directorio 580 00:26:02,500 --> 00:26:03,900 que está pensado para que 581 00:26:03,900 --> 00:26:06,400 cuando le damos un objeto 582 00:26:06,400 --> 00:26:07,799 que es directorio lo liste 583 00:26:07,799 --> 00:26:10,259 ya tenemos un método que lo hace, pues es que es justo lo que queremos 584 00:26:10,259 --> 00:26:12,319 hacer con F. Es justo lo que queremos 585 00:26:12,319 --> 00:26:13,859 hacer. Queremos 586 00:26:13,859 --> 00:26:16,220 pasárselo al método listarDirectorio para 587 00:26:16,220 --> 00:26:18,299 que lo liste. Pues ya está. Si ya tenemos un método 588 00:26:18,299 --> 00:26:20,140 que lo hace, pues venga. 589 00:26:31,559 --> 00:26:32,700 Ya está. Ya lo tenemos. 590 00:26:32,900 --> 00:26:34,819 Entonces no hay que tenerle miedo a la recursividad. 591 00:26:35,440 --> 00:26:37,140 Porque la recursividad nos permite 592 00:26:37,140 --> 00:26:39,099 resolver cosas aparente complicadas 593 00:26:39,099 --> 00:26:40,059 en un pispás. 594 00:26:41,420 --> 00:26:43,180 Lo que pasa es que lo dificultoso 595 00:26:43,180 --> 00:26:45,099 la recursividad es identificar 596 00:26:45,099 --> 00:26:46,420 cuándo un problema 597 00:26:46,420 --> 00:26:48,819 se puede resolver de forma recursiva 598 00:26:48,819 --> 00:26:50,480 y cuándo no tiene ningún sentido. 599 00:26:50,980 --> 00:26:53,240 eso es lo único difícil 600 00:26:53,240 --> 00:26:55,720 entonces en este caso está claro 601 00:26:55,720 --> 00:26:57,779 esta función que tiene que hacer 602 00:26:57,779 --> 00:26:59,859 tiene que listar 603 00:26:59,859 --> 00:27:01,720 el contenido de un directorio 604 00:27:01,720 --> 00:27:04,039 que yo le paso, esa es su funcionalidad 605 00:27:04,039 --> 00:27:06,180 pues resulta que eso es justo 606 00:27:06,180 --> 00:27:08,259 lo que queremos hacer en este punto 607 00:27:08,259 --> 00:27:09,799 listar el contenido 608 00:27:09,799 --> 00:27:12,039 de este f, es justo eso lo que queremos 609 00:27:12,039 --> 00:27:13,960 hacer, pues entonces no hay que tener ningún miedo 610 00:27:13,960 --> 00:27:14,500 en llamarla 611 00:27:14,500 --> 00:27:17,859 porque 612 00:27:17,859 --> 00:27:19,940 lo que queremos hacer con este f 613 00:27:19,940 --> 00:27:21,700 es justo el propósito 614 00:27:21,700 --> 00:27:23,460 para el que yo he diseñado esta función 615 00:27:23,460 --> 00:27:26,500 es justo el mismo propósito 616 00:27:26,500 --> 00:27:28,299 entonces ahí no hay que tener miedo 617 00:27:28,299 --> 00:27:29,740 en llamar a la función recursivamente 618 00:27:29,740 --> 00:27:33,990 claro, el problema de la recursividad 619 00:27:33,990 --> 00:27:35,349 es si nunca jamás acabara 620 00:27:35,349 --> 00:27:37,730 porque si nunca jamás acabara 621 00:27:37,730 --> 00:27:39,829 cada vez que hacemos una llamada recursiva 622 00:27:39,829 --> 00:27:41,890 en la pila del proceso 623 00:27:41,890 --> 00:27:43,670 se va metiendo el contador de programa 624 00:27:43,670 --> 00:27:45,289 para luego cuando salgas de la recursividad 625 00:27:45,289 --> 00:27:46,009 irlo sacando 626 00:27:46,009 --> 00:27:49,970 entonces, si nunca jamás acabara 627 00:27:49,970 --> 00:27:52,109 la pila de llamadas 628 00:27:52,109 --> 00:27:54,390 la pila desbordaría 629 00:27:54,390 --> 00:27:56,809 y petaría 630 00:27:56,809 --> 00:27:58,309 el programa y petaría el ordenador 631 00:27:58,309 --> 00:28:00,309 pero es que claro que va a acabar 632 00:28:00,309 --> 00:28:02,670 porque mi sistema de archivos no es 633 00:28:02,670 --> 00:28:04,670 infinito, llegará un momento en que ya 634 00:28:04,670 --> 00:28:06,269 no haya ninguna subcarpeta 635 00:28:06,269 --> 00:28:07,269 no es infinito 636 00:28:07,269 --> 00:28:09,789 ¿vale? entonces no hay miedo 637 00:28:09,789 --> 00:28:12,130 en llamar a recursividad, primero 638 00:28:12,130 --> 00:28:14,470 uno, cuando hemos 639 00:28:14,470 --> 00:28:15,890 identificado que es un caso 640 00:28:15,890 --> 00:28:18,569 que tiene sentido plantearlo de forma recursiva 641 00:28:18,569 --> 00:28:27,890 Y es cuando lo que yo tengo que hacer dentro, en un punto concreto, es exactamente para lo que estoy diseñando el método. 642 00:28:28,390 --> 00:28:31,910 Cuando eso ocurre, entonces lo puedo llamar sin ningún miedo. 643 00:28:32,069 --> 00:28:37,990 ¿Y a qué ocurre? Lo que yo quiero hacer con este f es exactamente lo mismo para lo cual yo estoy diseñando este método. 644 00:28:38,269 --> 00:28:39,569 Pues no hay ningún problema, lo llamo. 645 00:28:40,230 --> 00:28:42,009 Y ahora, siguiente pregunta que me tengo que hacer. 646 00:28:42,009 --> 00:28:44,930 esta recursividad 647 00:28:44,930 --> 00:28:46,450 de llamarse, llamarse, llamarse 648 00:28:46,450 --> 00:28:47,970 va a acabar alguna vez 649 00:28:47,970 --> 00:28:51,109 si estamos en un problema en el que va a acabar 650 00:28:51,109 --> 00:28:52,950 porque es un problema de árbol finito 651 00:28:52,950 --> 00:28:54,910 si es un problema en el que 652 00:28:54,910 --> 00:28:57,029 no va a acabar nunca, entonces la he planteado 653 00:28:57,029 --> 00:28:58,970 mal o tengo que plantearla de otra manera 654 00:28:58,970 --> 00:29:00,450 o estoy en un problema que no es 655 00:29:00,450 --> 00:29:03,150 ya habría que ver, en este caso no hay problema 656 00:29:03,150 --> 00:29:05,470 va a acabar porque el árbol de directorios 657 00:29:05,470 --> 00:29:07,349 es finito, no hay un sistema de archivos 658 00:29:07,349 --> 00:29:09,029 hasta el infinito 659 00:29:09,029 --> 00:29:13,049 bueno pues venga vamos a probarlo 660 00:29:13,049 --> 00:29:14,670 y entonces esto 661 00:29:14,670 --> 00:29:16,869 que a priori parecería complicadísimo 662 00:29:16,869 --> 00:29:18,309 tengo que irme metiendo, irme metiendo 663 00:29:18,309 --> 00:29:21,009 al darle la solución recursiva se convierte 664 00:29:21,009 --> 00:29:21,410 en nada 665 00:29:21,410 --> 00:29:24,029 entonces la recursividad 666 00:29:24,029 --> 00:29:26,509 da códigos muy cortitos 667 00:29:26,509 --> 00:29:28,970 pero muy peligrosos 668 00:29:28,970 --> 00:29:30,349 si no lo hemos planteado bien 669 00:29:30,349 --> 00:29:31,869 y la recursividad no acaba 670 00:29:31,869 --> 00:29:34,450 entonces vamos a probarlo aquí 671 00:29:34,450 --> 00:29:36,509 a ver que nos sale 672 00:29:36,509 --> 00:29:48,619 vale, pues vamos a listar 673 00:29:48,619 --> 00:29:50,119 el directorio actual y ya está 674 00:29:50,119 --> 00:29:53,759 listado 675 00:29:53,759 --> 00:29:56,299 directorio 676 00:29:56,299 --> 00:29:59,619 le vamos a dar 677 00:29:59,619 --> 00:30:02,059 new file 678 00:30:02,059 --> 00:30:05,720 el actual, que es la raíz del proyecto 679 00:30:05,720 --> 00:30:07,759 entonces me tiene que sacar todo lo que tengo 680 00:30:07,759 --> 00:30:09,759 en mi proyecto, con la carpeta bin, src 681 00:30:09,759 --> 00:30:10,319 la que sea 682 00:30:10,319 --> 00:30:13,200 y así meterse en una tras otra 683 00:30:13,200 --> 00:30:15,440 vamos a ejecutarlo a ver que pasa 684 00:30:15,440 --> 00:30:25,930 me lo ha sacado todo 685 00:30:25,930 --> 00:30:30,230 porque claro, vale 686 00:30:30,230 --> 00:30:31,690 estos son ficheros 687 00:30:31,690 --> 00:30:33,630 donde hay un directorio 688 00:30:33,630 --> 00:30:37,799 Un directorio está 689 00:30:37,799 --> 00:30:49,210 Ah, vale, los nombres de directorio 690 00:30:49,210 --> 00:30:50,130 No me los está poniendo 691 00:30:50,130 --> 00:30:51,829 Me está poniendo nombres de ficheros 692 00:30:51,829 --> 00:30:53,609 En el directorio se está metiendo 693 00:30:53,609 --> 00:30:54,769 Pero no me está poniendo el nombre 694 00:30:54,769 --> 00:30:58,349 Entonces me falta antes poner el nombre 695 00:30:58,349 --> 00:30:59,349 Y luego ya que se meta 696 00:30:59,349 --> 00:31:01,589 Entonces se están saltando los nombres de directorios 697 00:31:01,589 --> 00:31:06,079 F.getName 698 00:31:06,079 --> 00:31:07,819 Que lo podía sacar fuera del if, pero bueno 699 00:31:07,819 --> 00:31:09,339 Vale 700 00:31:09,339 --> 00:31:11,259 Vamos a volver a probarlo 701 00:31:11,259 --> 00:31:15,599 Entonces 702 00:31:15,599 --> 00:31:19,420 efectivamente me está sacando 703 00:31:19,420 --> 00:31:20,500 todo lo que hay 704 00:31:20,500 --> 00:31:22,599 este es un directorio 705 00:31:22,599 --> 00:31:23,940 src bin 706 00:31:23,940 --> 00:31:25,819 y se está metiendo en bin 707 00:31:25,819 --> 00:31:28,599 porque aquí está el ejemplo file.class 708 00:31:28,599 --> 00:31:29,220 que está en bin 709 00:31:29,220 --> 00:31:31,859 pero es dificilísimo de interpretar 710 00:31:31,859 --> 00:31:34,579 como nos gustaría que sacara el directorio 711 00:31:34,579 --> 00:31:36,339 y luego lo que está dentro del directorio 712 00:31:36,339 --> 00:31:38,039 nos lo metiera al menos tabulado 713 00:31:38,039 --> 00:31:38,640 o algo así 714 00:31:38,640 --> 00:31:42,099 porque así es que es complicadísimo de entender 715 00:31:42,099 --> 00:31:48,130 pero esto ya implica retocar esto 716 00:31:48,130 --> 00:31:50,309 Vamos a retocarlo para que quede bonito 717 00:31:50,309 --> 00:31:51,789 Y ya lo dejamos 718 00:31:51,789 --> 00:31:52,549 Que esto es 719 00:31:52,549 --> 00:31:55,390 Un poquito más complicado de entender 720 00:31:55,390 --> 00:31:57,109 Hasta aquí lo que hemos hecho está claro 721 00:31:57,109 --> 00:31:58,490 Y por qué lo hemos planteado así 722 00:31:58,490 --> 00:32:01,170 Y hemos visto que efectivamente 723 00:32:01,170 --> 00:32:02,970 Me va entrando en todo el árbol 724 00:32:02,970 --> 00:32:04,410 Me va entrando en todo 725 00:32:04,410 --> 00:32:07,190 Me va mostrando directorios, lo que hay dentro 726 00:32:07,190 --> 00:32:08,730 Pero claro, como me lo muestra todo seguido 727 00:32:08,730 --> 00:32:09,950 No entendemos nada 728 00:32:09,950 --> 00:32:12,009 Pero está entrando en todo el árbol entero 729 00:32:12,009 --> 00:32:14,210 No ha habido un solo archivo o carpeta 730 00:32:14,210 --> 00:32:16,549 Que cuelgue de aquí 731 00:32:16,549 --> 00:32:18,430 de ejemplo que no me lo haya mostrado 732 00:32:18,430 --> 00:32:20,549 todo lo que hay, me lo ha mostrado 733 00:32:20,549 --> 00:32:21,769 todo 734 00:32:21,769 --> 00:32:23,710 lo que pasa es que bueno 735 00:32:23,710 --> 00:32:26,430 que un poco 736 00:32:26,430 --> 00:32:28,509 desordenado 737 00:32:28,509 --> 00:32:30,190 vale, pues ¿cómo podemos arreglar esto? 738 00:32:32,569 --> 00:32:34,309 vale, pues hombre, sería lo ideal 739 00:32:34,309 --> 00:32:35,970 que cada vez que entra 740 00:32:35,970 --> 00:32:38,230 en listado directorio, cada vez que entra 741 00:32:38,230 --> 00:32:40,529 todos los system out 742 00:32:40,529 --> 00:32:41,589 que hace 743 00:32:41,589 --> 00:32:44,230 los hiciera con una tabulación, por ejemplo 744 00:32:44,230 --> 00:32:45,990 cada vez que entra aquí 745 00:32:45,990 --> 00:32:47,490 los hiciera con una tabulación más 746 00:32:47,490 --> 00:32:49,549 por ejemplo 747 00:32:49,549 --> 00:32:52,589 entonces, esto después de mucho pensar 748 00:32:52,589 --> 00:32:53,890 nos ahorramos todo el pensamiento 749 00:32:53,890 --> 00:32:56,130 podríamos hacer, vale, pues vamos a 750 00:32:56,130 --> 00:32:58,750 al listado directorio pasarle un siguiente 751 00:32:58,750 --> 00:33:00,289 parámetro, que sea 752 00:33:00,289 --> 00:33:02,609 el orden de profundidad en el que 753 00:33:02,609 --> 00:33:04,309 vas a hacer tu system out print del n 754 00:33:04,309 --> 00:33:06,670 y entonces, cada vez que llames 755 00:33:06,670 --> 00:33:08,549 al listado directorio, cada vez que hagas una llamada 756 00:33:08,549 --> 00:33:10,650 recursiva, dale un orden 757 00:33:10,650 --> 00:33:12,690 de profundidad mayor, y así cada llamada 758 00:33:12,690 --> 00:33:14,950 recursiva entra con un orden de profundidad 759 00:33:14,950 --> 00:33:16,730 mayor para su system out print del n 760 00:33:16,730 --> 00:33:18,750 Es decir, me explico 761 00:33:18,750 --> 00:33:20,589 Al listado directorio vamos a darle un string 762 00:33:20,589 --> 00:33:22,670 Además, un parámetro añadido 763 00:33:22,670 --> 00:33:24,289 Que sea 764 00:33:24,289 --> 00:33:26,269 La profundidad 765 00:33:26,269 --> 00:33:28,329 Que va a concatenar a su system out 766 00:33:28,329 --> 00:33:29,809 ¿Vale? 767 00:33:30,670 --> 00:33:33,049 Entonces, su system out le vamos a concatenar 768 00:33:33,049 --> 00:33:34,569 Con esa profundidad 769 00:33:34,569 --> 00:33:37,049 Con esa profundidad 770 00:33:37,049 --> 00:33:39,150 Y ahora, cuando llamamos 771 00:33:39,150 --> 00:33:40,730 Al listado directorio 772 00:33:40,730 --> 00:33:43,430 Lo llamamos concatenándole 773 00:33:43,430 --> 00:33:45,509 Un tabulador nuevo 774 00:33:45,509 --> 00:33:46,910 un tabulador más 775 00:33:46,910 --> 00:33:50,829 a el anterior 776 00:33:50,829 --> 00:33:53,130 e inicialmente que sea 777 00:33:53,130 --> 00:33:54,690 esto 778 00:33:54,690 --> 00:33:57,960 repetimos 779 00:33:57,960 --> 00:34:00,579 inicialmente yo le paso un orden de profundidad 780 00:34:00,579 --> 00:34:02,660 que es vacío, le paso uno que es vacío 781 00:34:02,660 --> 00:34:04,400 vale, él va a concatenar 782 00:34:04,400 --> 00:34:05,599 con el vacío 783 00:34:05,599 --> 00:34:08,300 pero cuando llamo recursivamente 784 00:34:08,300 --> 00:34:10,360 a lo que tuviera de antes, le pongo 785 00:34:10,360 --> 00:34:12,559 un tabulador, entonces la siguiente llamada 786 00:34:12,559 --> 00:34:14,320 al listado directorio concatenará 787 00:34:14,320 --> 00:34:14,980 en un tabulador 788 00:34:14,980 --> 00:34:17,880 la siguiente llamada 789 00:34:17,880 --> 00:34:20,239 le concatenará otro más al que ya tenía 790 00:34:20,239 --> 00:34:22,340 la siguiente 791 00:34:22,340 --> 00:34:24,719 le concatenará otro más al que ya tenía 792 00:34:24,719 --> 00:34:26,340 entonces cada llamada recursiva 793 00:34:26,340 --> 00:34:27,960 todo su system out 794 00:34:27,960 --> 00:34:30,320 los hace un tabulador más a la derecha 795 00:34:30,320 --> 00:34:32,440 una solución de las muchas 796 00:34:32,440 --> 00:34:33,599 que se le podría haber ocurrido 797 00:34:33,599 --> 00:34:38,150 entonces esto ya 798 00:34:38,150 --> 00:34:40,750 se ve mejor 799 00:34:40,750 --> 00:34:43,690 aquí ya 800 00:34:43,690 --> 00:34:46,349 pues vemos, esta es una carpeta 801 00:34:46,349 --> 00:34:47,969 esta carpeta bin 802 00:34:47,969 --> 00:34:49,309 Tiene a su vez la carpeta file 803 00:34:49,309 --> 00:34:50,909 Y la carpeta file tiene este fichero 804 00:34:50,909 --> 00:34:54,409 Luego, esta cuelga de bin 805 00:34:54,409 --> 00:34:56,170 Que a su vez tiene esta 806 00:34:56,170 --> 00:34:57,530 Entonces aquí ya sí que se ve 807 00:34:57,530 --> 00:34:58,809 Todos esos son ficheros, ficheros 808 00:34:58,809 --> 00:35:00,750 Aquí de nuevo tenemos una carpeta 809 00:35:00,750 --> 00:35:02,329 Con su contenido 810 00:35:02,329 --> 00:35:05,710 Esto ya sí que lo vemos un poco más bonito 811 00:35:05,710 --> 00:35:06,530 No todo 812 00:35:06,530 --> 00:35:09,630 Todo seguido como lo estábamos viendo antes 813 00:35:09,630 --> 00:35:09,849 Ahora 814 00:35:09,849 --> 00:35:13,730 De aquí a aquí, como viene una carpeta 815 00:35:13,730 --> 00:35:15,050 Se ha tenido que meter recursivamente 816 00:35:15,050 --> 00:35:17,050 Por eso me ha metido un tabulador más 817 00:35:17,050 --> 00:35:18,190 me ha metido todo este tabulador 818 00:35:18,190 --> 00:35:19,869 ahora 819 00:35:19,869 --> 00:35:22,829 en file, como era una carpeta 820 00:35:22,829 --> 00:35:24,789 metió otro tabulador, por eso metió este 821 00:35:24,789 --> 00:35:28,289 ¿vale? y esto ya era un fichero 822 00:35:28,289 --> 00:35:30,170 pues ya lo imprimió con los dos tabuladores 823 00:35:30,170 --> 00:35:32,090 con este y con este 824 00:35:32,090 --> 00:35:34,449 y salimos de la recursión y nos colocamos 825 00:35:34,449 --> 00:35:34,730 aquí 826 00:35:34,730 --> 00:35:37,630 bueno, esto 827 00:35:37,630 --> 00:35:40,190 lo podéis mirar despacio, tranquilamente 828 00:35:40,190 --> 00:35:42,570 para entenderlo 829 00:35:42,570 --> 00:35:44,309 porque bueno, es interesante 830 00:35:44,309 --> 00:35:46,369 pero la conclusión 831 00:35:46,369 --> 00:35:47,429 aquí es 832 00:35:47,429 --> 00:35:49,369 que hay problemas 833 00:35:49,369 --> 00:35:52,369 que de forma natural son recursivos 834 00:35:52,369 --> 00:35:53,530 de forma natural lo son 835 00:35:53,530 --> 00:35:55,349 porque se resuelven 836 00:35:55,349 --> 00:35:58,369 apoyándose en ellos mismos 837 00:35:58,369 --> 00:35:59,690 de forma natural 838 00:35:59,690 --> 00:36:01,489 el factorial, muchos 839 00:36:01,489 --> 00:36:03,869 problemas se resuelven de forma recursiva 840 00:36:03,869 --> 00:36:05,170 este 841 00:36:05,170 --> 00:36:07,789 cuando hay juegos, por ejemplo 842 00:36:07,789 --> 00:36:09,050 los que se van eliminando a gente 843 00:36:09,050 --> 00:36:12,150 es un juego, el resultado del juego 844 00:36:12,150 --> 00:36:14,130 es eliminar a unos y se vuelve 845 00:36:14,130 --> 00:36:15,989 a jugar, pues entonces ese método 846 00:36:15,989 --> 00:36:17,909 juego se tendrá que llamar a sí mismo 847 00:36:17,909 --> 00:36:19,590 lo que pasa es que cada vez con menos jugadores 848 00:36:19,590 --> 00:36:21,650 por ejemplo, entonces hay problemas 849 00:36:21,650 --> 00:36:23,269 que de forma natural son recursivos 850 00:36:23,269 --> 00:36:25,349 que lo que cambian son 851 00:36:25,349 --> 00:36:27,670 los parámetros de ese juego 852 00:36:27,670 --> 00:36:28,849 los parámetros de ese problema 853 00:36:28,849 --> 00:36:31,250 entonces los que de forma natural son recursivos 854 00:36:31,250 --> 00:36:33,769 se hace un método recursivo sin ningún miedo 855 00:36:33,769 --> 00:36:35,849 y en el momento 856 00:36:35,849 --> 00:36:37,670 en el cual necesites llamarte a ti mismo 857 00:36:37,670 --> 00:36:39,130 te llamas y no pasa nada 858 00:36:39,130 --> 00:36:42,010 te llamas, pero eso sí, siempre hay que asegurarse 859 00:36:42,010 --> 00:36:43,070 que alguna vez va a acabar 860 00:36:43,070 --> 00:36:45,909 este problema, un juego que va eliminando 861 00:36:45,909 --> 00:36:47,369 gente y cada vez se juega con menos 862 00:36:47,369 --> 00:36:49,769 pues dentro del método juego al que le pasas 863 00:36:49,769 --> 00:36:51,250 primero una raya así de mil personas 864 00:36:51,250 --> 00:36:53,809 pues él se irá llamando a sí mismo pero cada vez 865 00:36:53,809 --> 00:36:54,909 le pasas una raya más pequeñito 866 00:36:54,909 --> 00:36:57,889 entonces ahí la pregunta sería ¿llegará un momento en que ya 867 00:36:57,889 --> 00:36:59,769 no le pases jugadores porque se han acabado? 868 00:36:59,849 --> 00:37:01,809 hombre pues sí, porque la raya llega al momento en que se 869 00:37:01,809 --> 00:37:03,789 acabe, pues sí, entonces aquí no tendrás ese 870 00:37:03,789 --> 00:37:05,769 problema, eso es el tipo de 871 00:37:05,769 --> 00:37:07,829 cuestiones que tenéis que pensar cuando 872 00:37:07,829 --> 00:37:09,809 se hacen cosas recursivas, pero claro 873 00:37:09,809 --> 00:37:11,969 la recursividad tiene que acabar 874 00:37:11,969 --> 00:37:13,510 imaginaos que hacemos aquí 875 00:37:13,510 --> 00:37:15,030 un 876 00:37:15,030 --> 00:37:18,610 un método 877 00:37:18,610 --> 00:37:21,150 con una recursividad que no acaba nunca 878 00:37:21,150 --> 00:37:22,969 por ejemplo 879 00:37:22,969 --> 00:37:23,869 vamos a hacer 880 00:37:23,869 --> 00:37:28,420 este método 881 00:37:28,420 --> 00:37:32,260 que lo que hace es llamarse a sí mismo 882 00:37:32,260 --> 00:37:35,199 no hay ningún problema 883 00:37:35,199 --> 00:37:36,260 es un método recursivo 884 00:37:36,260 --> 00:37:39,480 ¿esta recursividad va a acabar alguna vez? 885 00:37:39,699 --> 00:37:40,179 jamás 886 00:37:40,179 --> 00:37:42,500 va a estar todo el rato llamándose 887 00:37:42,500 --> 00:37:43,900 no va a acabar nunca 888 00:37:43,900 --> 00:37:46,380 ¿qué pasa si yo ejecuto esto? 889 00:37:47,460 --> 00:37:48,300 vamos a 890 00:37:48,300 --> 00:37:52,099 Llamar a ese método recursivo 891 00:37:52,099 --> 00:37:53,440 Que no acaba nunca 892 00:37:53,440 --> 00:37:54,280 Está mal planteado 893 00:37:54,280 --> 00:37:55,619 Un método recursivo que no acaba nunca 894 00:37:55,619 --> 00:37:56,420 Está mal planteado 895 00:37:56,420 --> 00:37:58,739 Pues ahora ejecutamos esto 896 00:37:58,739 --> 00:38:03,929 Y como era de prever 897 00:38:03,929 --> 00:38:06,949 Pues después de hacer 898 00:38:06,949 --> 00:38:08,409 200.000 intentos 899 00:38:08,409 --> 00:38:11,849 Una vez que los he hecho todos 900 00:38:11,849 --> 00:38:12,349 Me dice 901 00:38:12,349 --> 00:38:14,889 Error, ni siquiera excepción 902 00:38:14,889 --> 00:38:15,969 Porque esto ya es grave 903 00:38:15,969 --> 00:38:18,449 Me dice, pues te has cargado la pila del proceso 904 00:38:18,449 --> 00:38:20,550 pues ya está, porque no puedes 905 00:38:20,550 --> 00:38:22,289 hacer tantas recursiones 906 00:38:22,289 --> 00:38:24,670 aquí habrá hecho, si nos pusiéramos a contar 907 00:38:24,670 --> 00:38:26,670 que son 908 00:38:26,670 --> 00:38:27,949 muchas, no podemos contar 909 00:38:27,949 --> 00:38:30,230 veríamos cuánto cabe 910 00:38:30,230 --> 00:38:32,489 en la pila, si vamos 911 00:38:32,489 --> 00:38:34,429 una por una veríamos cuántos contadores de 912 00:38:34,429 --> 00:38:36,090 programa caben en la pila del proceso 913 00:38:36,090 --> 00:38:38,369 pero hombre, es un poco loco estar aquí 914 00:38:38,369 --> 00:38:40,349 contando lo tras otro, cuando ya la pila del proceso 915 00:38:40,349 --> 00:38:42,309 se ha acabado, dice, ya no puedo llamar 916 00:38:42,309 --> 00:38:44,050 recursivamente más, es imposible 917 00:38:44,050 --> 00:38:51,579 venga, pues paramos otro momentito