2010-12-06 8 views
63

¿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?¿Cuál es la diferencia entre Reader y InputStream?

+1

En cuanto a "Supongo que para leer objetos?", Hay flujos de entrada/salida especiales para leer/escribir objetos Java. Son ObjectInputStream y ObjectOutputStream respectivamente, y son parte del marco de serialización más grande. http://java.sun.com/developer/technicalArticles/Programming/serialization/ Pero ese es solo un uso de las transmisiones de entrada/salida, otras podrían estar enviando datos a través de un socket, etc. –

Respuesta

93

Un InputStream es el método original para obtener información de un recurso. Captura el byte de datos por byte sin realizar ningún tipo de traducción. Si está leyendo datos de imágenes, o cualquier archivo binario, esta es la secuencia que debe usar.

Un lector está diseñado para secuencias de caracteres. Si la información que está leyendo es todo texto, entonces el Reader se encargará de la decodificación del personaje y le dará caracteres Unicode del flujo de entrada sin formato. Si está leyendo cualquier tipo de texto, esta es la secuencia que debe usar.

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

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); 
1

Uno acepta bytes y el otro acepta caracteres.

12

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

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

+0

Cuándo usar 'read()' byte por byte y cuándo usar 'read (byte [])' array of byte. Como creo que leer array es siempre mejor. entonces puedes darme un ejemplo en donde usar 'read()' byte OR 'read (byte [])' array of byte. O 'BufferedInputStream'.? – UnKnown

0

supongo 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() valores de byte de retorno entre 0 y 255 correspondiente a los contenidos primas del flujo de bytes y Reader.read() devolver el valor de carácter, que es entre 0 y 65.357

Un InputStream le permite leer el contenido byte byte, por ejemplo, los contenidos "a ‡ a" se leen como 97, 226, 128, 161, 97 donde a -> U+0061 -> 0x61 -> 97 y ‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161.

Un Reader le permite leer el contenido del carácter por carácter por lo que los contenidos "un ‡ a" se leen como 97, 8225, 97, donde a -> U+0061 -> 0x61 -> 97 y ‡ -> U+2021 -> 0x2021 -> 8225.

Cuestiones relacionadas