Каков размер буфера в BufferedReader? - PullRequest
23 голосов
/ 09 января 2011

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

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

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

Ответы [ 3 ]

33 голосов
/ 09 января 2011

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

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

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

11 голосов
/ 23 июня 2015

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

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

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

10 голосов
/ 30 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...