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?
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?
Réponses:
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);
la source
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.
la source
read()
octet par octet et quand utiliserread(byte[])
tableau d'octet. Comme je pense que la lecture du tableau est toujours meilleure. alors pouvez-vous me donner un exemple où utiliserread()
octet par octet OUread(byte[])
tableau d'octet. OUBufferedInputStream
.?Je suppose que la source de confusion est que
InputStream.read()
renvoie unint
etReader.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 etReader.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
InputStream
vous 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înant97
,226
,128
,161
et97
où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
Reader
vous permet de lire le contenu caractère par caractère afin que le contenu «a ‡ a» soit lu comme 3 caractères97
,8225
et97
où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
la source
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.
la source
L'un accepte les octets et l'autre les caractères.
la source
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é.
la source