Was ist der Unterschied zwischen Reader und InputStream?

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?

sab
quelle
3
In Bezug auf "Ich denke, Objekte lesen?" Gibt es spezielle Eingabe- / Ausgabestreams zum Lesen / Schreiben von Java-Objekten. Sie sind ObjectInputStream bzw. ObjectOutputStream und Teil des größeren Serialisierungsframeworks. java.sun.com/developer/technicalArticles/Programming/… Aber das ist nur eine Verwendung von Eingabe- / Ausgabestreams, andere könnten Daten über einen Socket senden usw.
Mark Peters

Antworten:

135

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);
Berin Loritsch
quelle
makellose Antwort Berin! Vielen Dank!
Gaurav
17

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.

Vincent Ramdhanie
quelle
Wann 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.?
Asif Mushtaq
10

Ich denke, die Quelle der Verwirrung ist, dass InputStream.read()ein intund 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 InputStreamkö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, 161und 97wo a -> U+0061 -> 0x61 -> 97und ‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161.

Mit A Readerkönnen Sie den Inhalt zeichenweise lesen, sodass der Inhalt "a ‡ a" als 3 Zeichen gelesen 97wird 8225und 97wo a -> U+0061 -> 0x61 -> 97und ‡ -> U+2021 -> 0x2021 -> 8225.

RubenLaguna
quelle
1

Einer akzeptiert Bytes und der andere Zeichen.

Aaron McIver
quelle
1

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.

Atif
quelle
0

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.

LiLi
quelle