Pergunta

Como ler um dado a partir do teclado em aplicações de console?

Resposta

A leitura de dados a partir do teclado em aplicações de console não é uma tarefa confortável dado que as operações de entrada disponíveis são orientadas a byte, isto é, efetuam a leitura de caractere a caractere exigindo por parte do programador tratamento para a obtenção de valores inteiros, reais ou strings.

A leitura de um valor inteiro pode ser realizada como abaixo:

int valorInteiro;
try {
  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  String s = br.readLine();
  valorInteiro = Integer.parseInt(s);
} catch (Exception e) {
  valorInteiro = 0;
}

Podemos notar que a stream padrão System.in tem seus dados intermediados por outro tipo de stream, java.io.BufferedReader, que permite a leitura de cadeias de carateres finalizadas por um "enter". A string obtida é convertida num inteiro. Modificando-se a conversão pode-se realizar a leitura de outros tipos de valores a partir do teclado.

Sugere-se que tais métodos sejam declarados como estáticos e colocados dentro de uma classe para re-utilização em outros programas, tal como sugerido abaixo:

// Console.java

import java.io.*;

public final class Console {

  public static double readDouble() {
    try {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      String s = br.readLine();
      Double d = new Double(s);
      return d.doubleValue();
    } catch (IOException e) {
      return 0;
    } catch (NumberFormatException e) {
      return 0;
    }
  }

  public static int readInteger() {
    try {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      String s = br.readLine();
      return Integer.parseInt(s);
    } catch (IOException e) {
      return 0;
    } catch (NumberFormatException e) {
      return 0;
    }
  }

  public static String readString() {
    try {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      String s = br.readLine();
      return s;
    } catch (IOException e) {
      return "";
    }
  }
}

Desta forma um programa Java qualquer pode utilizar-se dos métodos estáticos fornecidos por esta classe Console como exemplificado abaixo:

// ConsoleTest.java

public class ConsoleTest {

  public static void main(String args[]){
    System.out.print("Forneca um numero real: ");
    double x = Console.readDouble();
    System.out.println("Numero Fornecido: " + x);

    System.out.print("Forneca um numero inteiro: ");
    int y = Console.readInteger();
    System.out.println("Numero Fornecido: " + y);

    System.out.print("Forneca uma string: ");
    String s = Console.readString();
    System.out.println("String Fornecida: " + s);
  }
}

A classe Console deve estar presente no mesmo diretório que a aplicação que for utilizá-la, podendo ser convertida num package para permitir maior facilidade de uso e compartilhamento com outras aplicações. Veja como transformar uma classe num package no JavaFAQ 0052.