2011-01-09 12 views
19

Was ist der Sinn der Puffergröße im Konstruktor?Wie groß ist die Puffergröße in BufferedReader?

BufferedReader(Reader in, int size) 

Als ich das Programm geschrieben haben:

import java.io.*; 
class bufferedReaderEx{ 
    public static void main(String args[]){ 
     InputStreamReader isr = null; 
     BufferedReader br = null; 
      try{ 
       isr = new InputStreamReader(System.in); 
//    System.out.println("Write data: "); 
//    int i = isr.read(); 
//    System.out.println("Data read is: " + i); 
       //Thus the InputStreamReader is useful for reading the character from the stream 
       System.out.println("Enter the data to be read by the bufferedReader: "); 
       //here isr is containing the lnefeed already so this is needed to be flushed. 
       br = new BufferedReader(isr, 2); 
       String str = br.readLine(); 
       System.out.println("The data is : :" + str); 
      }catch(IOException e){ 
       System.out.println("Can't read: " + e.getMessage()); 
      } 
    } 
} 

Ausgang:

Enter the data to be read by the bufferedReader: Hello world and hello world again 
The data is: Hello world and hello world again 

Dann, was die Puffergröße tut bedeutet, wie ich gedacht, dass es nur zwei Zeichen lesen würde. aber das war es nicht.

Antwort

29

BufferedReader puffert den Eingang, wie der Name schon sagt. Dies bedeutet, dass es von der Eingabequelle in einen Puffer liest, bevor es an Sie weitergegeben wird. Die Puffergröße bezieht sich hier auf die Anzahl der zwischengespeicherten Bytes.

Lesen Eingang ist von den meisten Quellen ist sehr langsam. Ein Puffer von nur 2 Bytes wird die Leistung beeinträchtigen, da Ihr Programm wahrscheinlich die meiste Zeit auf Eingaben wartet. Bei einer Puffergröße von 2 führt ein Lesen von 100 Bytes zum Lesen von 2 Bytes aus dem Speicherpuffer (sehr schnell), Füllen des Puffers (sehr langsam), Lesen von 2 Bytes aus dem Puffer (sehr schnell), Füllen der Puffer (sehr langsam) usw. - insgesamt sehr langsam. Bei einer Puffergröße von 100 führt ein Lesen von 100 Bytes dazu, dass 100 Bytes aus dem Speicherpuffer gelesen werden (sehr schnell) - insgesamt sehr schnell. Dies setzt voraus, dass der Puffer die 100 Bytes beim Lesen enthält, was in einem Fall wie dem Ihren eine vernünftige Annahme ist.

Wenn Sie nicht wissen, was Sie tun, sollten Sie die Standardpuffergröße verwenden, die ziemlich groß ist. Ein Grund für einen kleineren Puffer ist, wenn Sie auf einem Gerät mit begrenztem Speicher arbeiten, da der Puffer Speicher belegt.

+0

dann was ist die Bedeutung der Puffergröße. würdest du mir bitte erklären? – codeomnitrix

+1

@codeonnitrix Ein bisschen Erklärung hinzugefügt. Lassen Sie mich wissen, ob das ausreicht. – marcog

+0

danke marcog .. – codeomnitrix

0

Es ist die Größe des Eingabepuffers. Lesen Sie mehr in javadoc.

+0

Hey, ich habe das schon gelesen, eigentlich möchte ich wissen, was die Auswirkung von weniger Puffergröße oder großer Puffergröße ist. Ich meine, was ist seine Bedeutung. Ich meine, wenn Puffergröße 12000 oder 200 ist, was sollte verwendet werden, wenn – codeomnitrix

+1

Puffer mit Größe 12000 mehr Speicher verwenden wird, aber schneller funktioniert. Statt mit 200 wird es langsamer, aber mit geringer Speicherauslastung. * langsamer/schneller bei großen Datengrößen. –

+0

dann bedeutet es, dass die Arbeit jedes Mal gemacht wird, aber in der Vergangenheit wird ein 20000 Block zwei Runden dauern, während in der anderen derselbe 100 Runden braucht. ist es? – codeomnitrix

9

Wenn Sie eine Datei lesen oder schreiben, müssen Sie auf den Kernel zugreifen, der tatsächlich Zugriff auf die Datei erhält. Alle Dateioperationen müssen den Kernel durchlaufen. Dies ist eine ziemlich kostspielige Operation. Die Pufferung bewirkt, dass ein Teil der Bytes gelesen wird. Diese werden an einem temporären Ort im RAM gehalten und es werden Bytes von diesem Ort eingelesen. Auf diese Weise fordern Sie den Kernel nicht häufig dazu auf, Datei-IO auszuführen.

Wenn Sie eine riesige Puffergröße verwenden, werden Sie unnötig RAM RAM. Wenn Sie einen winzigen verwenden, werden Sie den Kernel ständig nach Dateianfragen abhören. Es empfiehlt sich, den Standardwert zu verwenden. Sie können Puffergröße und Experiment angeben. Die meisten Maschinen lesen einen Sektor oder eine ganzzahlige Anzahl von Sektoren. Die Sektorgröße hängt davon ab, wie Sie Ihre Maschine formatieren.

Das folgende Experiment ist interessant. Erstellen Sie eine Datei mit 1.000.000 Nullen darin. Verwenden Sie die Timing-Funktion Ihres Betriebssystems, um zu sehen, wie schnell es in eine andere Datei kopiert wird (Sie schreiben ein Kopierprogramm mit gepuffertem und ungepuffertem IO). Zeit es mit verschiedenen Puffergrößen einschließlich der Standardeinstellung.

8

http://www.docjar.com/html/api/java/io/BufferedReader.java.html

Per dieser Java-Dokumentation, Standardpuffergröße ist 8192 Zeichen Kapazität. Die Zeilengröße wird als 80 Zeichen Kapazität betrachtet.

8192 Puffergröße ist ausreichend für kleinere Dateigrößen. Aber auch das ist wachstumsfähig. Wenn die Datei mehr als 8192 Zeichen enthält, erhöht die Füllmethode von bufferedreader die Puffergröße, bevor Inhalt aus der Datei gelesen wird.Bei größeren Inhaltsdateien sollten Sie vorzugsweise Ihre maximale Größe für den Puffer festlegen, während Sie einen gepufferten Reader über Konstruktor erstellen, damit Sie nicht mehr Speicher neu erstellen und das alte Array in das neu erstellte Array kopieren müssen.

+0

Geradeaus und Clearcut [email protected] –

+0

Der Puffer wächst eigentlich nie. Es ist von konstanter Größe. Es wird nur als Zwischenspeichern im Speicher verwendet, wenn aus einer Datei gelesen wird. Ich bin faul, mehr zu erklären, also sieh dir das an: https://stackoverflow.com/questions/648309/what-does-it-mean-by-buffer – gargii

Verwandte Themen