Tut mir leid, wenn diese Frage ein Dulplikat ist, aber ich habe keine Antwort bekommen, nach der ich gesucht habe.
Java-Dokumente sagen das
%Vor%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
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.
Meine erste Frage ist Wenn bufferedReader Bytes lesen kann, dann können wir nicht mit bufferedreader in Bildern arbeiten, die in Bytes sind.
Meine zweite Frage ist Enthält Bufferedreader Zeichen in BUFFER und welche Bedeutung hat diese Zeile?
puffert die Eingabe von der angegebenen Datei.
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.
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.
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:
%Vor%private static int defaultCharBufferSize = 8192;
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:
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:
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.
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:
Tags und Links java file-handling