Um BufferedReader é uma classe simples destinada a ler com eficiência a partir do fluxo subjacente. Geralmente, cada solicitação de leitura feita de um Reader como um FileReader faz com que uma solicitação de leitura correspondente seja feita no fluxo subjacente. Cada chamada de read () ou readLine () pode fazer com que os bytes sejam lidos no arquivo, convertidos em caracteres e retornados, o que pode ser muito ineficiente. A eficiência é aprimorada consideravelmente se um Reader é distorcido em um BufferedReader.
O BufferedReader é sincronizado, portanto, as operações de leitura em um BufferedReader podem ser realizadas com segurança a partir de vários threads.
Um scanner, por outro lado, tem muito mais queijo embutido; ele pode fazer tudo o que um BufferedReader pode fazer e no mesmo nível de eficiência também. No entanto, além disso, um scanner pode analisar o fluxo subjacente para tipos e cadeias primitivas usando expressões regulares. Também pode tokenizar o fluxo subjacente com o delimitador de sua escolha. Ele também pode fazer a varredura direta do fluxo subjacente, desconsiderando o delimitador!
Um scanner, no entanto, não é seguro para threads, deve ser sincronizado externamente.
A escolha de usar um BufferedReader ou um Scanner depende do código que você está escrevendo, se estiver escrevendo um simples leitor de log O leitor tamponado é adequado. No entanto, se você estiver escrevendo um analisador de analisador XML, é a escolha mais natural.
Mesmo durante a leitura da entrada, se você deseja aceitar a entrada do usuário linha por linha e dizer apenas adicioná-la a um arquivo, um BufferedReader é bom o suficiente. Por outro lado, se você deseja aceitar a entrada do usuário como um comando com várias opções e, em seguida, pretende executar operações diferentes com base no comando e nas opções especificadas, um Scanner será mais adequado.