2011-05-02 16 views
7

Tengo un archivo .txt LARGO que contiene casi 6000 líneas. A veces necesito recuperar la información. en la línea 5000. ¿Es posible comenzar a leer desde la línea 5000 en lugar de comenzar desde el principio?¿Hace que BufferedReader comience desde la mitad de un archivo .txt en lugar de hacerlo desde el principio?

Gracias.

+1

En Java, 6000 líneas no es suficiente para preocuparse. No le ahorrará mucho tiempo, ya que el mayor costo es acceder al disco. ~ 10 ms. Todo lo demás es pequeño en comparación. –

Respuesta

3

Ya sea 6000 líneas son largas o no depende de la duración promedio de la línea. Incluso con 100 caracteres por línea, esto no es realmente largo.

Sin embargo, puede leer desde la línea 5000 si sabe dónde comienza la línea 5000. Desafortunadamente, la mayoría de las veces tendrás que leer las líneas 1 a 4999 para descubrirlo.

+0

Hay posiciones fijas de las que quiero comenzar para obtener el texto, por ejemplo: Líneas: 1 a 7, 8 a 300, 301 a 500 ... Así que me preguntaba si había una manera de comenzar desde una posición ... – Omar

+0

@Omar, lea el comentario de Peter arriba. Simplemente vaya a través de este pequeño archivo línea por línea. Aunque se puede colocar un archivo en un desplazamiento de bytes dado, no hay una manera fácil de calcular un desplazamiento de bytes desde un número de línea, incluso si cada línea tiene la misma longitud en caracteres, aún no se sabe cuántos bytes hay. – Ingo

0

Creo que hay un método de omisión para el BufferedReader en java, que le permite omitir x caracteres. Sin embargo, para llegar a una línea específica es mucho más difícil.

Editar: Found it

+0

La longitud de las líneas no está fija así que eso no me ayudará = \ – Omar

+0

Eso es lo que pensé. Si el archivo de texto es un registro o algo similar donde las primeras 4999 líneas no cambian, entonces valdría la pena almacenar en caché (si esa es la palabra correcta para usar) la posición de la línea 5000a, y leerla completamente si la caché no está t construido. – Matt

2

5000 líneas no es tan grande, y harán un acceso a archivos secuenciales, esta simple idea podría funcionar:

BufferedReader in = new BufferedReader(new InputStreamReader(fileName)); 
for (int i = 0; i < 5000 && in.ready; in.readLine()) { } 
if (in.ready()) { 
    // you are at line 5000; 
} else { 
    // the file is smaller than 5000 lines 
} 

Otra idea es utilizar el método bufferedRead.skip (n), pero para cada línea debe tener la misma longitud. Por ejemplo, cada línea que tenga 100 caracteres, tendrá que hacer:

int ls = System.getProperty("line.separator").length(); 
in.skip((100 + ls) * 5000); 
+0

Las líneas no son de la misma longitud. Usaré la primera solución, ¡creo que leer 5000 líneas es enorme! Gracias. – Omar

+0

Si son del mismo tamaño, el salto de BufferedRead funcionará bien, simplemente no olvide el separador de línea. – Pih

Cuestiones relacionadas