Pregunta

Actualmente tengo 2 BufferedReader s inicializados en el mismo archivo de texto. Cuando termine de leer el archivo de texto con el primer BufferedReader , utilizo el segundo para hacer que otro pase por el archivo desde la parte superior. Se necesitan múltiples pases a través del mismo archivo.

Sé sobre reset () , pero debe ir precedido de llamar a mark () y mark () necesita saber tamaño del archivo, algo con lo que no creo que deba preocuparme.

Ideas? Paquetes? Libs? Código?

Gracias TJ

¿Fue útil?

Solución

¿Cuál es la desventaja de crear un nuevo BufferedReader para leer desde arriba? Esperaría que el sistema operativo guarde en caché el archivo si es lo suficientemente pequeño.

Si le preocupa el rendimiento, ¿ha demostrado que es un cuello de botella? Simplemente haría lo más simple y no me preocuparía hasta que tenga una razón específica para hacerlo. Quiero decir, podrías leer todo en la memoria y luego hacer los dos pases sobre el resultado, pero nuevamente será más complicado que solo leer desde el principio nuevamente con un nuevo lector.

Otros consejos

Los lectores almacenados en búfer están destinados a leer un archivo secuencialmente. Lo que está buscando es el java.io.RandomAccessFile , y luego puedes usar seek () para llevarte a donde quieras en el archivo.

El lector de acceso aleatorio se implementa así:

try{
     String fileName = "c:/myraffile.txt";
     File file = new File(fileName);
     RandomAccessFile raf = new RandomAccessFile(file, "rw");
     raf.readChar();
     raf.seek(0);
} catch (FileNotFoundException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
} catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
}

El " rw " es un carácter de modo que es detallado aquí .

La razón por la cual los lectores de acceso secuencial están configurados de esta manera es para que puedan implementar sus memorias intermedias y que las cosas no puedan cambiarse bajo sus pies. Por ejemplo, el lector de archivos que se entrega al lector con buffer solo debe ser operado por ese lector con buffer. Si hubiera otra ubicación que pudiera afectarlo, podría tener una operación inconsistente ya que un lector avanzó su posición en el lector de archivos mientras que el otro quería que permaneciera igual ahora que usa el otro lector y está en una ubicación indeterminada.

La mejor manera de proceder es cambiar su algoritmo, de forma tal que NO necesite la segunda pasada. Utilicé este enfoque un par de veces, cuando tuve que lidiar con archivos enormes (pero no terribles, es decir, pocos GB) que no se ajustaban a la memoria disponible.

Puede ser difícil, pero el aumento de rendimiento generalmente vale la pena el esfuerzo

Acerca de marcar / restablecer:

El método de marca en BufferedReader toma un parámetro readAheadLimit que limita cuánto puede leer después de una marca antes de que el restablecimiento se vuelva imposible. Restablecer no significa en realidad una búsqueda del sistema de archivos (0), solo busca dentro del búfer. Para citar el Javadoc:

  

readAheadLimit - Límite en la cantidad de caracteres que se pueden leer mientras se conserva la marca. Después de leer tantos caracteres, puede fallar el intento de restablecer la transmisión. Un valor límite mayor que el tamaño del búfer de entrada hará que se asigne un nuevo búfer cuyo tamaño no sea menor que el límite. Por lo tanto, los valores grandes deben usarse con cuidado.

" Todo el negocio sobre mark () y reset () en BufferedReader huele a diseño pobre. "

¿por qué no extiendes esta clase y haces que marque () en el constructor () y luego realiza una búsqueda (0) en el método topOfFile ()?

BR,
~ A

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top