Frage

Ich habe einen Java-Code, der eine Eingabedatei liest durch readLine() unter Verwendung eines Puffers Leser, bis die null Methode zurückgibt. Ich brauche den Inhalt der Datei wieder beliebig oft zu verwenden. Wie kann ich wieder diese Datei von Anfang gelesen haben?

War es hilfreich?

Lösung

Sie tun dies, indem die Funktion run () rekursiv aufrufen, nachdem Sie prüfen, wenn keine weiteren Zeilen gelesen werden können - hier ist eine Probe

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

Andere Tipps

Sie können es wieder schließen und wieder öffnen. Eine weitere Option:., Wenn sie nicht zu groß ist, setzen ihren Inhalt in, sagen wir, eine Liste

Pufferleser unterstützt reset () in eine Position von gepufferten nur Daten. Aber das kann nicht gehe den Beginn der Datei (nehme an, dass Datei größer als Puffer).
Lösungen:
1.Reopen
2.Use Random

Ein einzelner Reader sollte einmal verwendet werden, um die Datei zu lesen. Wenn Sie die Datei erneut lesen möchten, erstellen Sie eine neue Reader auf ihr basiert.

Mit Guava 's IO-Dienstprogramme, können Sie eine schöne Abstraktion erstellen, die können Sie lesen Sie die Datei so oft wie Sie wollen mit Files.newReaderSupplier (Datei, Charset) . Dies gibt Ihnen eine InputSupplier , dass Sie einen neuen Reader von durch den Aufruf getInput() jederzeit abrufen können.

Noch besser ist, hat Guava viele Utility-Methoden, dass nutzen InputSuppliers direkt ... dies erspart Ihnen, sich Sorgen zu machen über das mitgelieferte Reader Schließen Sie sich. Die CharStreams Klasse enthält die meisten die textbezogenen IO-Utilities. Ein einfaches Beispiel:

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
  }
}

Bei einem File, könnte man diese Methode, wie nennen:

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

Wenn Sie einige Verarbeitung für jede Zeile tun wollen, ohne vorher jede Zeile in den Speicher zu lesen, können Sie alternativ die readLines Überlastung verwenden, die eine LineProcessor .

Wenn Sie dies tun wollen, können Sie eine zufällig zu prüfen, Zugriffsdatei . Damit Sie explizit die Position zurück an den Anfang setzen und beginnen wieder von dort zu lesen.

ich würde Vorschlag usings commons Bibliotheken

http: //commons.apache. org / io / api-release / org / apache / commons / io / FileUtils.html

Ich glaube, es ist ein Aufruf nur die Datei in ein byteArray lesen, die ein alternativer Ansatz sein könnte

Nicht sicher, ob Sie die mark() und reset() Methoden in Betracht gezogen haben, auf die BufferedReader

, die eine Option sein kann, wenn Sie Ihre Dateien nur wenige MBs groß sind und Sie die Markierung am Anfang der Datei einstellen und halten reset () ing, sobald Sie das Ende der Datei getroffen. Es scheint auch, dass nachfolgend auf der gleiche Datei liest, wird auf die Festplatte, ohne gehen vollständig aus dem Puffer bedient werden.

ich konfrontiert mit dem gleichen Problem und kam auf diese Frage wandern.

1. Mit Markierung () und reset () Methoden:

BufferedReader kann erstellt werden, um einen Filereader verwendet und auch einen Fileinputstream. Filereader nicht Mark und Reset-Methoden unterstützen. Ich habe eine Ausnahme, während ich versuchte, dies zu tun. Selbst wenn ich versuchte, mit Fileinputstream Ich war nicht in der Lage, es zu tun, weil meine Datei groß war (auch Ihr ist glaube ich). Wenn die Dateilänge größer als der Puffer ist dann markieren und Reset-Methoden nicht funktioniert weder mit Filereader nicht mit Fileinputstream. Mehr dazu im diese Antwort von @jtahlborn.

2. Schließen und erneuten Öffnen der Datei

Wenn ich geschlossen und die Datei wieder geöffnet und einen neuen BufferedReader erstellt, es funktionierte gut. Der ideale Weg, ich denke, ist die Datei erneut wieder zu öffnen und einen neuen BufferedReader-Konstrukt, wie ein Filereader oder Fileinputstream sollte nur einmal verwendet werden, um die Datei zu lesen.

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());

        }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top