Was ist der Unterschied zwischen den Klassen BufferedReader und InputStreamReader von Java?

Lesezeit: 7 Minuten

Benutzeravatar von Ajay Yadav
Aja Yadav

Was ist der Unterschied zwischen Javas BufferedReader und InputStreamReader Klassen?

  • Sagen Sie auch Abt DataInputStream Class

    – Ajay Yadav

    11. September 2011 um 6:16 Uhr

  • @amod0017 Die Frage wird im Javadoc vollständig beantwortet. Das Stellen von Fragen in Foren, die in der Produktdokumentation gut spezifizierte Antworten enthalten, ist als sehr schlechte Angewohnheit abzuraten. Es verschwendet nur wertvolle Zeit. Die richtige Antwort befindet sich bereits im Javadoc, und jede Antwort hier wird sie entweder wörtlich zitieren, was das OP bereits gelesen haben könnte, oder sie paraphrasieren, was einen Verlust an Wert und Genauigkeit darstellt. Und in einem Forum eine Frage zu stellen, die man sich selbst beantworten könnte, und möglicherweise ewig auf eine möglicherweise falsche Antwort zu warten. ist keine rationale Lernstrategie.

    – Benutzer207421

    11. September 2011 um 6:57 Uhr

  • @EJB Ich stimme dir zu, aber ich denke, die Frage, die gestellt wird, wird falsch dargestellt … er hat einen bestimmten Input zu einer Webanwendung und möchte nur fragen, welche er bevorzugen sollte … da er verwirrt ist die beiden… ganz einfach.

    – mod

    11. September 2011 um 7:08 Uhr

  • Wenn ich die Frage umformulieren würde, würde ich fragen: “Unter welchen Bedingungen möchte ich einen Eingabestromleser NICHT puffern?” Es scheint, dass der Puffer fast überall standardmäßig verwendet wird.

    – Seltsames Glück

    7. Oktober 2014 um 12:49 Uhr

  • @AjayYadav Können Sie bitte die akzeptierte Antwort in die Antwort von Chaitanya Vaishampayan ändern. Das hängt ganz von Ihnen ab, aber vielleicht müssen Sie seine Antwort, die so detailliert erklärt wird, noch einmal durchgehen.

    – KnockingHeads

    24. Mai 2021 um 14:39 Uhr

BufferedReader ist ein Wrapper für „InputStreamReader/FileReader“, der die Informationen jedes Mal puffert, wenn eine native E/A aufgerufen wird.

Sie können sich den Effizienzunterschied zwischen dem Lesen eines Zeichens (oder Bytes) und dem Lesen eines großen Nein vorstellen. von Zeichen auf einmal (oder Bytes). Wenn Sie mit BufferedReader einzelne Zeichen lesen möchten, speichert es den Inhalt, um seinen Puffer zu füllen (wenn er leer ist), und für weitere Anforderungen werden Zeichen direkt aus dem Puffer gelesen, wodurch eine höhere Effizienz erreicht wird.

InputStreamReader konvertiert Byteströme in Zeichenströme. Es liest Bytes und dekodiert sie in Zeichen unter Verwendung eines angegebenen Zeichensatzes. Der verwendete Zeichensatz kann namentlich angegeben oder explizit angegeben werden, oder es kann der Standardzeichensatz der Plattform akzeptiert werden.

Ich hoffe es hilft.

  • amod Ich möchte diese Klassen verwenden, um den Inhalt einer Webseite zu speichern. Ich möchte wissen, ob ich BufferedReader oder InputStreamReader verwenden soll?

    – Ajay Yadav

    11. September 2011 um 6:40 Uhr

  • @ajay Ich bin mir da nicht sicher … aber ich habe irgendwo gelesen, dass BufferReader effizient ist.

    – mod

    11. September 2011 um 6:50 Uhr

  • sollte ich für wettbewerbsfähige Codierung BufferedReader oder InputReader verwenden

    – VR7

    3. Dezember 2020 um 7:59 Uhr

Benutzeravatar von James Lawson
James Lawson

Das Lesen aus dem Hauptspeicher ist schneller als das Lesen von Festplatte/STDIN.

BufferedReader verwendet eine Technik namens Pufferung Dadurch können wir reduzieren, wie oft wir von der Festplatte/STDIN lesen, indem wir Chunks in den Hauptspeicher kopieren.

In Betracht ziehen:

BufferedReader in = new InputStreamReader(System.in);
in.read(); // 
in.read(); //
// ...
in.read(); // could be hitting the disk/STDIN a lot (slow!)

gegen:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
in.read(); //
in.read(); //
// ...
in.read(); // hitting main memory a lot (fast!)

Von dem Dokumentation:

Ohne Pufferung, jede Beschwörung von read() könnte dazu führen, dass Bytes gelesen werden [disk/STDIN]in Zeichen umgewandelt und dann zurückgegeben, was sehr ineffizient sein kann.

Die beiden Klassen implementieren dieselbe Schnittstelle von Reader. So während Sie gerade verwenden könnten InputStreamReader ohne BufferedReaderkönnte dies zur Folge haben schwache Leistung. Wir verwenden nur die Dekorateur-Muster hier, so dass wir mit a enden InputStreamReader welcher hat jetzt eine Pufferfunktion.

