Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top