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.outobjeto 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.inobjeto, 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. Scannerclasse

A Scannerclasse (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.inobjeto 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 Scannerobjeto seria algo como isto:

Código Explicação
Scanner console = new Scanner(System.in);
String name = console.nextLine();
int age = console.nextInt();
Criamos um Scannerobjeto.
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 Scannerclasse:

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 Scannerobjeto

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";
Declarando e inicializando uma variável de string

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);
Declarando e inicializando uma Scannervariável

Tudo à esquerda do sinal de igual é a declaração de uma variável nomeada consolecujo tipo é Scanner. Em vez disso, você poderia chamá-lo s de ou scannerou 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 newpalavra-chave) cujo tipo seja Scanner , passando o System.inobjeto como fonte de dados para o Scannerobjeto recém-criado.

Após executar toda esta linha, teremos uma Scannervariável nomeada console que nosso programa utilizará para ler os dados do teclado.


4. Lista de métodos

No exemplo acima, nossa Scanner consolevariável armazena uma referência a um Scannerobjeto.

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);
Chamando um método em um objeto referenciado por uma variável

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();
Chamando um método sem passar argumentos

Exemplo:

System.out.println();

5. Entrada do console

Quando temos um Scannerobjeto, é 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 numbervariá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 doublenú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);
   }
}
Observação

O usuário pode inserir vários números em uma única linha, separando-os com espaços: os métodos da Scannerclasse 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 Scannerclasse

A propósito, os métodos acima não são tudo o que a Scannerclasse tem a oferecer. A lista completa de métodos é mais ou menos assim:

Método Descrição
nextByte()
Lê os dados e os converte em umbyte
nextShort()
Lê os dados e os converte em umshort
nextInt()
Lê os dados e os converte em umint
nextLong()
Lê os dados e os converte em umlong
nextFloat()
Lê os dados e os converte em umfloat
nextDouble()
Lê os dados e os converte em umdouble
nextBoolean()
Lê os dados e os converte em umboolean
next()
Lê um "token". Os tokens são separados por espaços ou pressionamentos da tecla enter
nextLine()
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
hasNextByte()
Existe um byte? A entrada pode ser convertida em byte?
hasNextShort()
Existe um short? A entrada pode ser convertida em short?
hasNextInt()
Existe um int? A entrada pode ser convertida em int?
hasNextLong()
Existe um long? A entrada pode ser convertida em long?
hasNextFloat()
Existe um float? A entrada pode ser convertida em float?
hasNextDouble()
Existe um double? A entrada pode ser convertida em double?
hasNextBoolean()
Existe um boolean? A entrada pode ser convertida em boolean?
hasNext()
Existe outro símbolo?
hasNextLine()
Existe outra linha?

7. Lendo dados de uma string

Mencionamos anteriormente que a Scannerclasse 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 Scannerobjeto, passamos a string strem vez do System.inobjeto. E agora o scannerobjeto irá ler os dados da string. Exemplo:

Código do programa: Explicação:
import java.util.Scanner;
public class Solution {
   public static void main(String[] args)
   {
      String str = "10 20 40 60";
      Scanner scanner = new Scanner(str);
      int a = scanner.nextInt();
      int b = scanner.nextInt();

      System.out.println(a + b);
   }
}


// a == 10; 
// b == 20; 
A saída da tela será:30