В чем разница между классами Java BufferedReader
и InputStreamReader
?
В чем разница между классами Java BufferedReader и InputStreamReader?
Ответ 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 читает только один символ из входного потока, а оставшиеся символы все еще остаются в потоках, следовательно, в этом случае нет буфера.