Kann BufferedReader Bytes lesen?

8

Tut mir leid, wenn diese Frage ein Dulplikat ist, aber ich habe keine Antwort bekommen, nach der ich gesucht habe.

Java-Dokumente sagen das

  

Im Allgemeinen führt jede Leseanforderung, die von einem Leser durchgeführt wird, dazu, dass eine entsprechende Leseanforderung von dem zugrunde liegenden Zeichen oder Bytestrom gemacht wird. Es empfiehlt sich daher, einen BufferedReader um jeden Reader zu wickeln, dessen read () - Operationen kostspielig sein können, z. B. FileReaders & gt; und InputStreamReaders. Zum Beispiel

%Vor%
  

puffert die Eingabe von der angegebenen Datei. Ohne Pufferung kann 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.

  1. Meine erste Frage ist Wenn bufferedReader Bytes lesen kann, dann können wir nicht mit bufferedreader in Bildern arbeiten, die in Bytes sind.

  2. Meine zweite Frage ist Enthält Bufferedreader Zeichen in BUFFER und welche Bedeutung hat diese Zeile?

  

puffert die Eingabe von der angegebenen Datei.

  1. Meine dritte Frage ist was bedeutet diese Zeile
  

Im Allgemeinen führt jede Leseanforderung, die von einem Leser durchgeführt wird, dazu, dass eine entsprechende Leseanforderung vom zugrundeliegenden Zeichen oder Bytestrom gemacht wird.

    
TruePS 06.03.2014, 06:07
quelle

3 Antworten

2
  1. Standardverhalten ist, dass es in ein Zeichen umgewandelt wird, aber wenn Sie ein Bild haben, können Sie keine Zeichendaten haben, stattdessen benötigen Sie Pixel von Bytes Daten. Sie können es also nicht benutzen.

  2. Es puffert, bedeutet, es liest einen bestimmten Datenblock in einem char-Array. Sie können dieses Verhalten im Code sehen:

%Vor%

und die defaultCharBufferSize ist wie folgt:

  

private static int defaultCharBufferSize = 8192;

%Vor%

Kurz gesagt bedeutet buffered, dass es zuerst ein paar Charakters von Character-Daten liest, die in einem Char-Array bleiben und das verarbeitet wird und wieder dasselbe Datenstück liest, bis es das Ende des Streams erreicht.

Sie können auf Folgendes verweisen, um mehr zu erfahren:

BufferedReader

    
UVM 06.03.2014, 06:26
quelle
5

Hier sind zwei Fragen.

1. Pufferung

Stellen Sie sich vor, Sie lebten eine Meile von Ihrer nächsten Wasserquelle entfernt, und Sie trinken jede Stunde eine Tasse Wasser. Nun, du würdest nicht für jede Tasse den ganzen Weg zum Wasser gehen. Geh einmal am Tag und komm mit einem Eimer voll Wasser nach Hause, um den Becher 24 mal zu füllen.

Der Bucket ist ein Puffer .

Stellen Sie sich vor, Ihr Dorf wird von einem Fluss mit Wasser versorgt. Aber manchmal läuft der Fluss für einen Monat trocken; Zu anderen Zeiten bringt der Fluss so viel Wasser, dass das Dorf überschwemmt wird. Also baut man einen Damm und hinter dem Damm befindet sich ein Stausee. Das Reservoir füllt sich in der Regenzeit und entleert sich allmählich in der Trockenzeit. Das Dorf bekommt das ganze Jahr über einen stetigen Wasserfluss.

Der Speicher ist ein Puffer .

Datenströme beim Computing sind beiden Szenarien ähnlich. Zum Beispiel können Sie mehrere Kilobyte Daten von einem Dateisystem in einem einzigen Betriebssystem-Systemaufruf erhalten, aber wenn Sie ein Zeichen auf einmal verarbeiten möchten, benötigen Sie etwas Ähnliches wie ein Reservoir.

