BufferedReader - это простой класс, предназначенный для эффективного чтения из нижележащего потока. Как правило, каждый запрос на чтение, сделанный из Reader, такого как FileReader, вызывает соответствующий запрос на чтение в базовом потоке. Каждый вызов read () или readLine () может привести к тому, что байты будут считаны из файла, преобразованы в символы и затем возвращены, что может быть очень неэффективным. Эффективность значительно улучшается, если Reader деформируется в BufferedReader.
BufferedReader синхронизирован, поэтому операции чтения в BufferedReader можно безопасно выполнять из нескольких потоков.
С другой стороны, в сканер встроено гораздо больше сыра; он может делать все, что может делать BufferedReader, и на том же уровне эффективности. Однако, кроме того, сканер может анализировать основной поток на предмет примитивных типов и строк с помощью регулярных выражений. Он также может маркировать основной поток с выбранным вами разделителем. Он также может выполнять прямое сканирование основного потока без учета разделителя!
Сканер, однако, не является поточно-ориентированным, он должен быть внешне синхронизирован.
Выбор использования BufferedReader или сканера зависит от кода, который вы пишете, если вы пишете простое средство чтения журнала Buffered reader достаточно. Однако, если вы пишете синтаксический анализатор XML, это более естественный выбор.
Даже при чтении ввода, если вы хотите принять пользовательский ввод построчно и просто добавить его в файл, BufferedReader достаточно хорош. С другой стороны, если вы хотите принять пользовательский ввод как команду с несколькими параметрами, а затем намереваетесь выполнять различные операции в зависимости от указанной команды и параметров, лучше подойдет сканер.