1 00:00:00,000 --> 00:00:13,980 Vale 2 00:00:13,980 --> 00:00:16,620 A ver 3 00:00:16,620 --> 00:00:19,760 Persistencia 4 00:00:19,760 --> 00:00:28,010 ¿Vosotros qué os gusta organizar vuestra vida en temas? 5 00:00:28,010 --> 00:00:29,170 Pues sería un tema 6 00:00:29,170 --> 00:00:30,269 ¿Vale? 7 00:00:31,570 --> 00:00:46,469 ¿Qué es la persistencia de datos? La persistencia de datos consiste en que los datos que mi aplicación maneja sean, valga la redundancia, persistentes. 8 00:00:46,469 --> 00:00:48,270 o lo que es lo mismo 9 00:00:48,270 --> 00:00:51,229 que yo pueda vivir despreocupada 10 00:00:51,229 --> 00:00:52,990 de cuando mi aplicación 11 00:00:52,990 --> 00:00:55,149 reinicia, se apaga 12 00:00:55,149 --> 00:00:56,469 la dejo apagada 13 00:00:56,469 --> 00:00:58,450 porque estoy instalando una versión nueva 14 00:00:58,450 --> 00:01:00,329 lo que sea, pueda vivir despreocupada 15 00:01:00,329 --> 00:01:02,469 de que esos datos que mi aplicación maneja 16 00:01:02,469 --> 00:01:03,909 se van a perder 17 00:01:03,909 --> 00:01:04,810 ¿vale? 18 00:01:06,129 --> 00:01:08,150 normalmente las aplicaciones lógicamente 19 00:01:08,150 --> 00:01:10,129 trabajan con las colecciones 20 00:01:10,129 --> 00:01:12,209 de usuarios, de password, de lo que sea 21 00:01:12,209 --> 00:01:14,090 todo eso está almacenado 22 00:01:14,090 --> 00:01:15,969 en algún sitio, sean ficheros 23 00:01:15,969 --> 00:01:21,430 sean bases de datos. Nuestra aplicación trabaja con esos datos, pero nuestra aplicación jamás 24 00:01:21,430 --> 00:01:27,890 trabaja con los datos directamente en el soporte de almacenamiento, sea base de datos o fichero, 25 00:01:28,150 --> 00:01:34,129 ¿verdad? Sea una base de datos o sea un fichero, que es donde realmente están los datos de 26 00:01:34,129 --> 00:01:40,989 mi aplicación, usuarios, contraseñas, mis facturas, sean los que sean, mi programa 27 00:01:40,989 --> 00:01:43,189 java jamás 28 00:01:43,189 --> 00:01:45,250 va a trabajar con ellos 29 00:01:45,250 --> 00:01:46,930 directamente aquí, es imposible 30 00:01:46,930 --> 00:01:48,750 porque mi aplicación java 31 00:01:48,750 --> 00:01:50,769 solamente puede trabajar 32 00:01:50,769 --> 00:01:53,209 modificar, crear, eliminar 33 00:01:53,209 --> 00:01:55,189 solamente puede trabajar 34 00:01:55,189 --> 00:01:56,469 con datos que estén 35 00:01:56,469 --> 00:02:00,260 en la memoria RAM, solamente 36 00:02:00,260 --> 00:02:02,819 ¿vale? entonces nosotros 37 00:02:02,819 --> 00:02:04,680 hasta ahora, pues todas 38 00:02:04,680 --> 00:02:05,819 nuestras aplicaciones 39 00:02:05,819 --> 00:02:08,860 creaban los datos de nuevas, de buenas 40 00:02:08,860 --> 00:02:10,740 a primeras, los creaban 41 00:02:10,740 --> 00:02:13,979 ¿Cómo? Pues insertándolos por consola 42 00:02:13,979 --> 00:02:15,960 Los insertábamos por consola en ese momento 43 00:02:15,960 --> 00:02:17,680 Y se creaban 44 00:02:17,680 --> 00:02:19,580 Y ya está, entonces nuestra aplicación estaba 45 00:02:19,580 --> 00:02:21,740 Condenada a que hubiera siempre un tío delante 46 00:02:21,740 --> 00:02:23,699 Sentado para meter 47 00:02:23,699 --> 00:02:25,900 Los datos y en ese momento crear los datos 48 00:02:25,900 --> 00:02:27,759 En memoria RAM, operar y hacer 49 00:02:27,759 --> 00:02:28,280 Lo que fuera 50 00:02:28,280 --> 00:02:31,580 Cuando la aplicación terminaba, pues lógicamente 51 00:02:31,580 --> 00:02:32,659 Todos estos datos 52 00:02:32,659 --> 00:02:34,699 Pues han desaparecido 53 00:02:34,699 --> 00:02:37,740 Luego, lo más que ha 54 00:02:37,740 --> 00:02:39,680 Podido ocurrir es que el resultado 55 00:02:39,680 --> 00:02:40,819 lo hayamos visto 56 00:02:40,819 --> 00:02:42,580 en la consola 57 00:02:42,580 --> 00:02:45,159 entonces de nuevo nuestra aplicación está condenada 58 00:02:45,159 --> 00:02:46,719 que haya un tío ahí sentado 59 00:02:46,719 --> 00:02:49,300 esperando que la aplicación muestre 60 00:02:49,300 --> 00:02:51,199 las cosas en la consola para que él vaya 61 00:02:51,199 --> 00:02:53,060 a, vale, viendo esos resultados 62 00:02:53,060 --> 00:02:54,400 bueno 63 00:02:54,400 --> 00:02:57,199 pues esa es una aplicación que no 64 00:02:57,199 --> 00:02:59,000 tiene persistencia, ¿vale? 65 00:02:59,840 --> 00:03:01,199 entonces bueno, en ciertos contextos 66 00:03:01,199 --> 00:03:03,219 pues ya está, yo meto los datos y obtengo el resultado 67 00:03:03,219 --> 00:03:05,159 que quería, ¿vale? no tiene persistencia 68 00:03:05,159 --> 00:03:07,199 bueno, pero claro 69 00:03:07,199 --> 00:03:09,500 no es lo habitual, lo habitual en una aplicación 70 00:03:09,500 --> 00:03:11,360 es que la aplicación trabaje 71 00:03:11,360 --> 00:03:13,319 con datos que están 72 00:03:13,319 --> 00:03:15,300 en algún sitio, pues como hemos dicho 73 00:03:15,300 --> 00:03:17,280 antes del tipo, un montón de facturas 74 00:03:17,280 --> 00:03:19,219 de usuarios, de contraseñas, todo eso 75 00:03:19,219 --> 00:03:21,240 no lo podemos introducir cada vez 76 00:03:21,240 --> 00:03:23,219 que la aplicación arranca, lógicamente lo podemos 77 00:03:23,219 --> 00:03:25,319 introducir, todo eso son millones 78 00:03:25,319 --> 00:03:27,139 de datos que están en algún sitio 79 00:03:27,139 --> 00:03:29,400 sea base de datos o fichero 80 00:03:29,400 --> 00:03:30,960 que no se pierde nunca, ahí están 81 00:03:30,960 --> 00:03:33,199 pero mi aplicación no puede 82 00:03:33,199 --> 00:03:35,400 trabajar con ellos, entonces mi aplicación 83 00:03:35,400 --> 00:03:37,500 los tiene que volcar de alguna manera 84 00:03:37,500 --> 00:03:40,080 a variables 85 00:03:40,080 --> 00:03:42,360 cuando ya 86 00:03:42,360 --> 00:03:44,300 estén volcados, mi aplicación trabaja 87 00:03:44,300 --> 00:03:44,759 con ellos 88 00:03:44,759 --> 00:03:47,560 y cuando mi aplicación se cierra 89 00:03:47,560 --> 00:03:50,020 de alguna manera, pues eso tiene que ir 90 00:03:50,020 --> 00:03:51,960 otra vez al soporte 91 00:03:51,960 --> 00:03:54,439 pues esa tarea 92 00:03:54,439 --> 00:03:55,099 no es trivial 93 00:03:55,099 --> 00:03:57,319 claro, esa tarea de 94 00:03:57,319 --> 00:03:59,560 hacer esa conexión 95 00:03:59,560 --> 00:04:02,199 esa sincronización entre lo que hay 96 00:04:02,199 --> 00:04:04,620 aquí y lo que hay aquí, hacer esa sincronización 97 00:04:04,620 --> 00:04:06,500 para que mi aplicación 98 00:04:06,500 --> 00:04:07,860 trabaje con estos datos 99 00:04:07,860 --> 00:04:10,539 sabiendo que son los que 100 00:04:10,539 --> 00:04:11,699 realmente están aquí 101 00:04:11,699 --> 00:04:14,439 y que cuando la aplicación termina sepa 102 00:04:14,439 --> 00:04:16,139 que estos datos vuelven aquí 103 00:04:16,139 --> 00:04:17,759 pues esa sincronización 104 00:04:17,759 --> 00:04:18,860 no es trivial 105 00:04:18,860 --> 00:04:21,980 si la conseguimos hacer 106 00:04:21,980 --> 00:04:24,339 eso es lo que convierte a una aplicación 107 00:04:24,339 --> 00:04:26,500 en una aplicación persistente 108 00:04:26,500 --> 00:04:32,689 entonces una aplicación persistente 109 00:04:32,689 --> 00:04:34,689 trabaja con sus datos en memoria RAM como todas 110 00:04:34,689 --> 00:04:36,449 porque tienen que estar ahí, no hay otra 111 00:04:36,449 --> 00:04:38,810 Trabaja con sus datos en RAM 112 00:04:38,810 --> 00:04:41,089 Pero estos datos de alguna manera 113 00:04:41,089 --> 00:04:43,649 Estarán sincronizados con los que están aquí 114 00:04:43,649 --> 00:04:44,689 De alguna manera 115 00:04:44,689 --> 00:04:49,660 Y ese de alguna manera 116 00:04:49,660 --> 00:04:51,680 Pues ahí ya se abre 117 00:04:51,680 --> 00:04:54,560 Se abre un mundo gigantesco 118 00:04:54,560 --> 00:04:56,660 Y ese de alguna manera 119 00:04:56,660 --> 00:04:58,500 Ese tenerlo conectado 120 00:04:58,500 --> 00:05:00,360 Ese cómo me aseguro yo 121 00:05:00,360 --> 00:05:01,620 Que aquello con lo que trabajo 122 00:05:01,620 --> 00:05:02,600 Es lo que estaba aquí 123 00:05:02,600 --> 00:05:04,060 Cómo me aseguro yo 124 00:05:04,060 --> 00:05:05,459 Que los cambios que haga 125 00:05:05,459 --> 00:05:06,800 Se guardan aquí 126 00:05:06,800 --> 00:05:09,839 ¿Y ese de alguna manera cómo hago esta sincronización? 127 00:05:11,199 --> 00:05:14,300 Pues eso es un mundo gigantesco 128 00:05:14,300 --> 00:05:19,399 y es, para que no os hagáis ilusiones, 129 00:05:19,399 --> 00:05:20,860 no lo vamos a ver ahora, 130 00:05:21,459 --> 00:05:24,800 porque para eso está un módulo entero de segundo 131 00:05:24,800 --> 00:05:26,300 que es exclusivamente eso, 132 00:05:26,939 --> 00:05:28,480 que se llama acceso a datos. 133 00:05:29,819 --> 00:05:33,199 Entonces, este módulo de segundo es exclusivamente eso. 134 00:05:33,680 --> 00:05:34,120 ¿Por qué? 135 00:05:34,120 --> 00:05:36,480 porque para eso hay todo un mundo entero 136 00:05:36,480 --> 00:05:37,839 de frameworks, porque 137 00:05:37,839 --> 00:05:40,439 de hacer bien esta sincronización 138 00:05:40,439 --> 00:05:42,519 depende que mi aplicación 139 00:05:42,519 --> 00:05:44,720 tenga sentido o sea una caca 140 00:05:44,720 --> 00:05:46,720 de hacer bien esta sincronización 141 00:05:46,720 --> 00:05:48,699 porque lo que sí que está 142 00:05:48,699 --> 00:05:50,399 claro es que lo que no vamos a poder eludir 143 00:05:50,399 --> 00:05:52,540 salvo en aplicaciones muy de mierdecilla 144 00:05:52,540 --> 00:05:54,240 sencillas, lo que no vamos a poder eludir 145 00:05:54,240 --> 00:05:56,660 es que mi aplicación trabaje con un modelo 146 00:05:56,660 --> 00:05:58,360 de base de datos bestial 147 00:05:58,360 --> 00:05:59,939 eso no lo vamos a poder eludir 148 00:05:59,939 --> 00:06:02,439 que trabaje con una base de datos con tropecientas mil 149 00:06:02,439 --> 00:06:04,319 tablas, con relaciones, con cosas. 150 00:06:04,459 --> 00:06:06,459 Eso no se va a poder eludir. Cualquier aplicación va a 151 00:06:06,459 --> 00:06:08,500 tener una base de datos con 30.000 tablas. 152 00:06:09,540 --> 00:06:10,620 Entonces, la tarea 153 00:06:10,620 --> 00:06:12,339 de yo hacer mi humilde aplicación 154 00:06:12,339 --> 00:06:14,319 con sus variables aquí y que 155 00:06:14,319 --> 00:06:15,459 eso automáticamente 156 00:06:15,459 --> 00:06:18,259 quede reflejado en el soporte 157 00:06:18,259 --> 00:06:20,579 permanente, pues eso 158 00:06:20,579 --> 00:06:24,420 como no es trivial, hay tropecientos mil 159 00:06:24,420 --> 00:06:26,339 frameworks. Cuando digo 160 00:06:26,339 --> 00:06:28,319 frameworks me refiero a clases 161 00:06:28,319 --> 00:06:29,899 que hay que configurar, que usar 162 00:06:29,899 --> 00:06:33,120 para simular precisamente esto, 163 00:06:33,439 --> 00:06:36,040 para simular ese efecto de persistencia, ¿vale? 164 00:06:36,100 --> 00:06:39,060 Y eso, pues bueno, se ve todo eso 165 00:06:39,060 --> 00:06:41,660 en este módulo entero de segundo, ¿vale? 166 00:06:42,959 --> 00:06:44,579 Entonces, ¿aquí qué vamos a hacer ahora? 167 00:06:45,139 --> 00:06:46,620 La parte que queda para primero 168 00:06:46,620 --> 00:06:49,000 es como una especie de 169 00:06:49,000 --> 00:06:52,279 yo puedo querer hacer mi persistencia si quiero, 170 00:06:52,740 --> 00:06:54,620 es decir, quiero tener la posibilidad 171 00:06:54,620 --> 00:06:56,600 de guardar mis cosas y que no se pierdan, 172 00:06:57,199 --> 00:06:58,360 pero de una manera más sencilla, 173 00:06:58,360 --> 00:07:18,680 No tengo por qué recurrir siempre a frameworks gigantescos porque no siempre tengo una base de datos con 200.000 tablas. Hombre, también quiero yo, si me hago mi aplicación con mis libros, mis cosas, pues poder guardarlo en un fichero y tenerlo ahí que cuando la aplicación arranca vuelva otra vez, ¿vale? También sería una aplicación persistente, pero hecha más a mano por nosotros, ¿vale? 174 00:07:18,680 --> 00:07:33,019 Bueno, pues, ¿qué parte queda para primero entonces? Pues en lugar de guardar los datos en base de datos y sincronizarnos con una base de datos, hacerlo en fichero, que también puede ser perfectamente. 175 00:07:33,019 --> 00:07:42,300 Es decir, los datos de mi aplicación 176 00:07:42,300 --> 00:07:45,660 Estos datos que están aquí en la memoria RAM 177 00:07:45,660 --> 00:07:50,019 Pues yo tengo mis objetos, mi lista de objetos 178 00:07:50,019 --> 00:07:51,139 Lo que sea, lo tengo ahí 179 00:07:51,139 --> 00:07:53,699 Yo quiero que cuando la aplicación termine eso se quede guardadito 180 00:07:53,699 --> 00:07:57,300 Bueno, pues podemos escribirlo en un fichero 181 00:07:57,300 --> 00:07:58,579 Y ya está 182 00:07:58,579 --> 00:08:02,300 Cuando mi aplicación arranca yo puedo programarlo 183 00:08:02,300 --> 00:08:05,139 Para que lo primero que haga sea si este fichero existe 184 00:08:05,139 --> 00:08:06,860 Porque hay ya datos iniciales 185 00:08:06,860 --> 00:08:08,759 Pues antes de nada, cárgame los que hay. 186 00:08:08,920 --> 00:08:11,339 Y yo aquí trabajo y hago mis cosas y ya está. 187 00:08:12,500 --> 00:08:14,959 Entonces, esto es este temita que hay ahora, 188 00:08:16,100 --> 00:08:17,500 el de acceso a ficheros. 189 00:08:23,560 --> 00:08:25,379 Entonces, ¿para qué nos va a servir este tema? 190 00:08:25,459 --> 00:08:28,240 Primero, para conocer el acceso a ficheros básico, claro. 191 00:08:29,180 --> 00:08:31,139 Y segundo, para usarlo, sobre todo, 192 00:08:31,240 --> 00:08:32,240 que es la parte más interesante, 193 00:08:32,419 --> 00:08:35,259 para usarlo para seguir practicando programación. 194 00:08:36,720 --> 00:08:39,039 Para usarlo para seguir practicando lo que nos ocupa ahora, 195 00:08:39,039 --> 00:08:41,700 que es aprender a programar y llegar a segundo programando, 196 00:08:41,820 --> 00:08:43,919 bien, con soltura y sin perdernos 197 00:08:43,919 --> 00:08:45,879 y sin cometer errores demasiado 198 00:08:45,879 --> 00:08:48,100 horarios, ¿vale? 199 00:08:48,159 --> 00:08:49,500 pues esto es lo que vamos a ver ahora 200 00:08:49,500 --> 00:08:51,659 acceso a ficheros desde 201 00:08:51,659 --> 00:08:52,980 mis aplicaciones Java 202 00:08:52,980 --> 00:08:55,860 ¿vale? el acceso a bases 203 00:08:55,860 --> 00:08:56,399 de datos 204 00:08:56,399 --> 00:08:59,840 lo dejamos así en gordote 205 00:08:59,840 --> 00:09:01,080 para el curso que viene 206 00:09:01,080 --> 00:09:06,500 vale, pues venga 207 00:09:06,500 --> 00:09:20,460 bueno, pues ya sabéis que cualquier aplicación Java 208 00:09:20,460 --> 00:09:22,279 es un montón de clases que hacen cosas 209 00:09:22,279 --> 00:09:23,200 ya lo sabéis 210 00:09:23,200 --> 00:09:25,519 o bien clases que ya están 211 00:09:25,519 --> 00:09:28,059 en la JRE 212 00:09:28,059 --> 00:09:30,200 y que yo uso, pues como la clase 213 00:09:30,200 --> 00:09:32,299 Scanner que hemos usado, la clase 214 00:09:32,299 --> 00:09:34,299 ArrayList, la clase 215 00:09:34,299 --> 00:09:36,460 LinkedList, o bien clases que ya están y que yo 216 00:09:36,460 --> 00:09:38,539 uso, o bien clases que me invento 217 00:09:38,539 --> 00:09:40,299 yo, ¿vale? Pero en la gran mayoría 218 00:09:40,299 --> 00:09:42,399 de las veces lo que hacemos es usar clases que ya están 219 00:09:42,399 --> 00:09:44,379 hechas y esas clases me ofrecen 220 00:09:44,379 --> 00:09:46,379 métodos para hacer cosas. Bueno, 221 00:09:46,480 --> 00:09:47,600 pues eso es lo que vamos a hacer aquí. 222 00:09:48,659 --> 00:09:50,360 Conocer las clases básicas 223 00:09:50,360 --> 00:09:51,559 que ya están hechas 224 00:09:51,559 --> 00:09:54,320 y que me permiten hacer cosas con 225 00:09:54,320 --> 00:09:56,320 ficheros, escribir en ellos 226 00:09:56,320 --> 00:09:57,440 leerlos, etc. 227 00:09:57,980 --> 00:09:59,779 Todas esas clases que ya están hechas 228 00:09:59,779 --> 00:10:02,440 pues de toda la vida 229 00:10:02,440 --> 00:10:05,970 estaban en un 230 00:10:05,970 --> 00:10:06,649 paquetito 231 00:10:06,649 --> 00:10:09,690 que es Java.io que está 232 00:10:09,690 --> 00:10:11,889 en la JRE, con lo cual no tenemos que 233 00:10:11,889 --> 00:10:12,470 importarlo 234 00:10:12,470 --> 00:10:17,120 y luego se incorporaron algunas 235 00:10:17,120 --> 00:10:19,059 modificaciones, algunas 236 00:10:19,059 --> 00:10:20,379 clases nuevas 237 00:10:20,379 --> 00:10:23,240 en Java.io 238 00:10:23,240 --> 00:10:24,840 para optimizar 239 00:10:24,840 --> 00:10:27,200 el uso de las 240 00:10:27,200 --> 00:10:29,159 clases de esta de aquí, pero vamos 241 00:10:29,159 --> 00:10:30,919 esencialmente el funcionamiento es el mismo 242 00:10:30,919 --> 00:10:33,399 y estas son las básicas 243 00:10:33,399 --> 00:10:35,299 ¿vale? pero bueno, vamos a mencionar un poquito 244 00:10:35,299 --> 00:10:36,519 las clases 245 00:10:36,519 --> 00:10:39,179 básicas de las dos son las que vamos a 246 00:10:39,179 --> 00:10:41,259 mencionar y ya está, ¿vale? estos serían los dos 247 00:10:41,259 --> 00:10:43,120 paquetes, para que nos pongamos 248 00:10:43,120 --> 00:10:45,059 en contexto, que tienen las clases básicas 249 00:10:45,059 --> 00:10:47,100 para acceder a ficheros, serían 250 00:10:47,100 --> 00:10:50,870 estos dos, ¿vale? 251 00:10:51,470 --> 00:10:53,509 bueno, pues un poquito por encima, ¿qué clases 252 00:10:53,509 --> 00:10:54,830 hay ahí? ¿qué tenemos? 253 00:10:56,049 --> 00:10:57,409 vale, pues si yo quiero trabajar 254 00:10:57,409 --> 00:10:58,309 con un fichero 255 00:10:58,309 --> 00:11:00,909 necesito 256 00:11:00,909 --> 00:11:02,669 un objeto que me lo represente 257 00:11:02,669 --> 00:11:03,549 porque en Java 258 00:11:03,549 --> 00:11:06,529 todo lo que puede hacer lo tiene que hacer 259 00:11:06,529 --> 00:11:08,330 con objetos, todo, es que no hay otra 260 00:11:08,330 --> 00:11:09,309 lo tiene que hacer con objetos 261 00:11:09,309 --> 00:11:12,389 bueno, pues si yo necesito un fichero que es mi primer 262 00:11:12,389 --> 00:11:14,350 mi primer recurso 263 00:11:14,350 --> 00:11:16,710 ajeno a la aplicación, trabajar con él 264 00:11:16,710 --> 00:11:18,370 pues necesito un objeto Java 265 00:11:18,370 --> 00:11:20,090 que me lo represente asociado a él 266 00:11:20,090 --> 00:11:21,629 y yo trabajo con ese objeto Java 267 00:11:21,629 --> 00:11:24,649 vale, pues ¿cuál es la clase Java 268 00:11:24,649 --> 00:11:30,059 que representa 269 00:11:30,059 --> 00:11:31,200 el objeto fichero? 270 00:11:31,799 --> 00:11:52,860 File, la clase file de java.io es la clase java que representa un objeto fichero, entonces yo quiero trabajar con un fichero para pasárselo como parámetro a un método para que haga cosas con él, para hacer cosas con él, pues lo que suelo hacer es instanciar un objeto file asociado a ese fichero, ¿vale? 271 00:11:52,860 --> 00:11:55,480 Asociado a ese ficherito 272 00:11:55,480 --> 00:11:58,100 Y ahora ya la clase file 273 00:11:58,100 --> 00:11:59,600 Este objeto que yo instancio 274 00:11:59,600 --> 00:12:00,840 Asociado a este ficherito 275 00:12:00,840 --> 00:12:02,799 Pues ya me ofrece 276 00:12:02,799 --> 00:12:06,019 Un montón de métodos para hacer unas cuantas cosas 277 00:12:06,019 --> 00:12:09,299 ¿Vale? Pues por ejemplo 278 00:12:09,299 --> 00:12:11,700 Ver si existe, ver que permisos tengo 279 00:12:11,700 --> 00:12:12,419 Sobre él 280 00:12:12,419 --> 00:12:14,799 En general me permite 281 00:12:14,799 --> 00:12:17,519 Me ofrece a través de los métodos 282 00:12:17,519 --> 00:12:19,159 Información sobre este fichero 283 00:12:19,159 --> 00:12:22,059 Información, no todavía lecturas y escrituras 284 00:12:22,059 --> 00:12:24,340 no, información sobre 285 00:12:24,340 --> 00:12:25,220 el fichero, ¿vale? 286 00:12:25,899 --> 00:12:26,879 cambiarle el nombre 287 00:12:26,879 --> 00:12:30,559 borrarlo, cosas así 288 00:12:30,559 --> 00:12:32,399 entonces esta es la clase 289 00:12:32,399 --> 00:12:34,240 básica, en general 290 00:12:34,240 --> 00:12:36,259 cuando un método o lo que sea necesita un fichero 291 00:12:36,259 --> 00:12:37,799 para trabajar se le pasa en 292 00:12:37,799 --> 00:12:39,659 objeto file, ¿vale? 293 00:12:42,139 --> 00:12:44,080 el equivalente a este en java.new 294 00:12:44,080 --> 00:12:47,429 sería el objeto 295 00:12:47,429 --> 00:12:50,980 path, ¿vale? pero bueno 296 00:12:50,980 --> 00:12:52,940 luego según vayamos viendo los ejemplos 297 00:12:52,940 --> 00:12:54,399 pues lo iremos viendo 298 00:12:54,399 --> 00:12:58,580 entonces los dos nombres 299 00:12:58,580 --> 00:13:00,720 están bien escogidos 300 00:13:00,720 --> 00:13:01,940 cada uno con su matiz 301 00:13:01,940 --> 00:13:03,279 o sea este está bien escogido 302 00:13:03,279 --> 00:13:06,139 porque representa un fichero 303 00:13:06,139 --> 00:13:07,279 entonces pues mira file 304 00:13:07,279 --> 00:13:09,019 representa un fichero y se llama file, que bien 305 00:13:09,019 --> 00:13:11,899 pero este está bien escogido 306 00:13:11,899 --> 00:13:13,940 también porque pone de manifiesto 307 00:13:13,940 --> 00:13:16,299 lo que identifica un fichero 308 00:13:16,299 --> 00:13:18,659 en realidad, a un fichero lo identifica 309 00:13:18,659 --> 00:13:20,860 su nombre por supuesto 310 00:13:20,860 --> 00:13:22,539 pero toda la ruta en la que está 311 00:13:22,539 --> 00:13:24,460 del sistema de archivos, eso es lo que identifica 312 00:13:24,460 --> 00:13:26,559 un archivo, su nombre y toda su 313 00:13:26,559 --> 00:13:26,860 ruta 314 00:13:26,860 --> 00:13:29,519 un recurso archivo 315 00:13:29,519 --> 00:13:32,159 se identifica de forma única solamente 316 00:13:32,159 --> 00:13:34,100 con toda su ruta además de su nombre 317 00:13:34,100 --> 00:13:36,519 porque puede haber ficheros que se llaman 318 00:13:36,519 --> 00:13:37,700 igual en rutas distintas 319 00:13:37,700 --> 00:13:40,399 entonces la única forma de identificar de forma única un fichero 320 00:13:40,399 --> 00:13:41,700 es toda su ruta con su nombre 321 00:13:41,700 --> 00:13:44,100 y eso es lo que tenemos que saber 322 00:13:44,100 --> 00:13:45,879 para instanciar el objeto file, etc 323 00:13:45,879 --> 00:13:47,559 entonces quizá este nombre 324 00:13:47,559 --> 00:13:50,059 es casi más bonito porque nos hace ver 325 00:13:50,059 --> 00:13:51,820 que un fichero en realidad es toda una ruta 326 00:13:51,820 --> 00:13:54,080 en mi sistema de archivo, no es un nombre 327 00:13:54,080 --> 00:13:55,340 sin más, esto es una ruta 328 00:13:55,340 --> 00:13:59,919 bueno, pues clase file, ¿qué más clases 329 00:13:59,919 --> 00:14:02,120 vamos a ver? ahora antes de ponernos con los ejemplos 330 00:14:02,120 --> 00:14:03,820 bueno, pues aparte de 331 00:14:03,820 --> 00:14:05,820 instanciar un objeto archivo para tener información 332 00:14:05,820 --> 00:14:07,679 sobre él, para pasárselo como parámetro 333 00:14:07,679 --> 00:14:09,620 a un método, para que haga lo que sea, etc 334 00:14:09,620 --> 00:14:11,620 nos interesa 335 00:14:11,620 --> 00:14:13,820 leer y escribir en los 336 00:14:13,820 --> 00:14:16,080 archivos, es esencialmente lo que nos interesa 337 00:14:16,080 --> 00:14:18,649 vale 338 00:14:18,649 --> 00:14:26,870 pues, vale, para 339 00:14:26,870 --> 00:14:28,169 leer y escribir en un archivo 340 00:14:28,169 --> 00:14:31,070 Java lo organiza mediante 341 00:14:31,070 --> 00:14:32,330 flujos 342 00:14:32,330 --> 00:14:36,490 ¿vale? flujos o 343 00:14:36,490 --> 00:14:38,509 en terminología Java Neo ya es más 344 00:14:38,509 --> 00:14:40,529 canales, channels, pero bueno 345 00:14:40,529 --> 00:14:42,269 es la misma idea, un stream 346 00:14:42,269 --> 00:14:44,610 un channel, es la misma idea, es como hacer una pequeña 347 00:14:44,610 --> 00:14:46,730 tubería hacia ese fichero 348 00:14:46,730 --> 00:14:49,309 entonces 349 00:14:49,309 --> 00:14:52,370 nuestra aplicación lo que hará será 350 00:14:52,370 --> 00:14:54,590 leer de esa 351 00:14:54,590 --> 00:14:56,570 tubería, pi pi pi, por aquí se van 352 00:14:56,570 --> 00:14:58,830 enviando los bytes, por aquí van los bytes 353 00:14:58,830 --> 00:15:01,190 y se va leyendo de esa tubería 354 00:15:01,190 --> 00:15:03,009 entonces, ¿quién es capaz de leer 355 00:15:03,009 --> 00:15:03,990 de esa tubería? 356 00:15:06,100 --> 00:15:07,779 pues hay dos clases 357 00:15:07,779 --> 00:15:10,100 asociadas a sacar información 358 00:15:10,100 --> 00:15:12,600 de esa tubería o channel o canal básico 359 00:15:12,600 --> 00:15:14,320 en javaío 360 00:15:14,320 --> 00:15:16,039 estoy situada ahora, pero bueno 361 00:15:16,039 --> 00:15:18,019 es más o menos la que se ha usado siempre 362 00:15:18,019 --> 00:15:27,830 pues file input stream 363 00:15:27,830 --> 00:15:32,929 sería directamente para sacar bytes 364 00:15:32,929 --> 00:15:33,929 uno tras otro 365 00:15:33,929 --> 00:15:39,440 y file reader 366 00:15:39,440 --> 00:15:41,399 sería 367 00:15:41,399 --> 00:15:44,159 para también sacar bytes 368 00:15:44,159 --> 00:15:46,019 uno tras otro, pero 369 00:15:46,019 --> 00:15:48,179 devolvermelos convertidos a char 370 00:15:48,179 --> 00:15:49,659 interpretados como si fueran un char 371 00:15:49,659 --> 00:15:51,700 entonces si yo sé que es un fichero de texto 372 00:15:51,700 --> 00:15:54,179 directamente le asocio un file 373 00:15:54,179 --> 00:15:56,019 reader, que me va a permitir ir sacando 374 00:15:56,019 --> 00:15:57,039 los char tal cual 375 00:15:57,039 --> 00:16:00,120 si yo no sé lo que hay ahí, que es un fichero 376 00:16:00,120 --> 00:16:02,139 binario, pues le asocio un file 377 00:16:02,139 --> 00:16:04,019 input string, y voy sacando los bytes 378 00:16:04,019 --> 00:16:07,519 uno tras otro, a ver aquí estoy 379 00:16:07,519 --> 00:16:09,019 en el bajo nivel completamente 380 00:16:09,019 --> 00:16:11,960 estas son las clases de más bajo nivel que hay posibles 381 00:16:11,960 --> 00:16:13,500 que me sacan directamente los bytes 382 00:16:13,500 --> 00:16:15,559 luego claro 383 00:16:15,559 --> 00:16:16,519 sobre esto 384 00:16:16,519 --> 00:16:19,659 ya se pueden montar 385 00:16:19,659 --> 00:16:21,899 clases más complejas para envolverme 386 00:16:21,899 --> 00:16:23,720 en la complejidad y pues yo quiero 387 00:16:23,720 --> 00:16:25,399 sé que tiene números enteros 388 00:16:25,399 --> 00:16:26,860 pues léeme directamente enteros 389 00:16:26,860 --> 00:16:28,120 entonces tendrá que leer 4 bytes 390 00:16:28,120 --> 00:16:30,659 entonces sobre esto ya 391 00:16:30,659 --> 00:16:32,799 hay clases 392 00:16:32,799 --> 00:16:35,639 más complejas que se montan 393 00:16:35,639 --> 00:16:37,340 para hacer cosas más sofisticadas 394 00:16:37,340 --> 00:16:39,419 Pero que se apoyan sobre estas 395 00:16:39,419 --> 00:16:40,860 Sobre las básicas 396 00:16:40,860 --> 00:16:41,740 Que son estas dos 397 00:16:41,740 --> 00:16:43,299 ¿Vale? 398 00:16:44,340 --> 00:16:45,940 Entonces si lo que yo quiero 399 00:16:45,940 --> 00:16:48,340 Es en lugar de leer bytes 400 00:16:48,340 --> 00:16:49,700 Escribir bytes 401 00:16:49,700 --> 00:16:52,279 ¿Vale? Pues las clases serían 402 00:16:52,279 --> 00:16:56,110 Adiós 403 00:16:56,110 --> 00:16:57,690 Serían file 404 00:16:57,690 --> 00:17:03,320 Serían file output 405 00:17:03,320 --> 00:17:04,640 Stream 406 00:17:04,640 --> 00:17:07,619 O file writer 407 00:17:07,619 --> 00:17:12,960 Bueno estas serían como las 5 básicas 408 00:17:12,960 --> 00:17:14,619 Las de bajo nivel 409 00:17:14,619 --> 00:17:16,220 Vamos a usarlas ahora 410 00:17:16,220 --> 00:17:17,819 Antes de contar más historias 411 00:17:17,819 --> 00:17:20,420 Vamos a usarlas ahora para hacer algún ejemplo 412 00:17:20,420 --> 00:17:22,559 Y así pues seguimos programando 413 00:17:22,559 --> 00:17:24,059 Un poquito y ya está 414 00:17:24,059 --> 00:17:26,119 ¿Vale? Antes de 415 00:17:26,119 --> 00:17:27,779 Seguir hablando 416 00:17:27,779 --> 00:17:42,529 Achar, claro 417 00:17:42,529 --> 00:17:46,690 Coge los ceros y unos tal cual 418 00:17:51,690 --> 00:17:52,950 Input es para 419 00:17:52,950 --> 00:17:55,849 llevar de fichero a variable 420 00:17:55,849 --> 00:17:57,470 y output es 421 00:17:57,470 --> 00:17:59,730 para llevar de variable a fichero 422 00:17:59,730 --> 00:18:01,609 ¿vale? 423 00:18:01,670 --> 00:18:03,609 vamos a verlo ahora 424 00:18:03,609 --> 00:18:05,910 en un ejemplo 425 00:18:05,910 --> 00:18:24,339 los de DAO sueñan mucho por las noches 426 00:18:24,339 --> 00:18:27,799 no les hagan ni caso 427 00:18:27,799 --> 00:18:34,640 obviamente 428 00:18:34,640 --> 00:18:36,240 después de semana santa habrá un examen 429 00:18:36,240 --> 00:18:38,980 pero no sabemos si dos días después o tres meses después 430 00:18:38,980 --> 00:18:41,599 O sea, lo que han dicho 431 00:18:41,599 --> 00:18:43,079 Estrictamente falso no es 432 00:18:43,079 --> 00:18:49,869 Pero vamos, que no tenemos en mente 433 00:18:49,869 --> 00:18:51,809 Ningún examen todavía, más allá de cuando 434 00:18:51,809 --> 00:18:53,930 Tengo que hacer un examen, porque en mayo hay que hacer exámenes 435 00:18:53,930 --> 00:18:54,250 Claro 436 00:18:54,250 --> 00:18:57,809 Pero es que realmente, tampoco puede ser mucho después 437 00:18:57,809 --> 00:18:59,049 Porque es que tenemos un 438 00:18:59,049 --> 00:19:00,869 Problemón 439 00:19:00,869 --> 00:19:05,839 Los ficheros 440 00:19:05,839 --> 00:19:08,319 Ejemplos 441 00:19:08,319 --> 00:19:09,539 Vale 442 00:19:09,539 --> 00:19:14,930 No 443 00:19:14,930 --> 00:19:19,410 Porque volvemos de Semana Santa 444 00:19:19,410 --> 00:19:22,890 pues el 6 de abril 445 00:19:22,890 --> 00:19:24,089 puede ser, el 7 de abril 446 00:19:24,089 --> 00:19:30,859 el 7 de abril 447 00:19:30,859 --> 00:19:31,619 y 448 00:19:31,619 --> 00:19:33,680 la 449 00:19:33,680 --> 00:19:36,140 evaluación vuestra 450 00:19:36,140 --> 00:19:38,140 es el 18 de mayo 451 00:19:38,140 --> 00:19:40,299 con lo cual 452 00:19:40,299 --> 00:19:42,299 del 11 453 00:19:42,299 --> 00:19:44,299 entonces tenemos un mes 454 00:19:44,299 --> 00:19:50,579 vale, pues venga 455 00:19:50,579 --> 00:19:54,019 Este porque se me pone 456 00:19:54,019 --> 00:20:01,720 Vale 457 00:20:01,720 --> 00:20:03,740 Pues venga 458 00:20:03,740 --> 00:20:05,039 Vamos a hacernos un paquete 459 00:20:05,039 --> 00:20:08,420 Por aquí 460 00:20:08,420 --> 00:20:10,279 Primero para trabajar 461 00:20:10,279 --> 00:20:13,500 Ejemplo con texto 462 00:20:13,500 --> 00:20:14,460 Que es la forma 463 00:20:14,460 --> 00:20:17,039 La forma más fácil de 464 00:20:17,039 --> 00:20:19,440 Entenderlo de buenas a primeras 465 00:20:19,440 --> 00:20:22,220 Venga, contexto 466 00:20:22,220 --> 00:20:24,559 Pues ahora vamos a hacernos 467 00:20:24,559 --> 00:20:26,779 Un programita 468 00:20:26,779 --> 00:20:40,019 ¿Por qué no me aparece 469 00:20:40,019 --> 00:20:41,660 Aquí lo de 470 00:20:41,660 --> 00:20:43,900 Ah, es que 471 00:20:43,900 --> 00:20:48,940 Me parece bien pequeñito 472 00:20:48,940 --> 00:21:07,500 Vale, pues venga 473 00:21:07,500 --> 00:21:11,740 Pues venga, por ejemplo 474 00:21:11,740 --> 00:21:13,779 Vamos a hacer una 475 00:21:13,779 --> 00:21:16,079 minimísima aplicación 476 00:21:16,079 --> 00:21:17,700 que trabaja con nombres 477 00:21:17,700 --> 00:21:18,440 de personas 478 00:21:18,440 --> 00:21:22,200 entonces esos nombres de personas 479 00:21:22,200 --> 00:21:23,779 para trabajar con ellos tendrían que estar 480 00:21:23,779 --> 00:21:24,799 guardados en algún sitio 481 00:21:24,799 --> 00:21:27,740 pues vamos a guardarlos por ejemplo aquí 482 00:21:27,740 --> 00:21:30,640 en una lista 483 00:21:30,640 --> 00:22:04,400 vale 484 00:22:04,400 --> 00:22:09,029 vale 485 00:22:09,029 --> 00:22:09,849 pues a ver 486 00:22:09,849 --> 00:22:16,549 vamos a hacer un bucle 487 00:22:16,549 --> 00:22:18,609 que le ha 488 00:22:18,609 --> 00:22:20,349 solicite nombres y los guarde 489 00:22:20,349 --> 00:22:23,150 luego al final, antes de irse, los guarde en el fichero 490 00:22:23,150 --> 00:22:23,990 vale 491 00:22:23,990 --> 00:23:05,990 pues yo tengo aquí mi nombre 492 00:23:05,990 --> 00:23:07,250 y ahora 493 00:23:07,250 --> 00:23:10,089 a nombres.add 494 00:23:10,089 --> 00:23:15,730 scan.nextline 495 00:23:15,730 --> 00:23:24,759 vale, pues aquí 496 00:23:24,759 --> 00:23:26,980 nosotros ya podemos procesar 497 00:23:26,980 --> 00:23:29,099 los nombres, hacer lo que sea 498 00:23:29,099 --> 00:23:33,259 lo que sea que mi aplicación 499 00:23:33,259 --> 00:23:34,420 hiciera con esos nombres 500 00:23:34,420 --> 00:23:35,680 lo que fuera 501 00:23:35,680 --> 00:23:44,759 pero antes de irme, yo ya de mi aplicación 502 00:23:44,759 --> 00:23:46,200 Antes de procesar los nombres 503 00:23:46,200 --> 00:23:48,420 Yo los 504 00:23:48,420 --> 00:23:52,240 Vale 505 00:23:52,240 --> 00:23:53,940 Los quiero dejar 506 00:23:53,940 --> 00:23:59,210 Vale, los quiero dejar guardados 507 00:23:59,210 --> 00:23:59,849 En un fichero 508 00:23:59,849 --> 00:24:05,019 Venga, pues me voy a hacer ahora aquí un método 509 00:24:05,019 --> 00:24:07,200 Guardar nombres 510 00:24:07,200 --> 00:24:09,299 Al que le 511 00:24:09,299 --> 00:24:11,160 No hace falta que le pase 512 00:24:11,160 --> 00:24:13,200 Mis nombres, porque como están como variable local 513 00:24:13,200 --> 00:24:16,490 Vale, guardar nombres 514 00:24:16,490 --> 00:24:18,509 Venga, vamos a hacernos este método 515 00:24:18,509 --> 00:24:33,329 Bueno 516 00:24:33,329 --> 00:24:36,730 Pues proceso para guardar en un fichero 517 00:24:36,730 --> 00:24:39,029 Proceso para guardar en un fichero 518 00:24:39,029 --> 00:24:40,630 Primero 519 00:24:40,630 --> 00:24:45,519 Abrir el fichero 520 00:24:45,519 --> 00:24:46,960 Para escritura 521 00:24:46,960 --> 00:24:49,440 Para escritura 522 00:24:49,440 --> 00:24:53,039 Después de que lo hayamos abierto 523 00:24:53,039 --> 00:24:56,019 Haremos las escrituras 524 00:24:56,019 --> 00:24:57,660 Escribimos 525 00:24:57,660 --> 00:25:02,680 Y después de que hemos escrito 526 00:25:02,680 --> 00:25:03,759 Cerramos 527 00:25:03,759 --> 00:25:05,319 ¿Vale? 528 00:25:05,720 --> 00:25:09,630 Estos son los tres pasos 529 00:25:09,630 --> 00:25:12,710 Abrimos el fichero, escribimos y cerramos 530 00:25:12,710 --> 00:25:13,450 Vale 531 00:25:13,450 --> 00:25:16,369 Abrir el fichero 532 00:25:16,369 --> 00:25:17,089 ¿Qué significa? 533 00:25:18,529 --> 00:25:20,369 Instanciar el objeto que corresponda 534 00:25:20,970 --> 00:25:22,250 Para 535 00:25:22,250 --> 00:25:24,710 Abrir un fichero para leer de él 536 00:25:24,710 --> 00:25:26,190 Entonces 537 00:25:26,190 --> 00:25:28,089 En este caso 538 00:25:28,089 --> 00:25:29,390 Mi fichero va a ser de texto 539 00:25:29,390 --> 00:25:32,589 Porque yo voy a guardar caracteres que luego quiero leer como texto 540 00:25:32,589 --> 00:25:34,650 Entonces para leer 541 00:25:34,650 --> 00:25:35,990 Tendríamos dos alternativas 542 00:25:35,990 --> 00:25:38,349 Estando a nivel básico 543 00:25:38,349 --> 00:25:39,809 El más básico posible 544 00:25:39,809 --> 00:25:41,430 El más tocando el bajo nivel 545 00:25:41,430 --> 00:25:43,529 File input, perdón 546 00:25:43,529 --> 00:25:45,029 Para escritura 547 00:25:45,029 --> 00:25:46,789 File output stream 548 00:25:46,789 --> 00:25:49,910 Output es salir, salgo del fichero 549 00:25:49,910 --> 00:25:51,410 O sea, perdón, salgo de la aplicación 550 00:25:51,410 --> 00:25:53,750 Output significa salgo de la aplicación 551 00:25:53,750 --> 00:25:55,190 De mi aplicación me voy fuera 552 00:25:55,190 --> 00:25:57,630 Pues file output stream 553 00:25:57,630 --> 00:26:00,150 Para mandar bytes tal cual 554 00:26:00,150 --> 00:26:02,430 O file writer 555 00:26:02,430 --> 00:26:05,390 Que sería en mi caso el que aplicaría 556 00:26:05,390 --> 00:26:07,849 Porque estoy escribiendo cosas que son caracteres 557 00:26:07,849 --> 00:26:36,059 Entonces, opciones que tenemos a nivel básico tendríamos, repito, esta para escribir bytes sin más, o sea, bytes, y esta otra que he dicho, escribir caracteres. 558 00:26:37,880 --> 00:26:43,980 En nuestro caso es lo que queremos, pues entonces toca instanciar este objeto, que este es el que toca, toca este. 559 00:26:43,980 --> 00:26:47,759 vale, siempre lo mismo, abrimos el fichero 560 00:26:47,759 --> 00:26:49,420 escribimos o leemos 561 00:26:49,420 --> 00:26:50,880 si estuviéramos en lectura y cerramos 562 00:26:50,880 --> 00:26:53,700 vale, y abrir significa 563 00:26:53,700 --> 00:26:55,079 instanciar el objeto 564 00:26:55,079 --> 00:26:58,019 que toque, pues para escribir 565 00:26:58,019 --> 00:26:59,480 en un fichero de caracteres 566 00:26:59,480 --> 00:27:02,259 FileWriter, para escribir bytes 567 00:27:02,259 --> 00:27:04,099 sin más, sin interpretar 568 00:27:04,099 --> 00:27:05,980 la información, FileOutputStream 569 00:27:05,980 --> 00:27:07,880 en este caso caracteres 570 00:27:07,880 --> 00:27:08,799 vamos a instanciarlo 571 00:27:08,799 --> 00:27:13,259 FileWriter, vale 572 00:27:13,259 --> 00:27:17,809 como instanciamos un objeto 573 00:27:17,809 --> 00:27:19,789 normalmente con el 574 00:27:19,789 --> 00:27:22,269 constructor, a menos que tengamos 575 00:27:22,269 --> 00:27:22,890 un 576 00:27:22,890 --> 00:27:25,630 método que llame al 577 00:27:25,630 --> 00:27:27,470 constructor, en este caso con el constructor 578 00:27:27,470 --> 00:27:29,809 vale, y ahora 579 00:27:29,809 --> 00:27:31,630 a FileWriter, ¿qué hay que pasarle al 580 00:27:31,630 --> 00:27:33,990 constructor? hay que pasarle 581 00:27:33,990 --> 00:27:35,789 el fichero en el 582 00:27:35,789 --> 00:27:37,650 que vamos a escribir, eso es lo que hay que pasarle 583 00:27:37,650 --> 00:27:39,490 hay que pasarle el fichero en el que vamos a escribir 584 00:27:39,490 --> 00:27:41,069 porque este objeto FileWriter 585 00:27:41,069 --> 00:27:43,470 se asociará a un fichero 586 00:27:43,470 --> 00:27:45,950 este FileWriter será como ese flujo 587 00:27:45,950 --> 00:27:47,549 ese canal 588 00:27:47,549 --> 00:27:49,970 Entonces ahí hay que pasar el fichero 589 00:27:49,970 --> 00:27:52,329 Se puede pasar de dos maneras 590 00:27:52,329 --> 00:27:54,670 El nombre del fichero sin más 591 00:27:54,670 --> 00:27:56,230 Con toda su ruta, por supuesto 592 00:27:56,230 --> 00:27:57,150 Es decir, un string 593 00:27:57,150 --> 00:27:59,829 O el objeto file que lo representa 594 00:27:59,829 --> 00:28:03,029 El constructor está sobrecargado 595 00:28:03,029 --> 00:28:04,690 Entonces, por ejemplo 596 00:28:04,690 --> 00:28:09,789 Vamos a preguntar aquí 597 00:28:09,789 --> 00:28:11,210 En qué fichero quiere guardarlo 598 00:28:11,210 --> 00:28:20,230 En qué fichero quiere guardar 599 00:28:20,230 --> 00:28:29,339 ahora aquí nos dirá el nombre del fichero 600 00:28:29,339 --> 00:28:42,690 me voy a coger el escáner de arriba 601 00:28:42,690 --> 00:28:48,019 aquí estoy 602 00:28:48,019 --> 00:28:55,930 vale, este es el nombre del fichero 603 00:28:55,930 --> 00:28:57,289 en el que quiere guardar 604 00:28:57,289 --> 00:28:58,809 vale, entonces 605 00:28:58,809 --> 00:29:01,970 yo puedo pasar el nombre del fichero 606 00:29:01,970 --> 00:29:03,049 directamente aquí 607 00:29:03,049 --> 00:29:04,049 si quiero 608 00:29:04,049 --> 00:29:05,569 vale 609 00:29:05,569 --> 00:29:08,670 puedo pasar directamente el nombre del fichero 610 00:29:08,670 --> 00:29:09,849 y ya está 611 00:29:09,849 --> 00:29:12,170 este flujo se asociará a ese fichero 612 00:29:12,170 --> 00:29:13,250 ya se quedaría abierto 613 00:29:13,250 --> 00:29:14,250 se quedaría abierto 614 00:29:14,250 --> 00:29:16,390 cuidado 615 00:29:16,390 --> 00:29:19,250 si esto es el nombre del fichero sin más 616 00:29:19,250 --> 00:29:21,049 recordad que un recurso fichero 617 00:29:21,049 --> 00:29:23,049 no se queda identificado por su nombre 618 00:29:23,049 --> 00:29:25,130 no, así se queda ambiguo 619 00:29:25,130 --> 00:29:27,069 porque puede llamarse un fichero igual 620 00:29:27,069 --> 00:29:29,029 en muchos sitios de mi sistema de archivos 621 00:29:29,029 --> 00:29:31,309 entonces si yo paso el nombre 622 00:29:31,309 --> 00:29:32,049 sin más 623 00:29:32,049 --> 00:29:34,869 lo que asume la clase 624 00:29:34,869 --> 00:29:36,890 FileWriter es que entonces 625 00:29:36,890 --> 00:29:39,049 la ruta en la que está 626 00:29:39,049 --> 00:29:41,009 ese fichero, la ruta es 627 00:29:41,009 --> 00:29:42,309 la raíz del proyecto 628 00:29:42,309 --> 00:29:44,950 es decir, esto 629 00:29:44,950 --> 00:29:49,019 ¿vale? si yo paso aquí el nombre sin más 630 00:29:49,019 --> 00:29:51,099 él asume que entonces la ruta 631 00:29:51,099 --> 00:29:52,859 es la de la raíz 632 00:29:52,859 --> 00:29:54,720 del proyecto, esa es la ruta que se llama 633 00:29:54,720 --> 00:29:56,680 por defecto de cualquier aplicación Java 634 00:29:56,680 --> 00:29:58,420 la ruta raíz de la cual 635 00:29:58,420 --> 00:30:00,140 cuelgan todos los paquetes 636 00:30:00,140 --> 00:30:04,019 ¿vale? entonces yo puedo hacer 637 00:30:04,019 --> 00:30:05,420 ahora mismo mi método 638 00:30:05,420 --> 00:30:07,660 así, pasando directamente el nombre 639 00:30:07,660 --> 00:30:09,660 y ya está, veréis que el fichero 640 00:30:09,660 --> 00:30:11,460 me aparece aquí 641 00:30:11,460 --> 00:30:13,339 me aparece ahí en esa ruta 642 00:30:13,339 --> 00:30:16,079 Que yo no quiero que sea esa ruta 643 00:30:16,079 --> 00:30:17,140 Sino otra 644 00:30:17,140 --> 00:30:19,279 Pues le tengo que pasar aquí 645 00:30:19,279 --> 00:30:22,180 El string con toda la ruta 646 00:30:22,180 --> 00:30:23,220 Enterita, toda 647 00:30:23,220 --> 00:30:25,759 El c, dos puntos, barra, etc 648 00:30:25,759 --> 00:30:26,740 ¿Vale? 649 00:30:27,720 --> 00:30:29,299 Esa es una ruta absoluta 650 00:30:29,299 --> 00:30:32,480 ¿Es obligatorio que yo pase siempre rutas absolutas? 651 00:30:33,299 --> 00:30:34,839 No, no eso no es obligatorio 652 00:30:34,839 --> 00:30:36,460 Si es que ni siquiera es deseable 653 00:30:36,460 --> 00:30:38,299 Porque una aplicación 654 00:30:38,299 --> 00:30:40,700 Que está basada en rutas absolutas 655 00:30:40,700 --> 00:30:41,339 Que tú cuando 656 00:30:41,339 --> 00:30:43,819 en esa aplicación haces accesos 657 00:30:43,819 --> 00:30:45,940 a fichas de frutas absolutas, es muy poco 658 00:30:45,940 --> 00:30:47,920 portable, lógicamente 659 00:30:47,920 --> 00:30:48,900 porque yo puedo poner aquí 660 00:30:48,900 --> 00:30:51,700 C, dos puntos, uses, Raquel, bla bla bla 661 00:30:51,700 --> 00:30:53,660 y ahora te doy mi aplicación 662 00:30:53,660 --> 00:30:55,420 para que tú la ejecutes en tu equipo 663 00:30:55,420 --> 00:30:57,759 cuando esa aplicación intente abrir 664 00:30:57,759 --> 00:30:59,700 el recurso C, uses, Raquel 665 00:30:59,700 --> 00:31:01,259 va a decir esta ruta aquí no existe 666 00:31:01,259 --> 00:31:02,980 entonces no es 667 00:31:02,980 --> 00:31:06,000 de hecho es absolutamente desaconsejable 668 00:31:06,000 --> 00:31:07,740 jamás lo hacemos lógicamente 669 00:31:07,740 --> 00:31:09,619 usar rutas 670 00:31:09,619 --> 00:31:11,880 absolutas para identificar 671 00:31:11,880 --> 00:31:13,839 ubicaciones de ficheros 672 00:31:13,839 --> 00:31:16,000 porque esa ruta va a perder validez 673 00:31:16,000 --> 00:31:17,720 en cuanto tú muevas la aplicación 674 00:31:17,720 --> 00:31:18,640 a otro equipo 675 00:31:18,640 --> 00:31:21,980 entonces, ¿qué es lo que podemos 676 00:31:21,980 --> 00:31:24,200 poner? rutas relativas 677 00:31:24,200 --> 00:31:26,039 relativas a 678 00:31:26,039 --> 00:31:26,660 cual a este 679 00:31:26,660 --> 00:31:29,700 rutas relativas, entonces si yo pongo 680 00:31:29,700 --> 00:31:30,759 por ejemplo 681 00:31:30,759 --> 00:31:36,059 carpeta 682 00:31:36,059 --> 00:31:38,079 hola barra nombre del fichero 683 00:31:38,079 --> 00:31:40,299 pues la carpeta hola se sobreentiende 684 00:31:40,299 --> 00:31:42,220 que está aquí dentro, es una ruta 685 00:31:42,220 --> 00:31:44,119 relativa, si yo hago ahora el 686 00:31:44,119 --> 00:31:46,160 dos puntos, recordáis que con dos puntos 687 00:31:46,160 --> 00:31:47,480 te subes un 688 00:31:47,480 --> 00:31:49,920 piso por encima del sistema de archivos 689 00:31:49,920 --> 00:31:52,220 ¿verdad? vale, pues si yo pongo 690 00:31:52,220 --> 00:31:54,160 la ruta dos puntos, barra, no sé 691 00:31:54,160 --> 00:31:56,180 qué, pues me he subido por 692 00:31:56,180 --> 00:31:58,400 encima de mi ruta 693 00:31:58,400 --> 00:32:00,079 por defecto que es esta 694 00:32:00,079 --> 00:32:02,140 y ahí ya me he ido a la carpeta, entonces siempre puedo 695 00:32:02,140 --> 00:32:04,240 hacer rutas relativas 696 00:32:04,240 --> 00:32:06,160 a esta, ¿vale? 697 00:32:06,160 --> 00:32:08,440 Que es lo deseable, rutas relativas a esta 698 00:32:08,440 --> 00:32:11,019 Y esas ya sí que van a funcionar 699 00:32:11,019 --> 00:32:13,099 Pase yo mi aplicación a donde la pase 700 00:32:13,099 --> 00:32:14,200 ¿Vale? 701 00:32:15,079 --> 00:32:17,259 Y siempre deberían tener rutas relativas 702 00:32:17,259 --> 00:32:17,500 Claro 703 00:32:17,500 --> 00:32:20,799 Bueno, aquí nosotros, como vamos a pasar el nombre sin más 704 00:32:20,799 --> 00:32:23,240 Pues eso significa 705 00:32:23,240 --> 00:32:24,740 Que mi fichero va a aparecer aquí 706 00:32:24,740 --> 00:32:25,940 ¿Vale? Estupendo 707 00:32:25,940 --> 00:32:28,079 Bueno, pues 708 00:32:28,079 --> 00:32:30,920 Yo puedo pasar aquí el nombre sin más 709 00:32:30,920 --> 00:32:32,539 Pero este constructor 710 00:32:32,539 --> 00:32:35,180 También permite que yo le pase 711 00:32:35,180 --> 00:32:37,339 el objeto file asociado 712 00:32:37,339 --> 00:32:37,779 a este 713 00:32:37,779 --> 00:32:41,259 ¿vale? pero bueno, con el objeto file 714 00:32:41,259 --> 00:32:43,680 lo ponemos 715 00:32:43,680 --> 00:32:44,940 como ejemplo ahora en otro método 716 00:32:44,940 --> 00:32:47,380 bueno, pues ya está, esto ya está 717 00:32:47,380 --> 00:32:49,420 se me ha aparecido en rojo, ¿por qué? 718 00:32:50,440 --> 00:32:50,920 porque 719 00:32:50,920 --> 00:32:53,400 FileWriter puede lanzarme 720 00:32:53,400 --> 00:32:55,420 una excepción y esta sí que no es 721 00:32:55,420 --> 00:32:57,579 runtime excepción, esta es una excepción 722 00:32:57,579 --> 00:32:58,019 de verdad 723 00:32:58,019 --> 00:33:01,380 ¿vale? si nosotros entramos en la clase 724 00:33:01,380 --> 00:33:08,400 FileWriter, ¿veis? 725 00:33:08,400 --> 00:33:10,779 tiene un 726 00:33:10,779 --> 00:33:12,160 throws io exception 727 00:33:12,160 --> 00:33:14,259 es decir 728 00:33:14,259 --> 00:33:16,839 puede que yo me encuentre un problema 729 00:33:16,839 --> 00:33:18,940 de entrada y salida cuando trato de instanciar 730 00:33:18,940 --> 00:33:20,880 el flujo, puede que yo me 731 00:33:20,880 --> 00:33:22,099 encuentre io exception 732 00:33:22,099 --> 00:33:23,880 si entráramos en ella 733 00:33:23,880 --> 00:33:28,299 bueno, esto 734 00:33:28,299 --> 00:33:33,400 me va a tardar 735 00:33:33,400 --> 00:33:38,180 veré que hereda de exception 736 00:33:38,180 --> 00:33:40,220 no de runtime exception, pero no me la 737 00:33:40,220 --> 00:33:45,529 no me llega a abrir la 738 00:33:45,529 --> 00:33:47,009 jerarquía esta 739 00:33:47,009 --> 00:33:52,170 ¿cuál es la diferencia? 740 00:33:52,569 --> 00:33:56,009 bueno, la que hemos visto 741 00:33:56,009 --> 00:33:57,670 en las clases anteriores 742 00:33:57,670 --> 00:34:00,269 si una excepción hereda de excepción 743 00:34:00,269 --> 00:34:02,269 eso implica 744 00:34:02,269 --> 00:34:03,410 que es como de mayor rango 745 00:34:03,410 --> 00:34:06,170 y es automáticamente de obligada 746 00:34:06,170 --> 00:34:07,569 captura o propagación 747 00:34:07,569 --> 00:34:08,650 donde tú la llames 748 00:34:08,650 --> 00:34:11,710 bueno, tú la has decidido 749 00:34:11,710 --> 00:34:12,730 por programa 750 00:34:12,730 --> 00:34:15,269 entonces, se supone que son excepciones 751 00:34:15,269 --> 00:34:17,510 que es más 752 00:34:17,510 --> 00:34:20,130 peligroso que te aparezcan en tiempo de ejecución 753 00:34:20,130 --> 00:34:22,130 entonces ya desde tiempo de compilación 754 00:34:22,130 --> 00:34:24,289 obligas al que desarrolla el código 755 00:34:24,289 --> 00:34:26,570 a pronunciarse sobre si te sale 756 00:34:26,570 --> 00:34:28,710 ¿vale? entonces es una cuestión de diseño 757 00:34:28,710 --> 00:34:30,750 de categoría de excepciones que yo no quiero 758 00:34:30,750 --> 00:34:33,070 dejar, no quiero arriesgarme 759 00:34:33,070 --> 00:34:34,769 a que aparezcan en tiempo de ejecución 760 00:34:34,769 --> 00:34:36,510 porque sí ¿vale? 761 00:34:36,570 --> 00:34:38,570 entonces las que tú haces que hereden de exception 762 00:34:38,570 --> 00:34:40,429 o las que están hechas 763 00:34:40,429 --> 00:34:42,590 que hereden de exception, la máquina virtual 764 00:34:42,590 --> 00:34:44,510 como esta, la de 765 00:34:44,510 --> 00:34:46,670 io exception, se supone que esa es 766 00:34:46,670 --> 00:34:48,409 lo suficientemente, porque claro 767 00:34:48,409 --> 00:34:50,530 si tú cuentas que tu aplicación va a abrir un fichero 768 00:34:50,530 --> 00:34:51,670 y luego no puede abrirlo 769 00:34:51,670 --> 00:34:53,150 pues te la has cargado entera 770 00:34:53,150 --> 00:34:56,469 entonces tiene sentido que ya de partida 771 00:34:56,469 --> 00:34:57,949 cuando yo hago aquí 772 00:34:57,949 --> 00:34:59,889 esto 773 00:34:59,889 --> 00:35:02,170 me diga 774 00:35:02,170 --> 00:35:04,309 ojo, que esto puede que te encuentres 775 00:35:04,309 --> 00:35:06,190 un problema, que este fichero no lo pueda 776 00:35:06,190 --> 00:35:07,829 abrir porque tengo que hacer el tema de archivos 777 00:35:07,829 --> 00:35:08,829 dime que hago si no 778 00:35:08,829 --> 00:35:12,070 entonces ya directamente 779 00:35:12,070 --> 00:35:14,070 tú ya dices, pues hago un try catch 780 00:35:14,070 --> 00:35:16,469 y ya doy una alternativa 781 00:35:16,469 --> 00:35:17,030 ¿vale? 782 00:35:17,869 --> 00:35:19,889 Array in this auto bound exception 783 00:35:19,889 --> 00:35:22,590 esa no hereda de excepto, hereda de runtime 784 00:35:22,590 --> 00:35:24,570 entonces esa no tenemos que 785 00:35:24,570 --> 00:35:26,550 capturarla todo el rato, ¿por qué? porque asumimos 786 00:35:26,550 --> 00:35:28,170 que esa excepción no va a salir 787 00:35:28,170 --> 00:35:30,269 porque si sale es porque has hecho el código fatal 788 00:35:30,269 --> 00:35:32,030 entonces vale, que te salga y lo arreglas 789 00:35:32,030 --> 00:35:34,250 pero esta no es que no depende del programador 790 00:35:34,250 --> 00:35:36,369 esta te puede salir por un problema 791 00:35:36,369 --> 00:35:37,750 ajeno al programador, entonces 792 00:35:37,750 --> 00:35:39,289 te avisa desde ya 793 00:35:39,289 --> 00:35:42,230 para que digas, oye, si pasa esto que no es 794 00:35:42,230 --> 00:35:44,190 tu culpa, pero podría ocurrir, ¿qué haces? 795 00:35:44,269 --> 00:35:45,989 y tú como programador lo arreglas, ¿vale? 796 00:35:51,829 --> 00:35:52,710 bueno, pues entonces 797 00:35:52,710 --> 00:35:54,849 aquí efectivamente me dice, oye, cuidado 798 00:35:54,849 --> 00:35:56,889 que te podría salir un io exception 799 00:35:56,889 --> 00:35:58,829 porque yo no te prometo 800 00:35:58,829 --> 00:36:01,190 que el fichero esté disponible 801 00:36:01,190 --> 00:36:01,730 o 802 00:36:01,730 --> 00:36:04,190 ¿qué haríamos si no? ¿qué haríamos? 803 00:36:04,849 --> 00:36:06,610 Bueno, pues recordad que cuando 804 00:36:06,610 --> 00:36:08,730 tú tienes el aviso de que hay 805 00:36:08,730 --> 00:36:10,869 una excepción que te puede salir, tienes dos opciones 806 00:36:10,869 --> 00:36:12,409 la 807 00:36:12,409 --> 00:36:15,070 fea y la bonita 808 00:36:15,070 --> 00:36:16,849 la bonita 809 00:36:16,849 --> 00:36:18,710 es capturar y decir, voy a 810 00:36:18,710 --> 00:36:19,769 dar yo una solución 811 00:36:19,769 --> 00:36:22,130 ¿vale? voy a dar yo una solución 812 00:36:22,130 --> 00:36:25,429 Capturar, ya sabemos que es esta 813 00:36:25,429 --> 00:36:26,670 ¿Vale? 814 00:36:27,389 --> 00:36:30,309 Entonces, si no puedo instanciar el objeto 815 00:36:30,309 --> 00:36:32,150 Si no puedo instanciarlo 816 00:36:32,150 --> 00:36:34,829 Pues aquí digo lo que sea 817 00:36:34,829 --> 00:36:37,210 O digo, elige otro nombre de fichero 818 00:36:37,210 --> 00:36:38,690 Lo que sea 819 00:36:38,690 --> 00:36:40,369 Ya lo que yo decida 820 00:36:40,369 --> 00:36:48,269 Error al acceder al archivo 821 00:36:48,269 --> 00:36:51,469 Se usará uno por defecto 822 00:36:51,469 --> 00:36:53,469 Lo que sea, lo que yo decida 823 00:36:53,469 --> 00:37:01,619 pero ya sé que mi aplicación no para 824 00:37:01,619 --> 00:37:03,659 que eso es lo bueno, mi aplicación no va a parar 825 00:37:03,659 --> 00:37:05,619 ¿vale? ya sé que mi aplicación no va a parar 826 00:37:05,619 --> 00:37:08,000 mi aplicación seguirá por aquí 827 00:37:08,000 --> 00:37:10,000 en función 828 00:37:10,000 --> 00:37:11,579 de lo que yo siga haciendo 829 00:37:11,579 --> 00:37:13,800 me habré creado un archivo por defecto, lo que yo quiera 830 00:37:13,800 --> 00:37:14,800 vamos, lo que yo quiera 831 00:37:14,800 --> 00:37:18,699 ¿cuál era la opción mala? 832 00:37:21,619 --> 00:37:22,280 la opción mala 833 00:37:22,280 --> 00:37:23,659 depende de donde esté yo, claro 834 00:37:23,659 --> 00:37:24,679 uy 835 00:37:24,679 --> 00:37:30,340 pues estoy programando en plan rápido 836 00:37:30,340 --> 00:37:32,539 estoy en una aplicación, quiero hacer pruebas cuanto antes 837 00:37:32,539 --> 00:37:34,380 no quiero que me quede un código muy engorroso 838 00:37:34,380 --> 00:37:36,199 tengo la seguridad de que no va a haber ningún problema 839 00:37:36,199 --> 00:37:37,119 con mi sistema de archivos 840 00:37:37,119 --> 00:37:39,599 pues la es 841 00:37:39,599 --> 00:37:42,760 pues propago, de las dos opciones que tengo 842 00:37:42,760 --> 00:37:43,960 que son 843 00:37:43,960 --> 00:37:46,619 o capturar con el 844 00:37:46,619 --> 00:37:48,320 try catch o propagar 845 00:37:48,320 --> 00:37:49,820 pues propagar 846 00:37:49,820 --> 00:37:51,519 y propagar que significa 847 00:37:51,519 --> 00:37:54,639 pues propagar significa en el método 848 00:37:54,639 --> 00:37:57,059 donde esa excepción puede salir 849 00:37:57,059 --> 00:37:58,739 en el método donde puede salir 850 00:37:58,739 --> 00:37:59,500 sea el que sea 851 00:37:59,500 --> 00:38:01,300 avisas 852 00:38:01,300 --> 00:38:03,519 vale 853 00:38:03,519 --> 00:38:09,780 entonces 854 00:38:09,780 --> 00:38:12,980 esta puede ser fea 855 00:38:12,980 --> 00:38:14,639 como digo yo, no, depende 856 00:38:14,639 --> 00:38:16,300 en este caso no es tan fea porque 857 00:38:16,300 --> 00:38:18,179 el mes 858 00:38:18,179 --> 00:38:21,239 lo que haría no sería parar el programa 859 00:38:21,239 --> 00:38:22,559 sino el aviso 860 00:38:22,559 --> 00:38:24,280 propagarlo para que lo dé este 861 00:38:24,280 --> 00:38:27,099 entonces el aviso ahora ya salta y se queda 862 00:38:27,099 --> 00:38:28,940 aquí, entonces todavía 863 00:38:28,940 --> 00:38:30,440 me queda una oportunidad de try catch 864 00:38:30,440 --> 00:38:33,260 todavía me queda una oportunidad de try catch que es aquí arriba 865 00:38:33,260 --> 00:38:34,980 entonces aquí todavía 866 00:38:34,980 --> 00:38:36,940 no he actuado tan mal 867 00:38:36,940 --> 00:38:38,400 no he actuado tan mal 868 00:38:38,400 --> 00:38:40,559 porque lo que he dicho es, oye, cuidado 869 00:38:40,559 --> 00:38:42,860 que puede que salga un error 870 00:38:42,860 --> 00:38:44,860 como yo no soy 871 00:38:44,860 --> 00:38:47,000 el programa principal 872 00:38:47,000 --> 00:38:49,019 todavía, como yo no soy el programa principal 873 00:38:49,019 --> 00:38:51,239 aviso arriba 874 00:38:51,239 --> 00:38:53,320 propago con el 875 00:38:53,320 --> 00:38:55,579 el aviso llega aquí 876 00:38:55,579 --> 00:38:57,480 y aquí todavía 877 00:38:57,480 --> 00:38:59,579 tengo una oportunidad de try catch 878 00:38:59,579 --> 00:39:01,260 ¿vale? para decir, oye 879 00:39:01,260 --> 00:39:02,539 no se ha podido guardar nombres 880 00:39:02,539 --> 00:39:05,820 Bueno, pues aquí todavía tengo una oportunidad de try-catch 881 00:39:05,820 --> 00:39:08,039 Y aquí ya sí que haría 882 00:39:08,039 --> 00:39:18,260 No se han 883 00:39:18,260 --> 00:39:19,260 Podido 884 00:39:19,260 --> 00:39:20,739 Guardar 885 00:39:20,739 --> 00:39:23,780 Y al menos el que ha trabajado 886 00:39:23,780 --> 00:39:25,559 Con estos nombres sabe que los ha perdido 887 00:39:25,559 --> 00:39:27,780 O si no 888 00:39:27,780 --> 00:39:29,119 Se puede meter en un bucle 889 00:39:29,119 --> 00:39:31,380 Y lo que sea, lo que uno decida 890 00:39:31,380 --> 00:39:40,989 ¿Vale? 891 00:39:42,730 --> 00:39:44,690 Aquí lo que sí que sería feo 892 00:39:44,690 --> 00:39:46,510 Es aquí seguir propagando 893 00:39:46,510 --> 00:39:47,730 Porque aquí ya tengo el main 894 00:39:47,730 --> 00:39:49,469 vale, entonces 895 00:39:49,469 --> 00:39:53,150 si aquí yo 896 00:39:53,150 --> 00:39:56,030 ante este aviso 897 00:39:56,030 --> 00:39:58,110 de guardar nombres 898 00:39:58,110 --> 00:39:59,949 de cuidado, que puede salir una excepción 899 00:39:59,949 --> 00:40:02,090 vale 900 00:40:02,090 --> 00:40:03,289 ante este aviso 901 00:40:03,289 --> 00:40:06,030 yo dijera, bueno, voy a 902 00:40:06,030 --> 00:40:07,590 seguir pasando el aviso hacia arriba 903 00:40:07,590 --> 00:40:09,889 porque tengo dos opciones, o ahora ya 904 00:40:09,889 --> 00:40:11,889 capturo o lo sigo pasando hacia arriba 905 00:40:11,889 --> 00:40:13,690 pues si yo opto por no 906 00:40:13,690 --> 00:40:15,690 emborronar el código y porque no me quede feo 907 00:40:15,690 --> 00:40:17,690 opto por, venga, pues vamos 908 00:40:17,690 --> 00:40:19,610 para arriba, ahora 909 00:40:19,610 --> 00:40:21,570 haya el Throws, ¿quién lo está 910 00:40:21,570 --> 00:40:22,550 lanzando? El Main. 911 00:40:23,409 --> 00:40:24,809 Y esto ya sí que no. 912 00:40:25,710 --> 00:40:27,269 A menos que esté todavía en fase de pruebas, 913 00:40:27,349 --> 00:40:29,389 haciendo mis cosas. Esto ya sí que no. 914 00:40:29,969 --> 00:40:31,389 Porque cuando es el Main 915 00:40:31,389 --> 00:40:33,429 el que tiene el Throws, cuando 916 00:40:33,429 --> 00:40:34,969 la excepción llega, ¿qué ocurre? 917 00:40:35,309 --> 00:40:37,510 El programa se para. Porque el Main ya no tiene 918 00:40:37,510 --> 00:40:39,510 nadie a quien delegar 919 00:40:39,510 --> 00:40:41,550 y seguirle. El Main ya no tiene nadie. 920 00:40:42,489 --> 00:40:43,449 Es el método 921 00:40:43,449 --> 00:40:45,550 raíz. Entonces, si yo propago 922 00:40:45,550 --> 00:40:47,469 y le digo, oye, guardar nombres, 923 00:40:47,809 --> 00:40:48,929 si te da un error, 924 00:40:49,610 --> 00:40:51,369 propaga, el main dice 925 00:40:51,369 --> 00:40:52,510 uy, pues yo soy el último 926 00:40:52,510 --> 00:40:55,030 yo soy el último, no puedo propagárselo a nadie 927 00:40:55,030 --> 00:40:57,070 para que el de arriba decida si try catch o no 928 00:40:57,070 --> 00:40:59,409 yo soy el último, pues programa se para 929 00:40:59,409 --> 00:41:01,349 entonces que el main tenga un 930 00:41:01,349 --> 00:41:02,869 throws o 931 00:41:02,869 --> 00:41:04,590 cualquier clase principal 932 00:41:04,590 --> 00:41:07,809 pues hombre, ahí ya sí que 933 00:41:07,809 --> 00:41:09,289 cuando estamos todavía 934 00:41:09,289 --> 00:41:11,269 en fase de desarrollo vale, porque no tengo 935 00:41:11,269 --> 00:41:13,050 tantos try catch, pero no debería 936 00:41:13,050 --> 00:41:15,309 ¿y lo mejor es hacer el try catch cuando 937 00:41:15,309 --> 00:41:16,769 cuando primero aparece? 938 00:41:17,050 --> 00:41:19,210 es que depende, depende de 939 00:41:19,210 --> 00:41:21,230 si lo que yo estoy haciendo es un paquete 940 00:41:21,230 --> 00:41:22,610 depende del diseño que haga 941 00:41:22,610 --> 00:41:26,880 vale, pues entonces este throws 942 00:41:26,880 --> 00:41:28,260 aquí sí que no nos gusta 943 00:41:28,260 --> 00:41:34,699 nada, y aquí ya 944 00:41:34,699 --> 00:41:36,619 sí que lo pondríamos, intenta 945 00:41:36,619 --> 00:41:40,030 guardar, dejo 946 00:41:40,030 --> 00:41:41,889 el print extract trace porque estoy todavía 947 00:41:41,889 --> 00:41:44,250 en fase de desarrollo, pues para que 948 00:41:44,250 --> 00:41:47,489 me dé datos técnicos 949 00:41:47,489 --> 00:41:55,829 bueno, pues la excepción la tenemos 950 00:41:55,829 --> 00:41:59,360 ya resuelta, la excepción la tenemos 951 00:41:59,360 --> 00:42:01,139 resuelta, ya hemos podido 952 00:42:01,139 --> 00:42:02,500 crear nuestro flujo 953 00:42:02,500 --> 00:42:04,099 y ahora ya 954 00:42:04,099 --> 00:42:06,860 este flujo nos permite escribir 955 00:42:06,860 --> 00:42:09,000 ¿vale? ahora ya se trata 956 00:42:09,000 --> 00:42:10,539 de ver qué métodos me ofrece 957 00:42:10,539 --> 00:42:13,199 y cuál me interesa, ya está, cuál me interesa 958 00:42:13,199 --> 00:42:14,739 ¿qué métodos me ofrece? 959 00:42:14,840 --> 00:42:15,440 pues un montón 960 00:42:15,440 --> 00:42:22,199 si vemos ahí lo que nos ofrece, pues un montón de cosas 961 00:42:22,199 --> 00:42:31,329 pues nos ofrece 962 00:42:31,329 --> 00:42:33,190 un montón de métodos, ¿vale? 963 00:42:33,369 --> 00:42:34,409 el file writer 964 00:42:34,409 --> 00:42:37,250 en particular relacionado con 965 00:42:37,250 --> 00:42:39,530 escritura, los write, pues puedes 966 00:42:39,530 --> 00:42:41,030 mandar un array de chat de golpe 967 00:42:41,030 --> 00:42:44,710 Puedes mandar un string de golpe 968 00:42:44,710 --> 00:42:46,150 ¿Vale? 969 00:42:46,210 --> 00:42:47,010 Puedes mandar 970 00:42:47,010 --> 00:42:50,690 Esto lo entenderemos mejor 971 00:42:50,690 --> 00:42:51,510 Cuando veamos la lectura 972 00:42:51,510 --> 00:42:53,190 Esto no significa que has mandado un número entero 973 00:42:53,190 --> 00:42:55,469 No, tú le mandas una variable entera 974 00:42:55,469 --> 00:42:58,730 Y él lo que guarda es el último byte 975 00:42:58,730 --> 00:43:00,849 De los cuatro, el menos significativo 976 00:43:00,849 --> 00:43:02,409 Porque interpreta 977 00:43:02,409 --> 00:43:03,630 Que ahí es donde está el char 978 00:43:03,630 --> 00:43:04,769 ¿Vale? 979 00:43:05,510 --> 00:43:07,190 ¿Por qué de esta manera tan extraña? 980 00:43:07,190 --> 00:43:08,210 En lugar de un solo char 981 00:43:08,210 --> 00:43:10,690 Para luego poder sincronizarse con el de leer 982 00:43:10,690 --> 00:43:12,409 Luego con la lectura lo veremos 983 00:43:12,409 --> 00:43:14,190 ¿Vale? Pero no significa que puedas guardar un número 984 00:43:14,190 --> 00:43:17,110 No, es un único char, lo que guardas es que está en el byte menos significativo 985 00:43:17,110 --> 00:43:18,929 Entonces, pues hombre 986 00:43:18,929 --> 00:43:20,030 Este parece bastante útil 987 00:43:20,030 --> 00:43:21,809 Con este puedes mandar un string enterito 988 00:43:21,809 --> 00:43:24,670 Pues venga, vamos a 989 00:43:24,670 --> 00:43:26,510 A usar este 990 00:43:26,510 --> 00:43:28,210 ¿Vale? 991 00:43:28,550 --> 00:43:30,909 Vamos a usar este, pero vamos a tener que hacer un bucle 992 00:43:30,909 --> 00:43:32,989 Para poder escribir todos 993 00:43:32,989 --> 00:43:34,969 Pues venga 994 00:43:34,969 --> 00:43:35,969 Para cada 995 00:43:35,969 --> 00:43:39,780 Nombre 996 00:43:39,780 --> 00:43:41,760 En 997 00:43:41,760 --> 00:43:43,500 nombres 998 00:43:43,500 --> 00:43:49,920 para cada nombre 999 00:43:49,920 --> 00:43:52,179 nombres, ala, escribe 1000 00:43:52,179 --> 00:43:54,659 escribir un fichero 1001 00:43:54,659 --> 00:43:56,239 de texto, pues lo más fácil del mundo 1002 00:43:56,239 --> 00:44:01,360 vale, esto ya está 1003 00:44:01,360 --> 00:44:02,260 cada write 1004 00:44:02,260 --> 00:44:05,340 cada ejecución de write 1005 00:44:05,340 --> 00:44:07,800 escribe y deja posicionado 1006 00:44:07,800 --> 00:44:09,500 el fichero internamente para que los siguientes 1007 00:44:09,500 --> 00:44:11,599 se escriban abajo, claro, no se lo escribe todo el rato 1008 00:44:11,599 --> 00:44:15,719 ¿qué parámetro? 1009 00:44:15,900 --> 00:44:17,179 no, porque es n 1010 00:44:17,179 --> 00:44:21,440 ¿lo pw era? 1011 00:44:21,440 --> 00:44:23,659 era este objeto 1012 00:44:23,659 --> 00:44:24,559 que acabo de crear 1013 00:44:24,559 --> 00:44:29,219 entonces 1014 00:44:29,219 --> 00:44:33,179 inicialmente 1015 00:44:33,179 --> 00:44:34,880 a ver, este constructor 1016 00:44:34,880 --> 00:44:36,039 tiene un segundo parámetro 1017 00:44:36,039 --> 00:44:39,079 que yo puedo usar o no 1018 00:44:39,079 --> 00:44:40,239 que es 1019 00:44:40,239 --> 00:44:42,900 si yo quiero añadir 1020 00:44:42,900 --> 00:44:45,059 en el fichero por si yo hubiera algo antes 1021 00:44:45,059 --> 00:44:46,739 porque puede ser que ese fichero 1022 00:44:46,739 --> 00:44:48,139 que yo abro para escribir 1023 00:44:48,139 --> 00:44:49,679 ya tenga algo de antes 1024 00:44:49,679 --> 00:44:52,039 pues puede ser que yo quiera añadir 1025 00:44:52,039 --> 00:44:54,440 o eliminar todo lo que hubiera y hacerlo de nuevas 1026 00:44:54,440 --> 00:44:57,860 entonces este parámetro de aquí 1027 00:44:57,860 --> 00:45:00,059 este segundo parámetro del constructor 1028 00:45:00,059 --> 00:45:01,360 es un boolean 1029 00:45:01,360 --> 00:45:03,000 que yo lo puedo usar 1030 00:45:03,000 --> 00:45:04,780 si lo pongo a true 1031 00:45:04,780 --> 00:45:07,860 significa que lo quiero en modo añadir 1032 00:45:07,860 --> 00:45:08,980 vale 1033 00:45:08,980 --> 00:45:11,880 entonces vamos a ponerlo ahí 1034 00:45:11,880 --> 00:45:15,900 el segundo parámetro del constructor 1035 00:45:15,900 --> 00:45:20,409 me indica 1036 00:45:20,409 --> 00:45:21,550 si quiero 1037 00:45:21,550 --> 00:45:24,409 añadir o borrar 1038 00:45:24,409 --> 00:45:30,389 si no pones nada por defecto es 1039 00:45:30,389 --> 00:45:32,409 falso, te lo haría 1040 00:45:32,409 --> 00:45:34,849 de limpio el fichero, te sobreescribiría 1041 00:45:34,849 --> 00:45:36,469 o sea, te borraría 1042 00:45:36,469 --> 00:45:37,949 todo lo anterior y lo empezaría de cero 1043 00:45:37,949 --> 00:45:39,750 se atrúes para 1044 00:45:39,750 --> 00:45:41,769 añadir 1045 00:45:41,769 --> 00:45:42,690 eso 1046 00:45:42,690 --> 00:45:45,269 lo que hubiera 1047 00:45:45,269 --> 00:45:50,599 previamente, vale, vamos a 1048 00:45:50,599 --> 00:45:51,840 poner lo que añada y ya está 1049 00:45:51,840 --> 00:45:56,489 vale, una vez que ya hemos 1050 00:45:56,489 --> 00:45:57,909 escrito 1051 00:45:57,909 --> 00:46:00,949 hay que cerrar el flujo 1052 00:46:00,949 --> 00:46:02,989 si no lo cerramos 1053 00:46:02,989 --> 00:46:05,530 cuando el programa acabe se va a cerrar igualmente 1054 00:46:05,530 --> 00:46:07,289 pero si el programa no termina 1055 00:46:07,289 --> 00:46:08,969 porque hace más cosas y yo no lo cierro 1056 00:46:08,969 --> 00:46:11,150 el fichero se queda bloqueado 1057 00:46:11,150 --> 00:46:13,250 y si algún otro proceso quisiera trabajar con él 1058 00:46:13,250 --> 00:46:13,849 pues no podría 1059 00:46:13,849 --> 00:46:17,489 entonces siempre hay que cerrar los flujos 1060 00:46:17,489 --> 00:46:18,449 que se abren, claro 1061 00:46:18,449 --> 00:46:30,030 pues ya está, vamos a probarlo rápidamente 1062 00:46:30,030 --> 00:46:32,250 y paramos, a ver si hemos hecho algo mal 1063 00:46:32,250 --> 00:46:40,679 ¿eh? 1064 00:46:41,320 --> 00:46:42,719 lo que hubiera de antes 1065 00:46:42,719 --> 00:46:44,380 Lo borra enterito 1066 00:46:44,380 --> 00:46:46,239 No es que sobreescriba 1067 00:46:46,239 --> 00:46:49,039 Porque podríamos interpretar que si el de antes tiene algo más 1068 00:46:49,039 --> 00:46:50,940 Lo de abajo se queda sin sobreescribir 1069 00:46:50,940 --> 00:46:52,960 No, no, no, no, lo limpia todo de cero 1070 00:46:52,960 --> 00:46:54,960 Y añade lo que tú 1071 00:46:54,960 --> 00:46:56,239 Hayas puesto 1072 00:46:56,239 --> 00:46:57,639 ¿Eh? 1073 00:46:57,639 --> 00:46:58,539 Un segundo abajo 1074 00:46:58,539 --> 00:47:00,059 Eh 1075 00:47:00,059 --> 00:47:07,280 Cada nombre lo va mandando 1076 00:47:07,280 --> 00:47:12,760 Vale, pues venga 1077 00:47:12,760 --> 00:47:14,860 Aquí me está pidiendo los nombres 1078 00:47:14,860 --> 00:47:16,619 Los 10 nombres que yo le he puesto 1079 00:47:16,619 --> 00:47:23,230 Vale, ¿en qué fichero 1080 00:47:23,230 --> 00:47:24,070 Quiere guardarlo? 1081 00:47:25,489 --> 00:47:27,090 Le voy a dar un nombre cualquiera 1082 00:47:27,090 --> 00:47:28,949 Porque si no existe, lo va a crear 1083 00:47:28,949 --> 00:47:30,250 ¿Y dónde? 1084 00:47:30,849 --> 00:47:33,610 Como no le hemos dado ruta en la raíz del proyecto 1085 00:47:33,610 --> 00:47:35,449 Pues en el fichero 1086 00:47:35,449 --> 00:47:37,750 Nombres.txt 1087 00:47:37,750 --> 00:47:38,590 Por ejemplo 1088 00:47:38,590 --> 00:47:40,309 Terminado 1089 00:47:40,309 --> 00:47:42,730 Vale, no ha salido de exception 1090 00:47:42,730 --> 00:47:45,530 Entonces si refrescamos aquí el proyecto 1091 00:47:45,530 --> 00:47:48,130 Si lo refrescamos 1092 00:47:48,130 --> 00:47:49,190 Pues aquí ha aparecido 1093 00:47:49,190 --> 00:47:52,639 Y aquí están los nombres 1094 00:47:52,639 --> 00:47:53,119 ¿Vale? 1095 00:47:57,300 --> 00:47:58,239 Como lo he abierto 1096 00:47:58,239 --> 00:48:00,980 Si lo haces a refrescar para que te aparezca todo 1097 00:48:00,980 --> 00:48:03,039 Claro, yo no he puesto saltos de línea 1098 00:48:03,039 --> 00:48:04,960 Entre ellos, pues los ha puesto todos seguidos 1099 00:48:04,960 --> 00:48:07,219 Esto, claro, habría sido 1100 00:48:07,219 --> 00:48:07,880 Más bonito 1101 00:48:07,880 --> 00:48:10,360 Porque así nos ha quedado muy feo 1102 00:48:10,360 --> 00:48:12,400 Lógicamente 1103 00:48:12,400 --> 00:48:15,139 Habiendo escrito 1104 00:48:15,139 --> 00:48:16,679 Write más 1105 00:48:16,679 --> 00:48:20,840 El barra n 1106 00:48:20,840 --> 00:48:25,139 Claro 1107 00:48:25,139 --> 00:48:27,260 Le voy a quitar para que no añade 1108 00:48:27,260 --> 00:48:29,000 Y me lo haga de limpias otra vez 1109 00:48:29,000 --> 00:48:35,750 Vale, ahora ya me los va a poner 1110 00:48:35,750 --> 00:48:36,690 Con salto de línea 1111 00:48:36,690 --> 00:48:45,510 Nombres.txt 1112 00:48:46,969 --> 00:48:47,789 Por ejemplo 1113 00:48:47,789 --> 00:48:52,750 Ahora ya sí 1114 00:48:52,750 --> 00:48:59,369 Vale, vamos a parar aquí un segundinín