2011-01-09 17 views
19

¿Cuál es el sentido del tamaño del búfer en el constructor?¿Cuál es el tamaño del búfer en BufferedReader?

BufferedReader(Reader in, int size) 

Como he escrito en el programa:

import java.io.*; 
class bufferedReaderEx{ 
    public static void main(String args[]){ 
     InputStreamReader isr = null; 
     BufferedReader br = null; 
      try{ 
       isr = new InputStreamReader(System.in); 
//    System.out.println("Write data: "); 
//    int i = isr.read(); 
//    System.out.println("Data read is: " + i); 
       //Thus the InputStreamReader is useful for reading the character from the stream 
       System.out.println("Enter the data to be read by the bufferedReader: "); 
       //here isr is containing the lnefeed already so this is needed to be flushed. 
       br = new BufferedReader(isr, 2); 
       String str = br.readLine(); 
       System.out.println("The data is : :" + str); 
      }catch(IOException e){ 
       System.out.println("Can't read: " + e.getMessage()); 
      } 
    } 
} 

Salida:

Enter the data to be read by the bufferedReader: Hello world and hello world again 
The data is: Hello world and hello world again 

entonces qué el tamaño del búfer significa como era mi intención que estaría leyendo sólo dos personajes. pero no fue eso.

Respuesta

29

BufferedReader almacena la entrada, tal como su nombre lo indica. Esto significa que lee de la fuente de entrada en un búfer antes de pasárselo. El tamaño del búfer aquí se refiere a la cantidad de bytes que almacena.

La lectura de la mayoría de las fuentes es muy lenta. Un búfer de solo 2 bytes perjudicará el rendimiento, ya que es muy probable que su programa esté esperando la entrada la mayor parte del tiempo. Con un tamaño de búfer de 2, una lectura de 100 bytes dará como resultado la lectura de 2 bytes desde el búfer en memoria (muy rápido), llenando el búfer (muy lento), leyendo 2 bytes desde el búfer (muy rápido), completando el buffer (muy lento), etc. - en general muy lento. Con un tamaño de búfer de 100, una lectura de 100 bytes dará como resultado la lectura de 100 bytes desde el búfer en memoria (muy rápido), en general muy rápido. Esto supone que el búfer contiene los 100 bytes al leer, lo que en un caso como el suyo es una suposición razonable de realizar.

A menos que sepa lo que está haciendo, debe usar el tamaño de búfer predeterminado, que es bastante grande. Una razón para un buffer más pequeño es cuando se está ejecutando en un dispositivo de memoria limitada, ya que el buffer consume memoria.

+0

¿Cuál es la importancia del tamaño del búfer? ¿Podrías por favor explicar? – codeomnitrix

+1

@codeonnitrix Agregó un poco de una explicación. Avísame si eso es suficiente. – marcog

+0

thanks marcog .. – codeomnitrix

0

Es el tamaño del buffer de entrada. Lea más en javadoc.

+0

Hola, ya lo he leído, en realidad quiero saber cuál es el efecto de tener menos tamaño de búfer o gran tamaño de búfer. quiero decir cuál es su significado. es decir, si el tamaño del búfer es 12000 o 200, lo que debería usarse cuando – codeomnitrix

+1

El búfer con el tamaño 12000 usará más memoria pero funcionará más rápido. En cambio, con 200 funcionará más despacio pero con un uso de memoria pequeño. * Más lento/más rápido en tamaños de datos grandes. –

+0

significa que el trabajo se hará todo el tiempo, pero en el antiguo, un bloque 20000 tendrá dos rondas, mientras que en el otro, el mismo tomará 100 rondas. ¿Lo es? – codeomnitrix

9

Cuando lee o escribe en un archivo, debe acceder al kernel, que en realidad obtiene acceso al archivo. Todas las operaciones de archivos deben pasar por el kernel. Esta es una operación bastante costosa. El almacenamiento en búfer hace que se lea un trozo de bytes; estos se guardan en una ubicación temporal en la RAM y se leen los bytes desde esta ubicación. De esta forma, no estás haciendo solicitudes frecuentes al kernel para hacer el archivo IO.

Si usa un tamaño de búfer enorme, acumulará RAM innecesariamente. Si usa uno pequeño, estará enloqueciendo el kernel constantemente para solicitudes de archivos. Lo mejor es permitir que se use el valor predeterminado. Puede especificar el tamaño del búfer y experimentar. La mayoría de las máquinas leerán un sector a la vez o un número entero de sectores. El tamaño del sector depende de cómo formatee su máquina.

El siguiente experimento es interesante. Haga un archivo con 1,000,000 ceros en él. Use la función de tiempo de su sistema operativo para ver qué tan rápido lo copia en otro archivo (escribirá un programa de copia con E/S búfer y sin búfer). Tómelo con varios tamaños de búfer, incluido el predeterminado.

8

http://www.docjar.com/html/api/java/io/BufferedReader.java.html

Según esta documentación de Java, el tamaño de búfer predeterminado es la capacidad de 8192 caracteres. El tamaño de línea se considera capacidad de 80 caracteres.

8192 El tamaño del búfer es suficiente para archivos de menor tamaño. Pero de nuevo esto es cultivable. si el archivo contiene más de 8192 caracteres, el método de relleno del lector de búferes aumentará el tamaño del búfer antes de leer el contenido del archivo.Para archivos de contenido más grandes, preferiblemente establezca su propio tamaño máximo en el búfer mientras crea el lector en búfer a través del constructor, de modo que pueda evitar recrear la memoria y copiar la matriz anterior en una matriz recién creada.

+0

Información directa y detallada. Gracias @ usuario1923551 –

+0

El búfer en realidad nunca crece. Es de tamaño constante. Se usa solo como almacenamiento intermedio en memoria cuando se lee desde un archivo. Soy perezoso para explicar más, así que mira esto: https://stackoverflow.com/questions/648309/what-does-it-mean-by-buffer – gargii

Cuestiones relacionadas