Подтвердить что ты не робот

Каков размер буфера в BufferedReader?

В чем смысл размера буфера в конструкторе?

BufferedReader(Reader in, int size)

Как я написал программу:

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());
            }
    }
}

Вывод:

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

Тогда что означает размер буфера, поскольку я предполагал, что он будет читать только два символа. но это было не так.

4b9b3361

Ответ 1

BufferedReader буферизует ввод, как указано в названии. Это означает, что он считывает из входного источника в буфер, прежде чем передавать его на вас. Размер буфера здесь относится к числу байтов, которые он буферизует.

Чтение ввода из большинства источников происходит очень медленно. Буфер всего 2 байта может повредить производительность, так как ваша программа, скорее всего, будет долгое время ждать ввода. Если размер буфера равен 2, чтение 100 байт приведет к чтению 2 байтов из буфера в памяти (очень быстро), заполнению буфера (очень медленному), чтению 2 байта из буфера (очень быстро), заполнению буфера (очень медленно) и т.д. - в целом очень медленно. При размере буфера 100, чтение из 100 байт приведет к чтению 100 байтов из буфера в памяти (очень быстро) - в целом очень быстро. Это предполагает, что буфер содержит 100 байтов при чтении, что в случае, подобное вашему, является разумным предположением.

Если вы не знаете, что делаете, вы должны использовать размер буфера по умолчанию, который довольно велик. Одна из причин меньшего буфера - это когда вы работаете на устройстве с ограниченной памятью, так как буфер потребляет память.

Ответ 2

Когда вы читаете или записываете файл, вы должны обращаться к ядру, которое фактически получает доступ к файлу. Все файловые операции должны проходить через ядро. Это довольно дорогостоящая операция. Буферизация вызывает чтение байта байтов; они хранятся во временном месте в ОЗУ и считываются байты из этого местоположения. Таким образом, вы не делаете частые запросы ядра делать файл IO.

Если вы используете огромный размер буфера, вы будете бесполезно запускать ОЗУ. Если вы используете крошечный, вы будете постоянно загружать ядро ​​для запросов файлов. Лучше всего разрешить использование по умолчанию. Вы можете указать размер буфера и эксперимент. Большинство машин будут читать сектор за раз или целое число секторов. Размер сектора зависит от того, как вы форматируете свою машину.

Интересен следующий эксперимент. Сделайте файл с 1 000 000 нулей. Используйте функцию синхронизации ОС, чтобы узнать, как быстро она копирует ее в другой файл (вы будете писать программу копирования с буферизованным и небуферизованным IO). Время его с различными размерами буфера, включая значение по умолчанию.

Ответ 3

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

В соответствии с этой java-документацией размер буфера по умолчанию составляет 8192 символов. Размер линии считается емкостью 80 символов.

Размер файла

8192 достаточен для меньших размеров файлов. Но опять же это растёт. если файл содержит более 8192 символов, то метод заполнения буферизованного считывателя увеличит размер буфера перед чтением содержимого из файла. Для больших файлов содержимого предпочтительно устанавливать свой собственный максимальный размер для буферизации при создании буферизованного считывателя через конструктор, чтобы можно было избежать воссоздания памяти и копирования старого массива во вновь созданный массив.

Ответ 4

Это размер входного буфера. Подробнее читайте в javadoc.