java - que - La diferencia entre InputStream y InputStreamReader al leer caracteres de varios bytes
inputstreamreader y bufferedreader en java (2)
Debe darle una pista al lector, proporcionando un conjunto de caracteres en el que está escrito su archivo binario. Por ejemplo,
Reader reader =
new InputStreamReader(
new FileInputStream( "/path/to/file" ),
"UTF-8" // most likely that the encoding of the file
)
Sin una pista, utilizará la codificación predeterminada de su plataforma, que en muchos casos no es lo que quiere.
Este enlace tiene una buena explicación de las codificaciones: http://www.joelonsoftware.com/articles/Unicode.html
La diferencia entre InputStream
y InputStreamReader
es que InputStream
lee como byte
, mientras que InputStreamReader
lee como char
. Por ejemplo, si el texto en un archivo es abc
, ambos funcionan bien. Pero si el texto es a你们
, que está compuesto por un a
y dos caracteres chinos, entonces InputStream
no funciona.
Entonces deberíamos usar InputStreamReader
, pero mi pregunta es:
¿Cómo reconoce InputStreamReader
caracteres?
a
es un byte, pero un carácter chino es dos bytes. ¿Lee a
como un byte y reconoce el otro de caracteres como dos bytes, o para cada carácter en este texto, el InputStreamReader
lee como dos bytes?
Un InputStream
lee datos de octetos brutos (8 bits). En Java, el tipo de byte
es equivalente al tipo de caracteres en C. En C, este tipo se puede usar para representar datos de caracteres o datos binarios. En Java, el tipo de char
comparte mayores similitudes con el tipo C wchar_t
.
Un InputStreamReader
transformará los datos de algunas codificaciones en UTF-16. Si "a 你们" está codificado como UTF-8 en el disco, será la secuencia de bytes 61 E4 BD A0 E4 BB AC
. Cuando pase el InputStream
a InputStreamReader
con la codificación UTF-8, se leerá como la secuencia de caracteres 0061 4F60 4EEC
.
La API de codificación de caracteres en Java contiene los algoritmos para realizar esta transformación. Aquí puede encontrar una lista de codificaciones compatibles con Oracle JRE. El proyecto de la UCI es un buen lugar para comenzar si quieres entender el funcionamiento interno de cómo funciona esto.
Como señala Alexander Pogrebnyak, casi siempre debes proporcionar la codificación explícitamente. byte
métodos byte
to- char
que no especifican una codificación se basan en el valor predeterminado de JRE , que depende de los sistemas operativos y la configuración del usuario.