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?
85
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.
quelle
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.
quelle
read()
Byte für Byte verwendet werden soll und wann einread(byte[])
Array von Bytes verwendet werden soll. Da ich denke, Array zu lesen ist immer besser. Dann können Sie mir ein Beispiel geben, woread()
Byte für Byte ODERread(byte[])
Array von Byte verwendet werden soll. ODERBufferedInputStream
.?Ich denke, die Quelle der Verwirrung ist, dass
InputStream.read()
einint
undReader.read()
auch ein zurückgegeben wirdint
.Der Unterschied besteht darin, dass
InputStream.read()
Bytewerte zwischen 0 und 255 zurückgegeben werden, die demReader.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ämlich97
,226
,128
,161
und97
woa -> 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 gelesen97
wird8225
und97
woa -> U+0061 -> 0x61 -> 97
und‡ -> U+2021 -> 0x2021 -> 8225
.quelle
Einer akzeptiert Bytes und der andere Zeichen.
quelle
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.
quelle
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.
quelle