BufferedReader - це простий клас, призначений для ефективного читання з нижнього потоку. Як правило, кожен запит на читання, зроблений з Reader, як FileReader, викликає відповідний запит читання до базового потоку. Кожне виклик read () або readLine () може спричинити зчитування байтів з файлу, перетворення їх у символи та повернення, що може бути дуже неефективно. Ефективність помітно підвищується, якщо зчитувач перекручується в BufferedReader.
BufferedReader синхронізований, тому операції зчитування на BufferedReader можна безпечно робити з декількох потоків.
З іншого боку, у сканер вбудовано набагато більше сиру; він може зробити все, що може зробити BufferedReader, і на тому ж рівні ефективності. Однак, крім того, сканер може проаналізувати базовий потік для примітивних типів і рядків, використовуючи регулярні вирази. Він також може токенізувати основний потік роздільником, який ви обрали. Він також може виконати сканування вперед потоку, не враховуючи роздільник!
Сканер, однак, не є безпечним для потоків, він повинен бути зовнішньо синхронізований.
Вибір використання BufferedReader або сканера залежить від коду, який ви пишете, якщо ви пишете простий читач журналів. Однак якщо ви пишете XML-аналізатор розбору сканерів - це більш природний вибір.
Навіть читаючи введення, якщо ви хочете прийняти користувальницький рядок за рядком і сказати просто додати його до файлу, BufferedReader досить хороший. З іншого боку, якщо ви хочете прийняти введення користувача як команду з декількома параметрами, а потім маєте намір виконувати різні операції на основі вказаних команд та параметрів, сканер підійде краще.