2011-09-11 18 views
29

¿Cuál es la diferencia entre las clases de Java BufferedReader y InputStreamReader?¿Cuál es la diferencia entre las clases BufferedReader de Java y InputStreamReader?

+0

También Tell Abt DataInputStream Class –

+2

@ amod0017 la pregunta está totalmente respondida en el Javadoc. Hacer preguntas en foros que tienen respuestas bien especificadas en la documentación del producto es desalentarse como un hábito muy malo. Solo desperdicia un tiempo valioso. La respuesta correcta ya está en el Javadoc y cualquier respuesta aquí citará textualmente, que el OP ya podría haber leído, o parafrasearlo, lo que es una pérdida de valor y precisión. Y hacer una pregunta que podría responderse a sí mismo en un foro, y esperar posiblemente para siempre, para una respuesta posiblemente incorrecta. no es una estrategia de aprendizaje racional. – EJP

+2

@EJB, estoy de acuerdo, pero supongo que la pregunta que se hace se presenta de forma incorrecta ... tiene alguna entrada particular en alguna aplicación web y solo quiere preguntar cuál debería preferir ... ya que está confundido entre los dos ... tan simple como eso. – amod

Respuesta

32

BufferedReader es un contenedor para "InputStreamReader/FileReader", que almacena la información cada vez que se llama a una E/S nativa.

Puede imaginarse la diferencia de eficiencia con la lectura de un carácter (o bytes) en comparación con la lectura de un número grande. de caracteres de una vez (o bytes). Con BufferedReader, si desea leer un solo carácter, almacenará los contenidos para llenar su búfer (si está vacío) y para solicitudes adicionales, los caracteres se leerán directamente del búfer y, por lo tanto, logrará una mayor eficacia.

InputStreamReader convierte las secuencias de bytes en secuencias de caracteres. Lee bytes y los decodifica en caracteres usando un juego de caracteres específico. El conjunto de caracteres que utiliza se puede especificar por nombre o se puede dar explícitamente, o se puede aceptar el juego de caracteres predeterminado de la plataforma.

Espero que ayude.

+0

@ajay ... dime si se requieren más detalles ... pero se específico a la duda por favor. – amod

+1

amod Quiero usar estas clases para almacenar el contenido de una página web. ¿Quiero saber si debo usar BufferedReader o InputStreamReader? –

+0

@ajay No estoy muy seguro de esto ... pero leí en alguna parte que BufferReader es eficiente. – amod

16

La clase InputStreamReader adapta tipo InputStream (bytes no) a la clase Reader (bytes interpretados como personajes en algún juego de caracteres), pero no se aplica ninguna de amortiguación adicional. La clase BufferedReader toma una clase Reader (presumiblemente sin búfer) y aplica almacenamiento en búfer en ella.

+2

"buffering" ¿qué significa? –

+6

El almacenamiento en búfer significa que los datos se agregan en una matriz denominada "búfer".El uso de un búfer hace que las lecturas sean más eficientes al copiar grandes fragmentos de la red al búfer a la vez, incluso si solo lee una pequeña cantidad del búfer a la vez. También hace posible volver a leer el contenido que ya se ha consumido (volviendo a una posición anterior en el búfer, que es lo que "marcar"/"restablecer" hacer). –

+0

Cuándo usar el byte 'read()' por byte y cuándo usar 'read (byte [])' array of byte. Como creo que leer array es siempre mejor. entonces ¿puedes darme un ejemplo donde usar uno de los dos? – UnKnown

12

Leer desde la memoria principal es más rápido que leer desde el disco/STDIN.

BufferedReader utiliza una técnica llamada búfer que nos permite reducir la frecuencia con la que leemos desde el disco/STDIN copiando trozos a la memoria principal.

considerar:

BufferedReader in = new InputStreamReader(System.in); 
in.read(); // 
in.read(); // 
// ... 
in.read(); // could be hitting the disk/STDIN a lot (slow!) 

vs:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
in.read(); // 
in.read(); // 
// ... 
in.read(); // hitting main memory a lot (fast!) 

Desde el documentation:

sin búfer, cada invocación de read() podría causar bytes que deben leerse desde [disco/STDIN], convertido en caracteres, y luego devuelto, que puede ser muy ineficiente.

Las dos clases implementan la misma interfaz de Reader. Entonces, si bien podría usar solo InputStreamReader sin BufferedReader, podría resultar en bajo rendimiento. Solo estamos usando el decorator pattern aquí para que terminemos con un InputStreamReader que ahora tiene una capacidad de almacenamiento en memoria intermedia.

0

Según entiendo que en lugar de InputStreamReader BufferedReader tarda menos tiempo para convertir los datos de bytes a character.so preferimos BufferedReader para un mejor rendimiento

2

BufferedReader lee un par de personajes de la corriente especificada y lo almacena en una buffer. Esto hace que la entrada sea más rápida.

InputStreamReader solo lee un carácter de la secuencia especificada y los caracteres restantes aún permanecen en la secuencia.

Ejemplo:

class NewClass{  
    public static void main(String args[]) throws IOException{ 

     BufferedReader isr = new BufferedReader(new InputStreamReader(System.in)); 

     Scanner sc = new Scanner(System.in); 

     System.out.println("B.R. - "+(char)isr.read()); 
     System.out.println("Scanner - " + sc.nextLine());  
    } 
} 

Cuando se ejecuta la instrucción isr.read(), entré en la entrada “hola” y el carácter “h” de “hola” se imprime en la pantalla. Si esto fuera InputStreamReader, los caracteres restantes "ello" se habrían quedado en la secuencia System.in y sc.nextLine() los habría impreso. Pero en este caso no sucede porque BufferedReader lee todos los caracteres "hello" de la secuencia System.in y los almacena en su propio búfer personal y, por lo tanto, la secuencia System.in permanece vacía cuando sc.nextLine() ejecutado.

Para el código:

class NewClass{  

    public static void main(String args[]) throws IOException{ 

     InputStreamReader isr = new InputStreamReader(System.in); 

     Scanner sc = new Scanner(System.in); 

     System.out.println("I.S.R. - "+(char)isr.read()); 
     System.out.println("Scanner - " + sc.nextLine()); 

    } 
} 

En este caso InputStreamReader leer más de un carácter a introducir “Hola” y el resto “ello” aún permanecen en la corriente System.in y estos caracteres se imprimen mediante sc. Proxima linea();

Conclusión:

BufferedReader lee un par de caracteres (incluso si queremos sólo un carácter que va a leer más que eso) de la corriente de entrada y los almacena en una memoria intermedia. Es por eso que se llama BufferedReader. No pude averiguar la cantidad de caracteres que leyó de una vez. Varió de 3 a 10 cuando lo probé para esta respuesta.

InputStreamReader lee solo un carácter de la secuencia de entrada y los caracteres restantes aún permanecen en la secuencia. No hay memoria intermedia intermedia en este caso.

Cuando uno o más subprocesos u objetos desean leer caracteres de System.in, en ese caso se debe utilizar InputStreamReader porque lee solo un carácter y el resto puede ser utilizado por otros objetos o subprocesos.

BufferedReader es rápido porque mantiene un búfer y la recuperación de datos del búfer siempre es rápida en comparación con la recuperación de datos del disco/stdin.

Cuestiones relacionadas