Foros del Web » Programación para mayores de 30 ;) » Java »

RandomAccessFile para leer aleatoriamente

Estas en el tema de RandomAccessFile para leer aleatoriamente en el foro de Java en Foros del Web. Hola, estoy intentando hacer lo siguiente y no se como hacerlo Tengo un fichero de texto (tiene que ser de texto) con 250 lineas con ...
  #1 (permalink)  
Antiguo 02/02/2011, 05:53
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 11 meses
Puntos: 0
RandomAccessFile para leer aleatoriamente

Hola, estoy intentando hacer lo siguiente y no se como hacerlo

Tengo un fichero de texto (tiene que ser de texto) con 250 lineas con el siguiente formato:

0.49 -0.66 0
-0.33 -0.55 1

Es decir dos numeros de tipo double y un entero, y de esos 250 lineas quiero sacar 75 de manera aleatoria y meterlos en un vector de objetos del tipo que he creado. El tipo contiene dos valores double y un entero.

Utilizando la clase RandomAccessFile para acceder al fichero de manera aleatoria sin tener que ir linea a linea es posible hacer esto???

Solo quero saber como pasar de una linea a otra de manera aleatoria, ya que el resto ya lo tengo hecho
  #2 (permalink)  
Antiguo 02/02/2011, 09:29
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 7 meses
Puntos: 306
Respuesta: RandomAccessFile para leer aleatoriamente

Partiendo de que el RandomAccessFile no es lo más recomendable para ficheros de texto, puedes hacer lo siguiente.

Por cada línea que te quieras saltar, tienes que que saber el número total de bytes (1 por caracter + 2 por salto de línea) que en tu caso parece que será siempre 14, pero compruébalo.

En tu objeto RandomAccessFile utiliza readLine para leer una línea y skipBytes(14) para saltártela.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 02/02/2011, 09:34
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 2 meses
Puntos: 454
Respuesta: RandomAccessFile para leer aleatoriamente

bueno, no parece que 14 sea fijo, algunos números son negativos y llevan signo, mientras que los positivos no los llevan, por lo que no es posible saltar al principio de una línea concreta con RandomAccessFile sin leer todo el fichero línea a línea.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #4 (permalink)  
Antiguo 02/02/2011, 09:44
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 7 meses
Puntos: 306
Respuesta: RandomAccessFile para leer aleatoriamente

Cierto, por eso le dije que lo comprobase, como no sabemos qué son esos números, igual sí tienen siempre ese formato.

Lo normal sería que guardase todos los números como double (writeDouble), pero claro, ya no le quedaría un fichero leíble desde un procesador de textos.

No se puede tener todo
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 02/02/2011, 09:44
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: RandomAccessFile para leer aleatoriamente

Entonces segun parece lo mejor seria no utilizar el fichero de acceso aleatorio y hacerlo de manera normal para posteriormente leer una linea completa y mediante un random saltar x lineas leyendo dichas lineas y vovler a leer otra linea y asi sucesivamente. (simpre y cuando el random que utilize me de valores entre 0 y 240 que son las lineas que tiene el fichero.... Es lo que habia pensado hacer pero no se si sera lo más correcto.
  #6 (permalink)  
Antiguo 02/02/2011, 10:03
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 7 meses
Puntos: 306
Respuesta: RandomAccessFile para leer aleatoriamente

Más fácil que eso, metes todas las líneas en un List y utilizas el método shuffle de Collections para desordenarlo aleatoriamente. Luego lees los que necesites.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 02/02/2011, 10:05
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: RandomAccessFile para leer aleatoriamente

y si lo hago normal

archivo = new File ("datos.txt");
fr = new FileReader (archivo);
br = new BufferedReader(fr);

br.readLine() me dara la primera linea

luego solo necesito un metodo que me de numeros aleatorios entre 0 y 249 que son la lineas del fichero y hacer un bucle que lea una linea x veces...

Pero como vuelvo en cada iteracion al principio del fichero????
  #8 (permalink)  
Antiguo 02/02/2011, 10:09
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 2 meses
Puntos: 454
Respuesta: RandomAccessFile para leer aleatoriamente

Leer el fichero así no sería eficiente, puesto que tendrías que hacer muchas lecturas de lo mismo una y otra vez. Los accesos a disco son costosos.

Si tienes 240 líneas y son de ese tamaño, no son muchas ni muy grandes. Es mejor hacer lo que te comenta Xerelo, leerlas todas de golpe y meterlas en un List.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #9 (permalink)  
Antiguo 02/02/2011, 10:14
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: RandomAccessFile para leer aleatoriamente

perfecto entonces xerelo, eso es lo que queria conseguir, no queria tener que leer una y otra vez tontamente las lineas. Probare asi y les cuento.

Un saludo y gracias
  #10 (permalink)  
Antiguo 02/02/2011, 10:47
 
Fecha de Ingreso: enero-2008
Mensajes: 6
Antigüedad: 16 años, 11 meses
Puntos: 0
Respuesta: RandomAccessFile para leer aleatoriamente

Perdonen mi ignorancia pero como hago una lista de mi tipo de datos en concreto

Muestra [] arrayMuestras= new Muestra[250]

No me dejaria hacer suffle

Etiquetas: aleatoriamente
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:21.