Яка різниця між BufferedReader та InputStreamReader на Java?


Відповідь 1:

BufferedReader зчитує пару символів із зазначеного потоку і зберігає їх у буфері. Це робить введення швидшим.

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

Приклад:

клас NewClass {
    public static void main (String args []) кидає InterruptedException, IOException {

        BufferedReader isr = новий BufferedReader (новий InputStreamReader (System.in));

        Scanner sc = новий сканер (System.in);

        System.out.println ("B.R. -" + (char) isr.read ());
        System.out.println ("Сканер -" + sc.nextLine ());
    }
}

Коли виконується оператор isr.read (), я вводив вхід "привіт" і на екрані друкується символ "h" з "hello". Якби це InputStreamReader, то інші символи “ello” залишилися б у потоці System.in, а sc.nextLine () надрукував би їх. Але в цьому випадку цього не відбувається, тому що BufferedReader зчитує всі "привіт" символи з потоку System.in і зберігає їх у своєму особистому буфері, і таким чином потік System.in залишається порожнім, коли sc.nextLine () є страчений.

Для коду:

клас NewClass {

    public static void main (String args []) кидає InterruptedException, IOException {

        InputStreamReader isr = новий InputStreamReader (System.in);

        Scanner sc = новий сканер (System.in);

        System.out.println ("I.S.R. -" + (char) isr.read ());
        System.out.println ("Сканер -" + sc.nextLine ());
                
    }
}

У цьому випадку InputStreamReader зчитує лише один символ для введення "привіт", а решта "ello" все ще залишається в потоці System.in, і ці символи друкуються sc.nextLine ();

Висновок:

BufferedReader зчитує пару символів (навіть якщо ми хочемо лише одного символу, він прочитає більше цього) з потоку введення та зберігає їх у буфері. Ось чому його називають BufferedReader. Я не зміг зрозуміти, скільки символів він прочитав за один рух. Коли я перевірив це на цю відповідь, він варіювався від 3 до 10.

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

Коли одна чи більше ниток або об'єктів хочуть читати символи з System.in, тоді в цьому випадку InputStreamReader слід використовувати, оскільки він читає лише один символ, а решта можуть бути використані іншими об'єктами або потоками.

BufferedReader - швидкий, оскільки він підтримує буфер, а вилучення даних із буфера завжди швидко порівняно із завантаженням даних з диска / stdin.

Я сподіваюся, що це допомагає. Якщо у вас виникли сумніви, будь ласка, запитайте, коментуючи. Я постараюся зробити все можливе, щоб їх очистити.


Відповідь 2:

Довідка: Decodejava.com представляє простий та простий підручник Java

Операції введення / виводу файлів займають багато важливих ресурсів і займають багато часу. Отже, зчитувати фрагмент символів з файлу та зберігати його у локальному буфері для подальшої обробки - це швидше, ніж одночасно з читання символу, із файлу.

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

Для отримання додаткової інформації про BufferedReader з простим прикладом коду, ви можете прочитати Java BufferedReader Class - Decodejava.com

InputStreamReader обертається навколо вхідного потоку (який читає в байтах) для читання даних у вигляді символів з нього, отже, клас InputStreamReader виконує функцію перетворювача байтів у символи.

Докладніше про InputStreamReader з простим прикладом коду ви можете прочитати Java InputStreamReader Class - Decodejava.com

Сподіваюся, це допоможе,

Удачі!


Відповідь 3:

InputStreamReader - це міст від потоків байтів до потоків символів: він зчитує байти та розшифровує їх у символи, використовуючи вказану діаграму. Шарсет, який він використовує, може бути вказаний ім'ям або може бути наданий явно, або ж може бути прийнято схему за замовчуванням платформи.

Кожне виклик одного з методів читання () InputStreamReader може призвести до зчитування одного або декількох байтів з базового потоку введення байтів. Щоб забезпечити ефективне перетворення байт в символи, з базового потоку може бути прочитано більше байтів, ніж необхідно для задоволення поточної операції зчитування.

Для найкращої ефективності розгляньте обгортання InputStreamReader в BufferedReader. Наприклад:

 BufferedReader в
   = новий BufferedReader (новий InputStreamReader (System.in));
публічний клас BufferedReader розширює Reader

Читає текст із потоку введення символів, буферизуючи символи, щоб забезпечити ефективне зчитування символів, масивів та рядків.

Розмір буфера може бути визначений або розмір за замовчуванням. За замовчуванням достатньо великий для більшості цілей.

Загалом, кожен запит на читання, зроблений зчитувачем, викликає відповідний запит читання базового символу або потоку байтів. Тому доцільно обернути BufferedReader навколо будь-якого зчитувача, чиї операції читання () можуть бути дорогими, наприклад FileReaders та InputStreamReaders. Наприклад,

 BufferedReader в
   = новий BufferedReader (новий FileReader ("foo.in"));

Відповідь 4:
  • InputStreamReader створює новий об'єкт потоку, який може бути використаний для зчитування даних із зазначеного джерела. Це міст від потоків байтів до потоків символів. Він читає байти та розшифровує їх у символи, використовуючи вказану діаграму. Використовувана ним діаграма може бути визначена назвою або може бути прийнята карта за замовчуванням платформи.BufferedReader - це абстракція, яка читає текст з потоку введення символів. Він буферизує символи для забезпечення ефективного читання символів та рядків. Це клас використовується для зчитування тексту з потоку введення на основі символів. Його можна використовувати для читання даних за рядком методом readLine (). Це робить продуктивність швидкою. Він успадковує клас Reader.