Quelle est la différence entre Reader et InputStream?

87

Quelle est la différence entre Reader et InputStream? Et quand utiliser quoi? Si je peux utiliser Reader pour lire des caractères pourquoi j'utiliserai inputstream, je suppose que pour lire des objets?

sab
la source
3
En ce qui concerne "Je suppose lire des objets?", Il existe des flux d'entrée / sortie spéciaux pour lire / écrire des objets Java. Ils sont respectivement ObjectInputStream et ObjectOutputStream, et font partie du cadre de sérialisation plus large. java.sun.com/developer/technicalArticles/Programming/ ... Mais ce n'est qu'une utilisation des flux d'entrée / sortie, d'autres pourraient envoyer des données sur une socket, etc.
Mark Peters

Réponses:

138

Un InputStream est la méthode brute pour obtenir des informations à partir d'une ressource. Il saisit les données octet par octet sans effectuer aucun type de traduction. Si vous lisez des données d'image ou tout autre fichier binaire, il s'agit du flux à utiliser.

Un lecteur est conçu pour les flux de caractères. Si les informations que vous lisez sont uniquement du texte, alors le Reader se chargera du décodage des caractères pour vous et vous donnera les caractères Unicode du flux d'entrée brut. Si vous lisez n'importe quel type de texte, c'est le flux à utiliser.

Vous pouvez encapsuler un InputStream et le transformer en lecteur à l'aide de la classe InputStreamReader.

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
Berin Loritsch
la source
réponse impeccable Berin! Merci!
Gaurav
18

Les InputStreams sont utilisés pour lire les octets d'un flux. Ils sont donc utiles pour les données binaires telles que les images, la vidéo et les objets sérialisés.

Les lecteurs, en revanche, sont des flux de caractères, ils sont donc mieux utilisés pour lire les données de caractères.

Vincent Ramdhanie
la source
Quand utiliser read()octet par octet et quand utiliser read(byte[])tableau d'octet. Comme je pense que la lecture du tableau est toujours meilleure. alors pouvez-vous me donner un exemple où utiliser read()octet par octet OU read(byte[])tableau d'octet. OU BufferedInputStream.?
Asif Mushtaq
11

Je suppose que la source de confusion est que InputStream.read()renvoie un intet Reader.read()renvoie également unint .

La différence est que InputStream.read()renvoyer des valeurs d'octet entre 0 et 255 correspondant au contenu brut du flux d'octets et Reader.read()renvoyer la valeur de caractère qui est comprise entre 0 et 65357 (car il y a 65358 points de code unicode différents)

An InputStreamvous permet de lire le contenu octet par octet, par exemple le contenu "a ‡ a" est lu comme un flux de 5 octets (chacun représenté par unint entre 0 et 255) entraînant 97, 226, 128, 161et 97

a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)

A Readervous permet de lire le contenu caractère par caractère afin que le contenu «a ‡ a» soit lu comme 3 caractères 97, 8225et 97

a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97

Le caractère ‡ est appelé U + 2021 en Unicode

RubenLaguna
la source
Cela devrait être la réponse acceptée. Merci pour l'exemple
tableau de bord
2

Contexte d'InputStream & Reader:

Dans les premiers jours de Java, la seule façon d'effectuer une entrée de console était d'utiliser un flux d'octets (InputStream et OutputStream).

Cas d'utilisation:

Aujourd'hui, l'utilisation d'un flux d'octets pour lire le flux de la console est également acceptable. Cependant, pour les applications commerciales, la méthode préférée pour lire les entrées de la console est d'utiliser un flux orienté caractères (Reader). Reader facilite votre internationalisation et votre maintenance.

Remarque: Ceci est juste une information supplémentaire pour explorer les codes d'E / S Java, c'est que le modèle de conception de l'implémentation d'E / S Java suit le modèle de conception du décorateur. Si vous connaissez le modèle de conception de décorateur, vous pouvez facilement rattraper l'implémentation.

Atif
la source
1

L'un accepte les octets et l'autre les caractères.

Aaron McIver
la source
0

Octet d'acceptation InputStream , Caractère d'acceptation du lecteur, en Java, un caractère = deux octets, et tampon d'utilisation du lecteur, InputStream non utilisé. Tous les fichiers sont stockés sur le disque ou transférés en fonction de l'octet, incluent l'image et la vidéo, mais le caractère est en mémoire, donc InputStream est fréquemment utilisé.

LiLi
la source