Pregunta

Tengo un código Java que lee a través de un archivo de entrada usando un lector de memoria intermedia hasta que el readLine() devuelve el método null. Necesito usar el contenido del archivo de nuevo número indefinido de veces. ¿Cómo puedo leer este archivo desde el principio otra vez?

¿Fue útil?

Solución

lo hace llamando al run () la función recursiva, después de comprobar para ver si hay más líneas pueden leerse - aquí está una muestra

// Reload the file when you reach the end (i.e. when you can't read anymore strings)
  if ((sCurrentLine = br.readLine()) == null) {
    run();
  }

Otros consejos

Puede cerrar y volver a abrir de nuevo. Otra opción:. Si no es demasiado grande, poner su contenido en, digamos, una List

Buffer soportes lector de reset () a una posición de sólo datos almacenados temporalmente. Pero esto no puede Goto el inicio del archivo (supongamos que el archivo más grande que la memoria intermedia).
Soluciones:
1.Reopen
2.Use RandomAccessFile

Una sola Reader debe utilizarse una vez para leer el archivo. Si desea leer el archivo de nuevo, crear un nuevo Reader basado en él.

guayaba 's utilidades IO, puede crear una abstracción agradable que permite se lee el archivo tantas veces como se desee mediante InputSupplier que se puede recuperar a partir de un nuevo Reader llamando getInput() en cualquier momento.

Aún mejor, la guayaba tiene muchos métodos de utilidad que hacer uso de InputSuppliers directamente ... Esto le ahorra tener que preocuparse por el cierre de la Reader suministrado a sí mismo. El CharStreams clase contiene la mayor parte de las utilidades IO relacionadas con el texto. Un simple ejemplo:

public void doSomeStuff(InputSupplier<? extends Reader> readerSupplier) throws IOException {
  boolean needToDoMoreStuff = true;
  while (needToDoMoreStuff) {
    // this handles creating, reading, and closing the Reader!
    List<String> lines = CharStreams.readLines(readerSupplier);
    // do some stuff with the lines you read
  }
}

Dado un File, que podría llamar a este método como:

File file = ...;
doSomeStuff(Files.newReaderSupplier(file, Charsets.UTF_8)); // or whatever charset

Si usted quiere hacer algo de procesamiento para cada línea sin necesidad de leer cada línea primero en la memoria, se puede utilizar como alternativa la sobrecarga readLines que toma un LineProcessor .

Si quieres hacer esto, es posible que desee considerar un al azar archivo de acceso. Con esto se puede establecer explícitamente la posición de la espalda al principio y empezar a leer de nuevo desde allí.

Me bibliotecas usings sugerencia Commons

http: //commons.apache. org / io / API de liberación / org / apache / Commons / io / FileUtils.html

Creo que hay una llamada a la que acaba de leer el archivo en un bytearray que podría ser un enfoque alternativo

No estoy seguro si usted ha considerado los métodos mark() y reset() en la BufferedReader

que puede ser una opción si los archivos son sólo unos cuantos MB de tamaño y se puede establecer la marca en el principio del archivo y mantener reset () ing una vez que llega al final del archivo. También parece que las lecturas siguientes en el mismo archivo será servido por completo de la memoria intermedia sin tener que ir a la disco.

Me enfrentó con el mismo tema y llegó errante a esta pregunta.

1. Uso de marca () y reset () métodos:

BufferedReader se puede crear con un FileReader y también un FileInputStream. FileReader no es compatible con Mark y métodos de restauración. Tengo una excepción mientras yo trataba de hacer esto. Incluso cuando he intentado con FileInputStream yo no era capaz de hacerlo porque mi archivo era grande (incluso sus'S es, supongo). Si la longitud del archivo es mayor que el buffer luego marcar y métodos de restauración no funcionará ni con FileReader no con FileInputStream. Más sobre esto en esta respuesta por @jtahlborn.

2. Cerrar y volver a abrir el archivo

Cuando cerrar y reabrir el archivo y creé una nueva BufferedReader, funcionó bien. La forma ideal supongo que es para volver a abrir el archivo de nuevo y construir una nueva BufferedReader como FileReader o FileInputStream se deben utilizar sólo una vez para leer el archivo.

try {
            BufferedReader br = new BufferedReader(new FileReader(input));

            while ((line = br.readLine()) != null)
            {
                //do somethng
            }
            br.close();
        }
        catch(IOException e)
        {
            System.err.println("Error: " + e.getMessage());

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