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

В чем разница между классами Java BufferedReader и InputStreamReader?

В чем разница между классами Java BufferedReader и InputStreamReader?

4b9b3361

Ответ 1

BufferedReader - это оболочка для "InputStreamReader/FileReader", которая буферизует информацию каждый раз, когда вызывается собственный ввод-вывод.

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

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

Надеюсь, что это поможет.

Ответ 2

Класс InputStreamReader адаптирует тип InputStream (неинтерпретированные байты) к Reader класс (байты интерпретируются как символы в некотором наборе символов), но не применяется дополнительная буферизация. Класс BufferedReader принимает класс Reader (предположительно небуферизованный) и применяет к нему буферизацию.

Ответ 3

Чтение из основной памяти происходит быстрее, чем чтение с диска /STDIN.

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

Рассматривать:

BufferedReader in = new InputStreamReader(System.in);
in.read(); // 
in.read(); //
// ...
in.read(); // could be hitting the disk/STDIN a lot (slow!)

против:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
in.read(); //
in.read(); //
// ...
in.read(); // hitting main memory a lot (fast!)

Из документации:

Без буферизации каждый вызов read() может привести к чтению байтов из [disk/STDIN], преобразованию в символы и их возврату, что может быть очень неэффективным.

Два класса реализуют один и тот же интерфейс Reader. Таким образом, хотя вы можете использовать только InputStreamReader без BufferedReader, это может привести к снижению производительности. Мы просто используем здесь шаблон декоратора, чтобы в итоге получить InputStreamReader который теперь имеет возможность буферизации.

Ответ 4

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

InputStreamReader считывает только один символ из указанного потока, а оставшиеся символы остаются в потоке.

Пример:

class NewClass{    
    public static void main(String args[]) throws IOException{

        BufferedReader isr = new BufferedReader(new InputStreamReader(System.in));

        Scanner sc = new Scanner(System.in);

        System.out.println("B.R. - "+(char)isr.read());
        System.out.println("Scanner - " + sc.nextLine());       
    }
}

Когда выполняется инструкция isr.read(), я ввел ввод "привет" , и на экране напечатан символ "h" "привет" . Если это был InputStreamReader, остальные символы "ello" остались бы в потоке System.in, и sc.nextLine() напечатал их. Но в этом случае это не происходит, потому что BufferedReader считывает все символы "привет" из потока System.in и сохраняет их в своем личном буфере, и поэтому поток System.in остается пустым при выполнении sc.nextLine().

Для кода:

class NewClass{    

    public static void main(String args[]) throws IOException{

        InputStreamReader isr = new InputStreamReader(System.in);

        Scanner sc = new Scanner(System.in);

        System.out.println("I.S.R. - "+(char)isr.read());
        System.out.println("Scanner - " + sc.nextLine());

    }
}

В этом случае InputStreamReader считывает только один символ для входа "hello", а оставшиеся "ello" все еще остаются в потоке System.in, и эти символы печатаются sc.nextLine();

Вывод:

BufferedReader считывает пару символов (даже если мы хотим, чтобы только один символ читал больше) из входного потока и хранит их в буфере. Вот почему он называется BufferedReader. Я не мог понять, сколько персонажей он читает за один раз. Он варьировался от 3 до 10, когда я тестировал его для ответа.

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

Когда один или несколько потоков или объектов хотят читать символы из System.in, тогда в этом случае следует использовать InputStreamReader, потому что он читает только один символ, а остальные могут использоваться другими объектами или потоками.

BufferedReader работает быстро, потому что он поддерживает буфер и извлечение данных из буфера всегда быстр по сравнению с извлечением данных с диска/stdin.

Ответ 5

Как я понимаю, вместо InputStreamReader BufferedReader занимает меньше времени для преобразования данных из байтов в character.so мы предпочитаем BufferedReader для лучшей производительности

Ответ 6

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

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