Je fichier ouvert avec le bloc-notes, il écrire: « A » Enregistrer et fermer.
J'essaie de lire ce fichier de deux façons
Premier:
InputStream inputStream = Files.newInputStream(Paths.get("file.txt"));
int result = inputStream.read();
System.out.println(result);
System.out.println((char) result);
196 Ä
Seconde:
InputStream inputStream = Files.newInputStream(Paths.get("file.txt"));
Reader reader = new InputStreamReader(inputStream);
int result = reader.read();
System.out.println(result);
System.out.println((char) result);
261 ±
Questions: 1) En mode binaire, cette lettre est enregistrée comme 196? Pourquoi pas 261? 2) Cette lettre est enregistrée comme 196 dans lequel le codage?
J'essaie de comprendre pourquoi il y a des différences
UTF-8 encode les valeurs de la gamme U+0080
- U+07FF
que deux octets de forme 110xxxxx
10xxxxxx
(plus au wiki ). Donc , il n'y a que xxxxx xxxxxx
11 octets disponibles pour la valeur.
ą
est répertorié U + 0105 où 0105
est la valeur hexadécimale (en décimal il est 261
). Comme binaire , il peut être représenté comme
01 05 (hex)
00000001 00000101 (bin)
xxx xxxxxxxx <- values for U+0080 - U+07FF range encode only those bits
001 00000101 <- which means `x` will be replaced by only this part
Donc encodage UTF-8 va ajouter un 110xxxxx
10xxxxxx
masque qui signifie qu'il combinera
110xxxxx 10xxxxxx
00100 000101
en (deux octets):
11000100 10000101
Maintenant, InputStream
lit les données comme octets bruts . Donc , lorsque vous appelez la inputStream.read();
première fois que vous obtenez ce 11000100
qui est 196
en décimal. L' appel inputStream.read();
deuxième fois retournerait 10000101
qui est 133
en décimal.
Reader
s ware introduit en Java 1.1 afin que nous puissions éviter ce genre de désordre dans notre code. Au lieu de cela , nous pouvons spécifier quel encodage doit utiliser lecteur (ou le laisser utiliser une valeur par défaut) pour obtenir des valeurs correctement codées comme dans ce cas 00000001 00000101
(sans masque) qui est égale à 0105
sous forme hexadécimale et 261
sous forme décimale.
En bref
- utilisation
Reader
s (avec le codage correctement spécifié) si vous souhaitez lire les données sous forme de texte, - l' utilisation
Stream
est si vous voulez lire les données brutes sous forme d' octets.