¿Cuál es la diferencia entre Reader y InputStream?


¿Cuál es la diferencia entre Reader y InputStream? ¿Y cuándo usar qué? Si puedo usar Reader para leer caracteres ¿por qué usaré inputstream, supongo que para leer objetos?

Author: Mona Jalal, 2010-12-06

4 answers

Un InputStream es el método sin procesar para obtener información de un recurso. Agarra los datos byte por byte sin realizar ningún tipo de traducción. Si está leyendo datos de imagen, o cualquier archivo binario, este es el flujo a utilizar.

Un lector está diseñado para flujos de caracteres. Si la información que está leyendo es todo texto, entonces el Lector se encargará de la decodificación de caracteres por usted y le dará caracteres unicode del flujo de entrada sin procesar. Si usted está leyendo cualquier tipo de texto, este es el flujo a utilizar.

Puede envolver un InputStream y convertirlo en un Lector utilizando la clase InputStreamReader.

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
 103
Author: Berin Loritsch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-02 05:17:10

InputStreams se utilizan para leer bytes de una secuencia. Por lo tanto, son útiles para datos binarios como imágenes, videos y objetos serializados.

Los lectores, por otro lado, son flujos de caracteres, por lo que se utilizan mejor para leer datos de caracteres.

 14
Author: Vincent Ramdhanie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-06 14:51:34

Creo que la fuente de confusión es que InputStream.read() devuelve un int y Reader.read() también devuelve un int.

La diferencia es que InputStream.read() devuelve valores de bytes entre 0 y 255 correspondientes al contenido bruto del flujo de bytes y Reader.read() devuelve el valor de carácter que está entre 0 y 65357

An InputStream le permite leer el contenido byte por byte, por ejemplo, el contenido "a‡a" se lee como un flujo de 5 bytes, a saber, 97, 226, 128, 161 y 97 donde a -> U+0061 -> 0x61 -> 97 y ‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161.

A Reader le permite leer el contenido carácter por carácter para que el contenido "a‡a" se lea como 3 caracteres 97, 8225 y 97 donde a -> U+0061 -> 0x61 -> 97 y ‡ -> U+2021 -> 0x2021 -> 8225.

 5
Author: ecerulm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-12 19:38:22

Uno acepta bytes y el otro acepta caracteres.

 1
Author: Aaron McIver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-06 14:49:17