BufferedReader vs Console vs Scanner em Java
1. Visão geral
Neste artigo, vamoswalk through the differences between BufferedReader, Console, and Scanner classes in Java.
Para se aprofundar em cada tópico, sugerimos que dê uma olhada em nossos artigos individuais emJava Scanner,Console I/O in Java eBufferedReader.
2. Entrada do Usuário
Dado o fluxo subjacente passado aos construtores,both BufferedReader and Scanner classes are able to handle a wider range of user input, como uma string, arquivo, console do sistema (que normalmente é conectado ao teclado) e soquete.
Por outro lado, a classeConsole foi projetada para acessar apenas o console do sistema baseado em caracteres, se houver, associado à máquina virtual Java atual.
Vamos dar uma olhada nos construtoresBufferedReader, que aceitam diferentes entradas:
BufferedReader br = new BufferedReader(
new StringReader("Bufferedreader vs Console vs Scanner in Java"));
BufferedReader br = new BufferedReader(
new FileReader("file.txt"));
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in))
Socket socket = new Socket(hostName, portNumber);
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
A classeScanner também pode aceitar entradas diferentes em seus construtores:
Scanner sc = new Scanner("Bufferedreader vs Console vs Scanner in Java")
Scanner sc = new Scanner(new File("file.txt"));
Scanner sc = new Scanner(System.in);
Socket socket = new Socket(hostName, portNumber);
Scanner sc = new Scanner(socket.getInputStream());
A classeConsole está disponível apenas por meio da chamada de método:
Console console = System.console();
Lembre-se de que, quando usamos a classeConsole, o console do sistema associado à JVM não fica disponível se executarmos o código em um IDE como Eclipse ou IntelliJ IDEA.
3. Saída do Usuário
In contrast to BufferedReader and Scanner classes, which don’t write anything to the output stream, the Console class offers some convenient methods comoreadPassword (String fmt, Object… args), readLine (String fmt, Object… args), eprintf (String format,Object… args),to write the prompt to the system console’s output stream:
String firstName = console.readLine("Enter your first name please: ");
console.printf("Welcome " + firstName );
Portanto, quando escrevermos um programa para interagir com o console do sistema, a classeConsole simplificará o código removendoSystem.out.println desnecessários.
4. Analisando Entrada
The Scanner class can parse primitive types and strings using regular expressions.
Ele divide sua entrada em tokens usando um padrão delimitador personalizado, que por padrão corresponde ao espaço em branco:
String input = "Bufferedreader vs Console vs Scanner";
Scanner sc = new Scanner(input).useDelimiter("\\s*vs\\s*");
System.out.println(sc.next());
System.out.println(sc.next());
System.out.println(sc.next());
sc.close();
As classesBufferredReadereConsole simplesmente leem o fluxo de entrada como ele é.
5. Lendo dados seguros
A classeConsole possui os métodosreadPassword()ereadPassword (String fmt, Object… args) para ler os dados seguros com eco desativado para que os usuários não vejam o que estão digitando:
String password = String.valueOf(console.readPassword("Password :"));
BufferedReader eScanner não têm capacidade para fazer isso.
6. Discussão segura
Os métodos de leitura emBufferedReadere os métodos de leitura e gravação emConsole são todossynchronized, enquanto aqueles na classeScanner não são. If we read the user input in a multi-threaded program, either BufferedReader or Console will be a better option.
7. Tamanho do buffer
The buffer size is 8 KB in BufferedReader as compared to 1 KB in Scanner class.
Além disso, podemos especificar o tamanho do buffer no construtor da classethe BufferedReader, se necessário. Isso ajudará ao ler as seqüências longas da entrada do usuário. Console class has no buffer when reading from the system console, mas tem um fluxo de saída em buffer para gravar no console do sistema.
8. Diversos
Existem algumas diferenças que não são os principais fatores que consideramos ao escolher a classe apropriada para uso em várias situações.
8.1. Fechando o fluxo de entrada
Depois de criar a instância deBufferedReader ouScanner, precisamosremember to close it in order to avoid a memory leak. Mas isso não acontece com a classeConsole - não precisamos fechar o console do sistema após o uso.
8.2. Manipulação de exceção
EnquantoScannereConsole seguem a abordagem de exceção não verificada, os métodos emBufferedReader lançam exceções verificadas, o que nos força a escrever uma sintaxe padrão try-catch para lidar com as exceções.
9. Conclusão
Agora que declaramos as diferenças entre essas classes, vamos chegar a algunsrules of thumb regarding which one(s) are best suited to tackle different situations:
-
UseBufferedReader se precisarmos ler strings longas de um arquivo, pois tem melhor desempenho do queScanner
-
ConsidereConsole se estivermos lendo dados seguros do console do sistema e quisermos ocultar o que está sendo digitado
-
UseScanner se precisarmos analisar o fluxo de entrada com uma expressão regular personalizada
-
Scanner seria o preferido quando interagimos com o console do sistema, pois oferece métodos refinados para ler e analisar o fluxo de entrada. Além disso, a desvantagem de desempenho não é um grande problema, pois na maioria dos casos, os métodosnextXXX estão bloqueando e aguardam entrada manual
-
Em um contexto thread-safe, considereBufferedReader a menos que tenhamos que usar recursos específicos para a classeConsole