2009-06-02 12 views
5

Was ist der Unterschied zwischen der Verwendung eines BufferedReaders um den StringReader im folgenden Code oder der Verwendung des StringReaders? Durch das Laden des DOM in Zeile 2 beider Beispiele, scheint es, dass der BufferedReader nicht notwendig ist?Warum BufferedReader in diesem Fall verwenden?

InputSource is = new InputSource(new StringReader(html)); 
    Document dom = XMLResource.load(is).getDocument(); 

VS

InputSource is = new InputSource(new BufferedReader(new StringReader(html))); 
    Document dom = XMLResource.load(is).getDocument(); 
+0

Die Verwendung des BufferedReader wird tatsächlich marginal langsamer sein (und den Code komplizierter machen) –

Antwort

18

In diesem speziellen Fall können teuer zu wickeln, ich sehe keinen Nutzen. Im Allgemeinen gibt es zwei Vorteile:

  • Die ach so handlich readLine() Methode nur in BufferedReader statt Reader (hier ohne Bedeutung)
  • BufferedReader reduziert IO wo einzelne Anrufe auf die zugrunde liegenden Leser sind möglicherweise teuer definiert (dh weniger klobige Anrufe sind schneller als viele kleine) - wieder irrelevant für StringReader

Ausschneiden und Einfügen fehlgeschlagen?

1

Die BufferedReader Version von einigem Code kopiert wurde, die von einem Filereader lesen verwendet?

4

EDIT: Meine ursprüngliche Antwort unten. Die folgende ist in diesem Fall nicht relevant, da der gepufferte Leser einen StringReader einpackt, der eine Zeichenfolge umschließt. Es gibt also keine Pufferung, und der BufferedReader scheint redundant zu sein. Sie könnte ein Argument für die Verwendung der besten/konsistenten Praktiken, aber es wäre ziemlich dürftig.

Möglicherweise das Ergebnis einer Kopie/einfügen, oder vielleicht ein IDE-getriebener Refactor zu weit!

BufferedReader wird versuchen, auf eine optimale Weise zu lesen.

Das heißt, es wird größere Teile der Daten in einem Schritt (in einer konfigurierbaren Menge) lesen, und dann zur Verfügung stellen, wie erforderlich. Dies verringert die Anzahl der Lesevorgänge von der Festplatte (usw.) auf Kosten einer gewissen Speicherauslastung.

aus der Javadoc zu zitieren:

Im Allgemeinen jeweils gemacht Leseanforderung ein Reader bewirkt eine entsprechende Lese Antrag des zugrunde liegenden Zeichen oder Byte-Strom gemacht werden. Es ist daher ratsam, ein BufferedReader um jeden Leser, deren read() Operationen, wie wie FileReaders und InputStreamReaders

+0

Und das ist relevant für einen StringReader wie genau? ;) –

+0

Ja. Ich nehme deinen Punkt. Ich habe das eher zu schnell beantwortet :-) –

Verwandte Themen