Me archivo abierto con el bloc de notas, escribir allí: "A" Guardar y cerrar.
Trato de leer este archivo de dos maneras
Primero:
InputStream inputStream = Files.newInputStream(Paths.get("file.txt"));
int result = inputStream.read();
System.out.println(result);
System.out.println((char) result);
196 Ä
Segundo:
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 ±
Preguntas: 1) En el modo binario, esta carta se guarda como 196? ¿Por qué no como 261? 2) Esta carta se guarda como 196 en el que la codificación?
Trato de entender por qué hay diferencias
UTF-8 valores Codifica de gama U+0080
- U+07FF
como dos bytes en forma 110xxxxx
10xxxxxx
(más en wiki ). Así que sólo hay xxxxx xxxxxx
11 bytes disponibles para el valor.
ą
está indexado como U + 0105 donde 0105
es el valor hexadecimal (como decimal es 261
). Como binaria que se puede representar como
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
Así codificación UTF-8 añadirá 110xxxxx
10xxxxxx
máscara que significa que combinará
110xxxxx 10xxxxxx
00100 000101
en (dos bytes):
11000100 10000101
Ahora, InputStream
lee los datos como bytes sin formato . Así que cuando se llama inputStream.read();
primera vez que está recibiendo 11000100
lo que es 196
en decimal. Llamar inputStream.read();
por segunda vez volvería 10000101
, que es 133
en decimal.
Reader
s ware introdujo en Java 1.1 para que pudiéramos evitar este tipo de desorden en nuestro código. En su lugar podemos especificar qué codificación lector debe usar (o dejar que se utilice uno por defecto) para obtener valores debidamente codificados, como en este caso 00000001 00000101
(sin máscara) que es igual a 0105
en forma hexadecimal y 261
en forma decimal.
En breve
- uso
Reader
s (con la codificación adecuada especificada) si desea leer datos como texto, - su uso
Stream
es que si quieres leer datos como bytes sin formato.