Was ist der Unterschied zwischen Reader und InputStream? Und wann was verwenden? Wenn ich Reader zum Lesen von Zeichen verwenden kann, warum verwende ich dann Inputstream, um Objekte zu lesen?
Was ist der Unterschied zwischen Reader und InputStream? Und wann was verwenden? Wenn ich Reader zum Lesen von Zeichen verwenden kann, warum verwende ich dann Inputstream, um Objekte zu lesen?
Antworten:
Ein InputStream ist die Rohmethode zum Abrufen von Informationen aus einer Ressource. Es erfasst die Daten Byte für Byte, ohne irgendeine Übersetzung durchzuführen. Wenn Sie Bilddaten oder eine Binärdatei lesen, ist dies der zu verwendende Stream.
Ein Reader ist für Zeichenströme ausgelegt. Wenn es sich bei den gelesenen Informationen ausschließlich um Text handelt, übernimmt der Reader die Zeichendecodierung für Sie und gibt Ihnen Unicode-Zeichen aus dem rohen Eingabestream. Wenn Sie irgendeine Art von Text lesen, ist dies der zu verwendende Stream.
Sie können einen InputStream mit der InputStreamReader-Klasse umbrechen und in einen Reader verwandeln.
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputStreams werden zum Lesen von Bytes aus einem Stream verwendet. Sie sind daher nützlich für Binärdaten wie Bilder, Videos und serialisierte Objekte.
Leser hingegen sind Zeichenströme, sodass sie am besten zum Lesen von Zeichendaten verwendet werden.
read()
Byte für Byte verwendet werden soll und wann ein read(byte[])
Array von Bytes verwendet werden soll. Da ich denke, Array zu lesen ist immer besser. Dann können Sie mir ein Beispiel geben, wo read()
Byte für Byte ODER read(byte[])
Array von Byte verwendet werden soll. ODER BufferedInputStream
.?
Ich denke, die Quelle der Verwirrung ist, dass InputStream.read()
ein int
und Reader.read()
auch ein zurückgegeben wird int
.
Der Unterschied besteht darin, dass InputStream.read()
Bytewerte zwischen 0 und 255 zurückgegeben werden, die dem Reader.read()
Rohinhalt des Bytestroms entsprechen, und dass der Zeichenwert zwischen 0 und 65357 zurückgegeben wird (da 65358 verschiedene Unicode-Codepunkte vorhanden sind).
Ein InputStream
können Sie den Inhalt Byte für Byte, zum Beispiel lesen die Inhalte „a ‡ a“ als ein Strom von 5 Bytes gelesen, nämlich 97
, 226
, 128
, 161
und 97
wo a -> U+0061 -> 0x61 -> 97
und ‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161
.
Mit A Reader
können Sie den Inhalt zeichenweise lesen, sodass der Inhalt "a ‡ a" als 3 Zeichen gelesen 97
wird 8225
und 97
wo a -> U+0061 -> 0x61 -> 97
und ‡ -> U+2021 -> 0x2021 -> 8225
.
Einer akzeptiert Bytes und der andere Zeichen.
Hintergrund von InputStream & Reader:
In den frühen Tagen von Java bestand die einzige Möglichkeit zur Konsoleneingabe darin, einen Byte-Stream (InputStream und OutputStream) zu verwenden.
Anwendungsfälle:
Heutzutage ist es auch akzeptabel, einen Byte-Stream zum Lesen des Konsolen-Streams zu verwenden. Für kommerzielle Anwendungen ist die bevorzugte Methode zum Lesen von Konsoleneingaben jedoch die Verwendung eines zeichenorientierten Streams (Reader). Mit Reader können Sie leichter internationalisieren und warten.
Hinweis: Dies ist nur eine zusätzliche Information zum Erkunden von Java-E / A-Codes. Das Entwurfsmuster der Java-E / A-Implementierung folgt dem Entwurfsmuster des Dekorators. Wenn Sie mit dem Dekorationsmuster vertraut sind, können Sie die Implementierung leicht nachholen.
InputStream-Akzeptanzbyte , Reader akzeptiert Zeichen. In Java ist ein Zeichen = zwei Bytes, und Reader verwendet Puffer, InputStream nicht. Alle Dateispeicher auf der Festplatte oder die Übertragung basierend auf Byte enthalten Bild und Video, aber das Zeichen befindet sich im Speicher, sodass InputStream häufig verwendet wird.