Ein BufferedReader enthält darin einen anderen Reader (zum Beispiel einen FileReader), der der Fluss ist - und ein Array von Bytes, welches das Reservoir ist. Jedes Mal, wenn du davon liest, macht es so etwas wie:

%Vor%

Allerdings wenn Sie einen BufferedReader verwenden, müssen Sie nicht wissen, wie es funktioniert, nur dass es funktioniert.

>

2. Eignung für Bilder

Es ist wichtig zu verstehen, dass BufferedReader und FileReader Beispiele für Reader sind. Vielleicht haben Sie Polymorphismus in Ihrer Programmierausbildung noch nicht behandelt, also denken Sie daran, wenn Sie es tun. Das heißt, wenn Sie Code haben, der FileReader verwendet - aber nur die Aspekte, die mit Reader übereinstimmen - dann können Sie ein BufferedReader ersetzen und es wird genauso funktionieren.

Es ist eine gute Angewohnheit, Variablen als die allgemeinste Klasse zu deklarieren, die funktioniert:

%Vor%

... weil das die einzige Änderung wäre, die Sie Puffer hinzufügen müssen:

%Vor%

Ich habe diesen Umweg genommen, weil alle Reader s weniger für Bilder geeignet sind.

Reader hat zwei read Methoden:

%Vor%

Die zweite Form ist für Bilder ungeeignet, weil sie definitiv Buchstaben, nicht Buchstaben liest.

Das erste Formular sieht aus, als ob es in Ordnung sein könnte - immerhin liest es Ints. Und in der Tat, wenn Sie nur einen FileReader verwenden, könnte es gut funktionieren.

Denken Sie jedoch darüber nach, wie ein BufferedReader um einen FileReader funktioniert. Wenn Sie BufferedReader.read () das erste Mal aufrufen, wird FileReader.read (buffer) aufgerufen, um den Puffer zu füllen. Dann wird das erste char des Puffers wieder auf einen int-Wert gesetzt und das zurückgegeben.

Besonders wenn Sie Multi-Byte-Zeichensätze in das Bild bringen, kann das zu Problemen führen.

Wenn Sie ganze Zahlen lesen möchten, verwenden Sie InputStream nicht Reader . InputStream hat int read(byte[] buf, int offset, int length) - Bytes werden viel zuverlässiger von int als chars zurück geworfen.

    
slim 06.03.2014 11:39
quelle
4

Leser (und Writer) in Java sind spezialisierte Klassen für den Umgang mit Text (Character) Streams - das Konzept einer Zeile ist in jeder anderen Art von Stream bedeutungslos.

für das allgemeine EA-Äquivalent, schauen Sie sich BufferedInputStream an

Also, um Ihre Fragen zu beantworten:

  1. Während der Leser schließlich Bytes liest, wandelt er sie in Zeichen um. es ist nicht beabsichtigt, etwas anderes zu lesen (wie Bilder) - verwenden Sie die InputStream-Familie von Klassen für das
  2. ein gepuffertes Lesegerät liest große Datenblöcke aus dem zugrunde liegenden Datenstrom (der eine Datei, ein Socket oder irgendetwas anderes sein kann) in einen Puffer im Speicher und bedient dann Leseanforderungen aus diesem Puffer, bis der Puffer geleert ist. dieses Verhalten des Lesens von großen Brocken anstelle von kleineren Chucks jedes Mal verbessert die Leistung.
  3. bedeutet, dass wenn Sie dont ein Lesegerät in einem gepufferten Lesegerät einschließen, jedes Mal, wenn Sie ein einzelnes Zeichen lesen möchten, auf das disk.network zugreifen, um nur das gewünschte einzelne Zeichen zu erhalten. I / O in so kleinen Brocken zu machen ist normalerweise für die Leistung schrecklich.
radai 06.03.2014 06:11
quelle

Tags und Links