Lectura de archivos

Ya nos habíamos conocido por unas preguntas que te hice sobre un juego de ahorcado que estaba programando.
Bueno, la verdad es que aún no lo termino y me topé con un nuevo problema:
Tengo un archivo de texto con más de 90000 palabras que es mi fuente de palabras para el ahorcado (las que hay que ir adivinando), ahora bien, la idea es leer una linea del archivo y devolver la palabra (hay una por linea separadas por un ENTER) esto lo probé con un bucle que recorre todo el archivo, claro que lo tuve que detener antes de terminar porque es muy largo el archivo.
Yo lo que estoy haciendo es usar un BufferedReader combinado con un FilerReader y uso el método readLine() del Buffered... Ahora lo que yo realmente necesito es poder especificar la linea a leer, la cual la selecciono al azar con Math. Random();
Se me ocurrió una posible solución, pero podría llegar a tomar MUCHO tiempo.
Esto es hacer un bucle desde la linea una a la elegida e ir leyéndolas todas y almacenándolas en un string (se sobreescribe en cada iteración) hasta que llegue a la linea deseada y me quedo con ese valor; claro, esto es útil si tengo que recorrer 50 lineas, pero si debo recorrer 85326 me va a tomar algunos minutos, sino unas horas!
Solo quería ver si se te ocurría algo mejor y por su puesto más RÁPIDO.

1 respuesta

Respuesta
1
Antes de nada, perdona por la tardanza pero he estado algo liado :(
Veras, no se puede realizar acceso aleatorio a ficheros en Java, sólo se permite el acceso secuencia, es decir, byte a byte; de hecho no puedes retroceder, lo que has leído no puedes volver a leerlo a no ser que reinicies la lectura. En la J2SE 1.4xx existe una clase, FileChannel, que permite virtualmente realizar este tipo de cosas, pero como digo es un acceso aleatorio virtual, internamente realiza un acceso lineal por el fichero.
¿Qué quiero decir con esto? Que no existe una forma para decir "lee la línea 849 de el fichero tal", tienes que leer las 848 lineas anteriores primero.
¿Qué puedes hacer? Se me ocurre varias soluciones, la primera pasa por dividir tu archivo de 90mil líneas en varios archivos de menor tamaño, y tener dos números aleatorios, uno para elegir el archivo, y otro para elegir el número de línea (y recorrer el archivo como tu dices). Otra solución es, dividiendo tu archivo en varios archivos más pequeños, elegir uno aleatoriamente, y guardar todas esas palabras en un array de string. Las palabras estarán entonces en memoria y el acceso a ellas será instantáneo. Puedes, por ejemplo, una vez elegido el archivo POR, leer las 100 primeras líneas para obtener las 100 primeras palabras. Sin cerrar el archivo, guardas esas 100 palabras en un array, y las utilizas aleatoriamente durante, por ejemplo, 10 intentos. Una vez pasados esos 10 intento, si el usuario sigue juganod, sigues leyendo en el archivo y sustituyes tu array por otras 100 palabras (las 100 siguientes) y continúas así :) Puedes también tener varios objetos FileReader (o el Reader que utilices) y leer cada vez de un archivo diferente, lees 10 palabras y eliges una al azar... no se, las posibilidades son múltiples :)
Si no te convence ninguna puedo seguir dándole a la cabeza a ver si se me ocurre alguna más, pero así como primera idea creo que ninguna es una mala opción :)
Ya sabes, para más información o cualquier otra pregunta, aquí me tienes.
No te preocupes, conseguí hacerlo convirtiendo mi archivo secuancial en un RandomAccessFile y de ahí puedo establecer el numero de linea! Igualmente gracias por tu ayuda. Y no te preocupes por la demora, yo también he tenido mis días! (A propósito, ahí te van tus estrellitas)
Saludos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas