2017-08-01 1 views
2
class LogReader { 
public void readLogFile(String path){ 
    BufferedReader br = new BufferedReader(new FileReader(path)); 
    String currentLine=null; 
    while(currentLine=br.readLine()!=null){ 
    System.out.println(currentLine); 
    } 
} 
} 

Stellen Sie sich vor, ich habe eine Protokolldatei im Wert von mehreren 100 Megs. Wird der obige Code die gesamte Datei im Speicher laden? Wenn ja, was ist der wirkliche Vorteil der Pufferung hier?Wird BufferedReader die gesamte Datei in den Speicher laden?

Ich lese Datei I/O und nicht in der Lage zu verstehen, ob wir die Bytes im Wert einer Zeile (currentLine) oben im Speicher laden oder die gesamte Datei in den Speicher und dann wird jede Zeile gelesen und zugewiesen wird auf die Variable im Speicher erneut.

Bitte sagen Sie mir, wie ich vermeiden kann, die gesamte Datei im Speicher zu laden, wenn dies nicht der Fall ist.

+0

Eine gute Frage, aber es kann besser formuliert werden. –

Antwort

4

Wird der obige Code die gesamte Datei im Speicher laden?

Nr

Wenn ja, was der wirkliche Nutzen der Pufferung hier ist?

von Daten ein Stück zu einer Zeit, zu lesen, die als das Lesen ein Zeichen in einer Zeit der Regel effizienter ist, und es so Ihre Schnittstelle zum Puffern der Daten ist immer noch so granular wie Sie es (read sein wollen, readLine usw.).

Die BufferedReader documentation ist ganz klar, was es tut, und warum:

Liest Text aus einem Zeicheneingabestrom, Zeichen zu puffern, um für die effiziente Lesen von Zeichen, Arrays und Linien zur Verfügung zu stellen. Die Puffergröße kann angegeben oder die Standardgröße verwendet werden. Der Standardwert ist für die meisten Zwecke groß genug.

Im Allgemeinen führt jede Leseanforderung eines Readers dazu, dass eine entsprechende Leseanforderung für das zugrunde liegende Zeichen oder den Bytestrom erfolgt. Es empfiehlt sich daher, einen BufferedReader um jeden Reader zu wickeln, dessen read() - Operationen kostspielig sind, z. B. FileReaders und InputStreamReaders. Beispiel:

BufferedReader in 
    = new BufferedReader(new FileReader("foo.in")); 

puffert die Eingabe von der angegebenen Datei. Ohne Pufferung könnte jeder Aufruf von read() oder readLine() dazu führen, dass Bytes aus der Datei gelesen, in Zeichen konvertiert und dann zurückgegeben werden, was sehr ineffizient sein kann.

(Hervorhebung von mir)

+0

Was ist der Fall, wenn die foo.in dynamisch wächst? – prime

+0

Die Weise, die ich von Ihrem Beitrag verstehe, ist der gepufferte Leser liest 'n' Anzahl der Zeilen entsprechend der Puffergröße und das ist, was im Speicher gehalten wird. Es ist dann nach der readLine-Methode Implementierung, die eine Zeile im Wert von Bytes aus dem Puffer ausgibt. Habe ich recht ? Also der obige Ansatz wird keine Skalierungsprobleme haben, oder? – user7246161

+0

@prime: Das wäre eine ganz andere Frage als die Frage hier. (Und die Antwort ist: Genau was passiert, wenn ein nicht gepufferter Reader eine wachsende Datei liest.) –

Verwandte Themen