¿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?
Respuesta
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.
@ajay ... dime si se requieren más detalles ... pero se específico a la duda por favor. – amod
amod Quiero usar estas clases para almacenar el contenido de una página web. ¿Quiero saber si debo usar BufferedReader o InputStreamReader? –
@ajay No estoy muy seguro de esto ... pero leí en alguna parte que BufferReader es eficiente. – amod
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.
"buffering" ¿qué significa? –
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). –
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
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.
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
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.
- 1. Cierre BufferedReader y InputStreamReader
- 2. Diferencia entre BufferedReader y BufferedInputStream
- 3. Diferencia entre las clases System.StringComparer y System.StringComparison?
- 4. Diferencia entre las clases java.rmi.registry.Registry y java.rmi.Naming
- 5. ¿Cuál es la diferencia entre + = y = +?
- 6. Java: ¿Cuál es la diferencia entre autoboxing y casting?
- 7. ¿Cuál es la diferencia entre? y Object en genéricos Java?
- 8. ¿Cuál es la diferencia entre Java RMI y JMS?
- 9. Cuál es la diferencia entre $ (...) y `...`
- 10. ¿Cuál es la diferencia entre referencias y objetos en Java?
- 11. ¿Cuál es la diferencia entre interfaz y @interface en java?
- 12. ¿Cuál es la diferencia entre scala @Serializable y Java Serializable?
- 13. ¿Cuál es la diferencia entre java y jsp?
- 14. ¿Cuál es la diferencia entre Java 1.6 y 1.7 jarsigner
- 15. ¿Cuál es la diferencia entre a.getClass() y A.class en Java?
- 16. ¿Cuál es la diferencia entre booleano y booleano en Java?
- 17. ¿Cuál es la diferencia entre Java RMI y RPC?
- 18. ¿Cuál es la diferencia entre int.class y Integer.TYPE en java?
- 19. ¿Cuál es la diferencia entre JavaScript y Java?
- 20. ¿Cuál es la diferencia entre Boolean.TRUE y true en Java?
- 21. ¿Cuál es la diferencia entre Collection y List en Java?
- 22. ¿Cuál es la diferencia entre Future y FutureTask en Java?
- 23. ¿Cuál es la diferencia entre dict() y {}?
- 24. ¿Cuál es la diferencia entre .ToString (+) y ""
- 25. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 26. ¿cuál es la diferencia entre las tareas AntCall y Ant?
- 27. cuál es la diferencia entre las plantillas y el polimorfismo
- 28. Cuál es la diferencia entre las funciones VarIsEmpty y VarIsEmptyParam
- 29. ¿Cuál es la diferencia entre las clases RootViewController, AppDelegate y View Controller que puedo crear?
- 30. ¿Cuál es la diferencia entre los objetos y las clases en C#?
También Tell Abt DataInputStream Class –
@ 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
@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