2010-07-07 7 views
45

¿Cuál es la ventaja de usar InputStream sobre InputStreamReader, o viceversa?InputStream vs InputStreamReader

Aquí es un ejemplo de InputStream en acción:

InputStream input = new FileInputStream("c:\\data\\input-text.txt"); 

int data = input.read(); 
while(data != -1) { 
    //do something with data... 
    doSomethingWithData(data); 

    data = input.read(); 
} 
input.close(); 

Y aquí es un ejemplo del uso InputStreamReader (obviamente con la ayuda de InputStream):

InputStream inputStream = new FileInputStream("c:\\data\\input.txt"); 
Reader  reader  = new InputStreamReader(inputStream); 

int data = reader.read(); 
while(data != -1){ 
    char theChar = (char) data; 
    data = reader.read(); 
} 

reader.close(); 

¿El proceso lector de los datos de una manera especial?

Solo estoy tratando de entender todo el aspecto de la transmisión de datos i/o en Java.

+2

Nota por lo general es una buena idea para especificar un juego de caracteres que en la construcción de una 'InputStreamReader'. Si lo deja afuera, elegirá la codificación que se configure de la manera correcta (si eso es lo que quiere, y luego la escribirá explícitamente). –

Respuesta

73

Ellos representan cosas algo diferentes.

El InputStream es la clase ancestro de todos los posibles flujos de de bytes, no es útil por sí mismo, sino todas las subclases (como el FileInputStream que está utilizando) son grandes para hacer frente a los datos binarios.

En la contraparte del InputStreamReader (y su padre Reader) se utilizan específicamente para tratar de caracteres (strings) por lo que para que manejan codificaciones charset (UTF-8, ISO-8859-1, y así sucesivamente) con gracia.

La respuesta es simple: si necesita datos binarios puede utilizar un InputStream (también preciso, como un DataInputStream), si es necesario trabajar con el texto usar un InputStreamReader ..

5

Si desea leer datos binarios, utilice InputStream.

Si desea leer cadenas de una secuencia binaria, use InputStreamReader. Uno de sus constructores le permite especificar un juego de caracteres.

Por esta razón, no use FileReader, ya que utiliza una plataforma predeterminada para un conjunto de caracteres, que en muchos casos no es práctico.

26

Bueno InputStreamReader se usa para leer caracteres directamente.

Así que leerlos como int y luego convertir a char no es realmente óptimo.

Esa es la principal diferencia, creo.

InputStream le da la bytes, y el InputStreamReader le da ya char de lo que lee los InputStream 8 bits a la vez.

Además, si estás leyendo grandes trozos de texto, incluso se puede envolver el InputStreamReader en un BufferedReader que le proporciona algunos métodos agradables para digamos líneas enteras leer a la vez.

¿Esto te está ayudando?

También puede leer este artículo: https://docs.oracle.com/javase/tutorial/essential/io/charstreams.html

Cheers,

+0

Sí, tiene sentido. ¿Hay alguna manera de especificar un búfer, para que lea más de 1 byte a la vez? Digamos, por ejemplo, que quería leer 1024 bytes a la vez. – xil3

+0

Hola, Bueno, si usas BufferedReader puedes definir el tamaño del Buffer según el Javadoc "BufferedReader (Reader in, int sz)". Sin embargo, para un InputStreamReader, creo que esto solo está listo de 1 byte a la vez. No puedes cambiar eso. – Trefex

+0

Muy bien, gracias :) – xil3

9

De InputStreamReader javadoc:

Una clase para convertir un flujo de bytes en un flujo de caracteres. Los datos leídos de la corriente de entrada de fuente se convierten en caracteres mediante un convertidor de caracteres predeterminado proporcionado. La codificación predeterminada se toma de la propiedad del sistema "file.encoding". {@code InputStreamReader} contiene un búfer de bytes leídos desde la fuente y los convierte en caracteres según sea necesario.

Para InputStreams, que en realidad contienen caracteres en una codificación conocida, utilice el lector. De lo contrario, obtienes los bytes y tendrás que hacer la conversión a char 'a mano'.

La diferencia entre los dos read métodos:

InputStream::read lee un solo byte y lo devuelve como un int mientras InputStreamReader::read lee un solo char (respetando la codificación) y devuelve esto como una int.

1

InputstreamReader se utiliza para leer los datos de Unicode que no se pueden leer en inputstream.

1

InputStream ayuda a leer el byte arroyos
mientras queInputStreamReader ayuda a decodificar los flujos de bytes en corrientes de carbonilla utilizando algunos juegos de caracteres como UTF-8 u otros.
Pero para una mayor eficiencia API de Java recomienda utilizar BufferedReader también junto con InputStream y InputStreamReader

Cuestiones relacionadas