1. Lendo do console usandoSystem.in
Nas lições anteriores, conhecemos os comandos para exibição de informações na tela. Para fazer isso, usamos o System.out
objeto e seus métodos print()
e println()
. É simples e conveniente.
Mas, como você provavelmente já adivinhou, exibir informações na tela não é suficiente para nós. O propósito da maioria dos programas é fazer algo útil para o usuário. Isso significa que muitas vezes é necessário que o usuário possa inserir dados a partir do teclado.
Assim como no caso da saída, também temos um objeto especial para entrada de dados — System.in
. Mas, infelizmente para nós, não é tão conveniente quanto gostaríamos. Ele nos permite ler os dados do teclado, um caractere por vez.
Para melhorar isso, usaremos outra classe que, quando emparelhada com o System.in
objeto, nos dará tudo o que precisamos. Há muito tempo, Java tem classes para atender todas as ocasiões. E vamos conhecer um deles agora.
2. Scanner
classe
A Scanner
classe (nome completo: java.util.Scanner
) pode ler dados de diferentes fontes, por exemplo, console, arquivos e Internet. Se queremos que ele leia os dados do teclado, devemos passar o System.in
objeto como um argumento que servirá como fonte de dados. E então o objeto Scanner descobrirá o que fazer com ele.
A leitura do teclado usando um Scanner
objeto seria algo como isto:
Código | Explicação |
---|---|
|
Criamos um Scanner objeto. Lemos uma linha de texto do teclado. Lemos um número no teclado. |
Parece fácil, mas é assim tão simples?
Acho que você deve ter um monte de perguntas, e agora vamos respondê-las.
Mas antes, vamos demonstrar um exemplo de programa completo que utiliza a Scanner
classe:
import java.util.Scanner;
public class Solution {
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
3. Criando um Scanner
objeto
A primeira pergunta é o que é essa linha Scanner console = new Scanner (System.in);
?
Esta linha pode ser confusa, mas você verá coisas semelhantes o tempo todo. Então achamos importante explicar o que está acontecendo aqui.
Lembre-se de como geralmente criamos uma variável com texto:
String str = "text";
Primeiro, escrevemos o tipo da variável ( String
), depois seu nome ( str
) e, finalmente, após o sinal de igual, escrevemos o valor.
Nossa linha desconcertante é na verdade a mesma:
Scanner console = new Scanner(System.in);
Tudo à esquerda do sinal de igual é a declaração de uma variável nomeada console
cujo tipo é Scanner
. Em vez disso, você poderia chamá-lo s
de ou scanner
ou mesmo keyboard
. Então o código ficaria assim:
Scanner s = new Scanner(System.in);
String name = s.nextLine();
int age = s.nextInt();
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
int age = scanner.nextInt();
Scanner keyboard = new Scanner(System.in);
String name = keyboard.nextLine();
int age = keyboard.nextInt();
Acho que isso deixa tudo muito mais claro.
Mas o código à direita do sinal de igual é um pouco mais complicado. Agora estou me referindo a new Scanner(System.in);
Dito isso, também não há nada sobrenatural acontecendo aqui.
Nesse código, dizemos à máquina Java: crie um novo objeto (a new
palavra-chave) cujo tipo seja Scanner
, passando o System.in
objeto como fonte de dados para o Scanner
objeto recém-criado.
Após executar toda esta linha, teremos uma Scanner
variável nomeada console
que nosso programa utilizará para ler os dados do teclado.
4. Lista de métodos
No exemplo acima, nossa Scanner
console
variável armazena uma referência a um Scanner
objeto.
Para chamar métodos em um objeto referenciado por uma variável, você escreve um ponto após o nome da variável, seguido pelo nome do método e quaisquer argumentos. A aparência geral do comando é a seguinte:
variable.method(arguments);
Exemplos:
System.out.println("Hello");
System.out.println(1);
Se você não planeja passar argumentos para uma função, basta escrever parênteses vazios:
variable.method();
Exemplo:
System.out.println();
5. Entrada do console
Quando temos um Scanner
objeto, é fácil obter dados do teclado.
Para ler uma linha do teclado , você precisa deste comando:
String str = console.nextLine();
Quando a execução do programa atingir esta linha, ele fará uma pausa e aguardará que o usuário insira os dados e pressione Enter. Então tudo que o usuário digitou é armazenado na variável str
.
Para ler um número do teclado , você precisa deste comando:
int number = console.nextInt();
Tudo aqui é como o comando anterior. Quando a execução do programa atingir esta linha, ele fará uma pausa e aguardará que o usuário insira os dados e pressione Enter. Depois disso, tudo o que o usuário digitou é convertido em número e armazenado na number
variável.
Se o usuário inseriu dados que não podem ser convertidos em um número inteiro, o programa gerará um erro e será encerrado.
Para ler um número fracionário do teclado , você precisa deste comando:
double number = console.nextDouble();
Esta instrução é muito semelhante à do nextInt()
método, apenas verifica se os dados inseridos podem ser convertidos em um double
número.
Exemplo de programa que lê dois números do teclado e exibe a soma deles na tela:
import java.util.Scanner;
public class Solution {
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
int a = console.nextInt();
int b = console.nextInt();
System.out.println(a + b);
}
}
O usuário pode inserir vários números em uma única linha, separando-os com espaços: os métodos da Scanner
classe sabem como lidar com isso. Dito isso, o programa lê os números somente depois que o usuário pressiona Enter
.
6. Outros métodos da Scanner
classe
A propósito, os métodos acima não são tudo o que a Scanner
classe tem a oferecer. A lista completa de métodos é mais ou menos assim:
Método | Descrição |
---|---|
|
Lê os dados e os converte em umbyte |
|
Lê os dados e os converte em umshort |
|
Lê os dados e os converte em umint |
|
Lê os dados e os converte em umlong |
|
Lê os dados e os converte em umfloat |
|
Lê os dados e os converte em umdouble |
|
Lê os dados e os converte em umboolean |
|
Lê um "token". Os tokens são separados por espaços ou pressionamentos da tecla enter |
|
Lê uma linha inteira |
Também existem métodos que permitem verificar o próximo token na entrada sem realmente buscá-lo (para saber qual método usar para lê-lo).
Método | Descrição |
---|---|
|
Existe um byte ? A entrada pode ser convertida em byte ? |
|
Existe um short ? A entrada pode ser convertida em short ? |
|
Existe um int ? A entrada pode ser convertida em int ? |
|
Existe um long ? A entrada pode ser convertida em long ? |
|
Existe um float ? A entrada pode ser convertida em float ? |
|
Existe um double ? A entrada pode ser convertida em double ? |
|
Existe um boolean ? A entrada pode ser convertida em boolean ? |
|
Existe outro símbolo? |
|
Existe outra linha? |
7. Lendo dados de uma string
Mencionamos anteriormente que a Scanner
classe pode ler dados de várias fontes. Uma dessas fontes é uma string de texto .
Parece algo assim:
String str = "text";
Scanner scanner = new Scanner(str);
Ao criar o Scanner
objeto, passamos a string str
em vez do System.in
objeto. E agora o scanner
objeto irá ler os dados da string. Exemplo:
Código do programa: | Explicação: |
---|---|
|
// a == 10;
// b == 20;
A saída da tela será: |
GO TO FULL VERSION