Quelle est la différence entre Reader et InputStream? Et quand utiliser quoi? Si je peux utiliser Reader pour lire des caractères, pourquoi utiliser le flux d'entrée, je suppose que pour lire des objets?
Un InputStream est la méthode brute pour obtenir des informations 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, c'est le flux à utiliser.
Un lecteur est conçu pour les flux de caractères. Si les informations que vous lisez sont entièrement en texte, alors le Reader se chargera du décodage des caractères pour vous et vous donnera des 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 Reader en utilisant la classe InputStreamReader.
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
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, d'autre part, sont des flux de caractères, ils sont donc mieux utilisés pour lire les données de caractères.
Je suppose que la source de confusion est que InputStream.read()
renvoie un int
et Reader.read()
renvoie également un int
.
La différence est que InputStream.read()
renvoie des valeurs d'octets comprises entre 0 et 255 correspondant au contenu brut du flux d'octets et Reader.read()
renvoie la valeur de caractère qui est comprise entre 0 et 65357 (car il y en a 65358 différents points de code unicode)
Un InputStream
vous permet de lire le contenu octet par octet, par exemple le contenu "a ‡ a" est lu comme un flux de 5 octets, à savoir, 97
, 226
, 128
, 161
Et 97
Où a -> U+0061 -> 0x61 -> 97
Et ‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161
.
Un Reader
vous permet de lire le contenu caractère par caractère afin que le contenu "a ‡ a" soit lu en 3 caractères 97
, 8225
Et 97
Où a -> U+0061 -> 0x61 -> 97
Et ‡ -> U+2021 -> 0x2021 -> 8225
.
L'un accepte les octets et l'autre accepte les caractères.