Die InputStreamReader Klasse passt Typ an Eingabestrom (uninterpretierte Bytes) an die Leser Klasse (Bytes werden in einigen Zeichensätzen als Zeichen interpretiert), wendet jedoch keine zusätzliche Pufferung an. Die BufferedReader Klasse dauert ein Leser Klasse (vermutlich ungepuffert) und wendet Pufferung darauf an.

  • “puffern” was bedeutet das?

    – Quazi Irfan

    13. Februar 2015 um 2:19 Uhr

  • Pufferung bedeutet, dass Daten in einem als “Puffer” bezeichneten Array aggregiert werden. Die Verwendung eines Puffers macht Lesevorgänge effizienter, da Sie große Blöcke gleichzeitig aus dem Netzwerk in den Puffer kopieren, selbst wenn Sie jeweils nur eine kleine Menge aus dem Puffer lesen. Es ermöglicht auch das erneute Lesen von Inhalten, die bereits verbraucht wurden (indem man zu einer früheren Position im Puffer zurückkehrt, was “mark”/”reset” tut).

    – Michael Aaron Safyan

    16. Februar 2015 um 4:54 Uhr

  • Wann verwenden read() Byte für Byte und wann zu verwenden read(byte[]) Array von Bytes. Da ich denke, dass das Lesen von Arrays immer besser ist. Können Sie mir dann ein Beispiel geben, wo ich beide verwenden kann?

    – Asif Mushtaq

    1. April 2016 um 13:18 Uhr

BufferedReader liest ein paar Zeichen aus dem angegebenen Stream und speichert sie in einem Puffer. Das beschleunigt die Eingabe.

InputStreamReader liest nur ein Zeichen aus dem angegebenen Stream und verbleibende Zeichen bleiben im Stream.

Beispiel:

class NewClass{    
    public static void main(String args[]) throws IOException{

        BufferedReader isr = new BufferedReader(new InputStreamReader(System.in));

        Scanner sc = new Scanner(System.in);

        System.out.println("B.R. - "+(char)isr.read());
        System.out.println("Scanner - " + sc.nextLine());       
    }
}

Wenn die isr.read()-Anweisung ausgeführt wird, habe ich die Eingabe „hello“ eingegeben und das Zeichen „h“ von „hello“ wird auf dem Bildschirm gedruckt. Wenn dies InputStreamReader wäre, wären die restlichen Zeichen „ello“ im System.in-Stream geblieben und die sc.nextLine() hätte sie ausgegeben. Aber in diesem Fall passiert es nicht, weil der BufferedReader alle „Hallo“-Zeichen aus dem System.in-Stream liest und sie in seinem eigenen persönlichen Puffer speichert und somit der System.in-Stream leer bleibt, wenn sc.nextLine() ist hingerichtet.

Für den Code:

class NewClass{    

    public static void main(String args[]) throws IOException{

        InputStreamReader isr = new InputStreamReader(System.in);

        Scanner sc = new Scanner(System.in);

        System.out.println("I.S.R. - "+(char)isr.read());
        System.out.println("Scanner - " + sc.nextLine());

    }
}

In diesem Fall liest InputStreamReader nur ein Zeichen für die „Hallo“-Eingabe und das verbleibende „ello“ verbleibt weiterhin im System.in-Stream und diese Zeichen werden von sc.nextLine();

Fazit:

BufferedReader liest ein paar Zeichen (selbst wenn wir nur ein Zeichen wollen, liest es mehr als das) aus dem Eingabestrom und speichert sie in einem Puffer. Deshalb heißt es BufferedReader. Ich konnte nicht herausfinden, wie viele Zeichen es auf einmal gelesen hat. Es variierte von 3 bis 10, als ich es für diese Antwort testete.

InputStreamReader liest nur ein Zeichen aus dem Eingabestream und verbleibende Zeichen bleiben im Stream. In diesem Fall gibt es keinen Zwischenpuffer.

Wenn ein oder mehrere Threads oder Objekte Zeichen aus System.in lesen möchten, sollte in diesem Fall InputStreamReader verwendet werden, da es nur ein Zeichen liest und die restlichen von anderen Objekten oder Threads verwendet werden können.

BufferedReader ist schnell, weil es einen Puffer verwaltet und das Abrufen von Daten aus dem Puffer im Vergleich zum Abrufen von Daten von der Festplatte/stdin immer schnell ist.

BufferedReader liest ein paar Zeichen aus dem Eingabestrom und speichert sie in einem Puffer.

InputStreamReader liest nur ein Zeichen aus dem Eingabestream und die verbleibenden Zeichen verbleiben weiterhin in den Streams, daher gibt es in diesem Fall keinen Puffer.

Benutzeravatar von ChrisMM
ChrisMM

BufferedReader ist eine Klasse in Java, die Text aus einem Zeicheneingabestrom liest und Zeichen puffert, um ein effizientes Lesen von Zeichen, Zeilen und Arrays zu ermöglichen. Die Puffergröße kann angegeben werden. Falls nicht, kann die voreingestellte Standardgröße verwendet werden.

Im Allgemeinen bewirkt jede von einem Lesegerät gestellte Leseanforderung, dass eine entsprechende Leseanforderung des zugrunde liegenden Zeichen- oder Bytestroms gestellt wird. Es empfiehlt sich daher, einen BufferedReader um jeden Reader zu wickeln, dessen read()-Operationen kostspielig sein können, wie z. B. FileReaders und InputStreamReaders. Zum Beispiel,

FileReader reader = new FileReader(“MyFile.txt”);
BufferedReader bufferedReader = new BufferedReader(reader);

puffert die Eingabe aus 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.

Quelle: https://medium.com/@isaacjumba/why-use-bufferedreader-and-bufferedwriter-classses-in-java-39074ee1a966

Benutzeravatar von user8732605
Benutzer8732605

Soweit ich weiß, benötigt BufferedReader anstelle von InputStreamReader weniger Zeit, um die Daten von Bytes in Zeichen zu konvertieren. Daher bevorzugen wir BufferedReader für eine bessere Leistung

1441290cookie-checkWas ist der Unterschied zwischen den Klassen BufferedReader und InputStreamReader von Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy