sirve que para example java character-encoding io

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.