Pregunta

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

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

A continuación, lo que hace el tamaño del búfer medios como era mi intención que estaría leyendo sólo dos personajes. pero no era eso.

¿Fue útil?

Solución

BufferedReader amortigua la entrada, así como el nombre lo dice. Esto significa que se lee de la fuente de entrada en un búfer antes de pasarlo a usted. El tamaño del búfer aquí se refiere al número de bytes que amortigua.

La lectura es la entrada de la mayoría de las fuentes es muy lento. Un búfer de sólo 2 bytes va a rendimiento herida, ya que su programa es muy probable que va a estar esperando en la entrada de la mayor parte del tiempo. Con un tamaño de búfer de 2, una lectura de 100 bytes resultará en la lectura de 2 bytes de la memoria intermedia en la memoria (muy rápida), llenando la memoria intermedia (muy lento), la lectura de 2 bytes de la memoria intermedia (muy rápida), llenando el búfer (muy lento), etc - en general muy lento. Con un tamaño de búfer de 100, una lectura de 100 bytes dará lugar a la lectura de 100 bytes del buffer en memoria (muy rápido) - en general muy rápido. Esto es suponiendo que la memoria intermedia está contiene los 100 bytes cuando se lee sin embargo, que en un caso como el suyo es una suposición razonable de hacer.

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

Otros consejos

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

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

8192 tamaño del búfer es suficiente para archivos más pequeños. Pero de nuevo esto es cultivable. si el archivo contiene más de 8192 caracteres, luego llenar método de BufferedReader aumentará el tamaño del búfer antes de leer el contenido del archivo. Para grandes archivos de contenido fijado preferentemente su propio tamaño máximo para amortiguar mientras que la creación lector de buffer a través del constructor, por lo que se puede evitar la recreación de la memoria y la copia de la vieja matriz en matriz creada.

Al leer o escribir en un archivo, debe tener acceso al núcleo, que en realidad obtiene acceso al archivo. Todas las operaciones de archivo deben pasar por el núcleo. Esta es una operación bastante costosa. Búfer provoca un trozo de bytes a leer; éstos se llevan a cabo en una ubicación temporal en la memoria RAM y se bytes se leen desde esta ubicación. De esta manera, usted no está haciendo frecuentes peticiones de kernel para archivo IO.

Si utiliza una enorme tamaño del búfer, se le acaparar la memoria RAM sin necesidad. Si utiliza uno pequeño, que será el núcleo molestando constantemente por las solicitudes de archivos. Lo mejor es permitir que el defecto que se utilizará. Puede especificar el tamaño del búfer y el experimento. La mayoría de las máquinas van a leer un sector a la vez o un número entero de sectores. El tamaño del sector depende de cómo dar formato a su máquina.

El siguiente experimento es interesante. Hacer un archivo con ceros 1.000.000 en el mismo. Utiliza la función de sincronización de su sistema operativo para ver lo rápido que lo copia en otro archivo (que va a escribir un programa de copia con buffer y sin buffer IO). Tiempo con diversos tamaños de búfer incluyendo el valor por defecto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top