ajay yadav
¿Cuál es la diferencia entre Java BufferedReader
y InputStreamReader
clases?
BufferedReader es un contenedor para “InputStreamReader/FileReader”, que almacena en búfer la información cada vez que se llama a una E/S nativa.
Puede imaginar la diferencia de eficiencia con la lectura de un carácter (o bytes) frente a la lectura de un número grande. de caracteres de una sola vez (o bytes). Con BufferedReader, si desea leer un solo carácter, almacenará el contenido para llenar su búfer (si está vacío) y para más solicitudes, los caracteres se leerán directamente del búfer y, por lo tanto, logrará una mayor eficiencia.
InputStreamReader convierte flujos de bytes en flujos de caracteres. Lee bytes y los decodifica en caracteres utilizando un juego de caracteres específico. El juego 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 eso ayude.
-
amod Quiero usar estas clases para almacenar el contenido de una página web. Quiero saber si debo usar BufferedReader o InputStreamReader.
– Ajay Yadav
11 de septiembre de 2011 a las 6:40
-
@ajay no estoy muy seguro de esto … pero leí en alguna parte que BufferReader es eficiente.
– amod
11 de septiembre de 2011 a las 6:50
-
para la codificación competitiva, ¿debería usar BufferedReader o InputReader?
– VR7
3 de diciembre de 2020 a las 7:59
James Lawson
La lectura desde la memoria principal es más rápida que la lectura desde el disco/STDIN.
BufferedReader
utiliza una técnica llamada almacenamiento en búfer eso nos permite reducir la frecuencia con la que leemos desde el disco/STDIN al copiar fragmentos en 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!)
contra:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
in.read(); //
in.read(); //
// ...
in.read(); // hitting main memory a lot (fast!)
Desde el documentación:
Sin almacenamiento en búfer, cada invocación de
read()
podría hacer que se leyeran bytes [disk/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 patrón decorador aquí para que terminemos con un InputStreamReader
cual ahora tiene una capacidad de almacenamiento en búfer.
El InputStreamReader la clase adapta el tipo Flujo de entrada (bytes no interpretados) al Lector class (bytes interpretados como caracteres en algún conjunto de caracteres), pero no aplica ningún almacenamiento en búfer adicional. El BufferedReader la clase toma un Lector class (presumiblemente sin búfer) y le aplica almacenamiento en búfer.
-
“buffering” ¿qué significa?
–Quazi Irfan
13 de febrero de 2015 a las 2:19
-
El almacenamiento en búfer significa que los datos se agregan en una matriz llamada “búfer”. El uso de un búfer hace que las lecturas sean más eficientes en el sentido de que copia 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 (regresando a una posición anterior en el búfer, que es lo que hacen “marcar”/”restablecer”).
– Michael Aarón Safyan
16 de febrero de 2015 a las 4:54
-
Cuándo usar
read()
byte por byte y cuándo usarloread(byte[])
matriz de bytes. Como creo, leer array siempre es mejor. entonces, ¿puedes darme un ejemplo de dónde usar uno de los dos?-Asif Mushtaq
1 de abril de 2016 a las 13:18
BufferedReader lee un par de caracteres del flujo especificado y lo almacena en un búfer. Esto hace que la entrada sea más rápida.
InputStreamReader lee solo un carácter del flujo especificado y los caracteres restantes aún permanecen en el flujo.
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 declaración isr.read(), ingresé la entrada “hola” y el carácter “h” de “hola” se imprime en la pantalla. Si se tratara de InputStreamReader, los caracteres restantes “ello” habrían permanecido en el flujo System.in y sc.nextLine() los habría impreso. Pero en este caso no sucede porque BufferedReader lee todos los caracteres “hola” del flujo System.in y los almacena en su propio búfer personal y, por lo tanto, el flujo System.in permanece vacío cuando se ejecuta 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 lee solo un carácter para la entrada “hola” y el “hola” restante aún permanece en el flujo System.in y estos caracteres son impresos por sc.nextLine();
Conclusión:
BufferedReader lee un par de caracteres (incluso si solo queremos un carácter, leerá más) del flujo de entrada y los almacena en un búfer. Por eso se llama BufferedReader. No pude averiguar cuántos caracteres leyó de una sola vez. Varía de 3 a 10 cuando lo probé para esta respuesta.
InputStreamReader lee solo un carácter del flujo de entrada y los caracteres restantes aún permanecen en el flujo. No hay buffer intermedio en este caso.
Cuando uno o más subprocesos u objetos desean leer caracteres de System.in, en ese caso se debe usar InputStreamReader porque solo lee 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/entrada estándar.
BufferedReader lee un par de caracteres del flujo de entrada y los almacena en un búfer.
InputStreamReader lee solo un carácter del flujo de entrada y los caracteres restantes aún permanecen en los flujos, por lo tanto, no hay búfer en este caso.
ChrisMM
BufferedReader es una clase en Java que lee texto de un flujo de entrada de caracteres, almacenando caracteres en búfer para proporcionar una lectura eficiente de caracteres, líneas y matrices. Se puede especificar el tamaño del búfer. De lo contrario, se puede utilizar el tamaño predeterminado, que está predefinido.
En general, cada solicitud de lectura realizada de un Lector hace que se realice una solicitud de lectura correspondiente del flujo de caracteres o bytes subyacente. Por lo tanto, es una buena práctica envolver un BufferedReader alrededor de cualquier Reader cuyas operaciones de lectura () puedan ser costosas, como FileReaders y InputStreamReaders. Por ejemplo,
FileReader reader = new FileReader(“MyFile.txt”); BufferedReader bufferedReader = new BufferedReader(reader);
almacenará en búfer la entrada del archivo especificado. Sin almacenamiento en búfer, cada invocación de read() o readLine() podría hacer que se leyeran bytes del archivo, se convirtieran en caracteres y luego se devolvieran, lo que puede ser muy ineficiente.
usuario8732605
Según entiendo, en lugar de InputStreamReader, BufferedReader tarda menos tiempo en convertir los datos de bytes a caracteres, por lo que preferimos BufferedReader para un mejor rendimiento.
También dígale a Abt DataInputStream Class
– Ajay Yadav
11 de septiembre de 2011 a las 6:16
@ amod0017 la pregunta se responde completamente en el Javadoc. Se debe desaconsejar hacer preguntas en foros que tienen respuestas bien especificadas en la documentación del producto como un muy mal hábito. Simplemente desperdicia tiempo valioso. La respuesta correcta ya está en el Javadoc y cualquier respuesta aquí la citará textualmente, que el OP ya podría haber leído, o la parafraseará, lo que es una pérdida de valor y precisión. Y hacer una pregunta que podrías responder tú mismo en un foro, y esperar posiblemente una eternidad, por una respuesta posiblemente incorrecta. no es una estrategia de aprendizaje racional.
– usuario207421
11 de septiembre de 2011 a las 6:57
@EJB, estoy de acuerdo con usted, pero supongo que la pregunta que se hace se presenta de manera incorrecta … tiene una 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
11 de septiembre de 2011 a las 7:08
Si tuviera que reformular la pregunta, preguntaría: “¿Bajo qué condiciones NO querría almacenar en búfer un lector de flujo de entrada?” Parece que el búfer se usa prácticamente por defecto en todas partes.
– suerte extraña
7 oct 2014 a las 12:49
@AjayYadav ¿Puede cambiar la respuesta aceptada a la respuesta de ChaitanyaVaishampayan? Depende totalmente de usted, pero tal vez necesite revisar su respuesta, que se explica con tanto detalle.
– Golpeando cabezas
24 de mayo de 2021 a las 14:39