System.in.read()

Eu gostaria de saber como funciona o método read() do System.in . Notei que o funcionamento dele é diferente do método read() do FileInputStream. Pra falar a verdade é muito curioso até.

Por exemplo, observem o código abaixo:

try { intEntrada = System.in.read(); } catch (Exception e) { System.out.println("Erro Interno:" + e.getMessage()); } charEntrada = (char)intEntrada; texto += charEntrada;

Neste caso a classe irá ficar esperando uma entrada via teclado. Suponha que eu digite PORTALJAVA e pressionei ENTER, a variável texto terá somente o carctere P . Quando encontra o método read() o JAVA fica esperando o ENTER ser pressionado para continuar a execução do resto do código. Até aí tudo bem.

Agora observem isto:

[code]do
{
try {
intEntrada = System.in.read();
}
catch (Exception e)
{
System.out.println("Erro Interno:" + e.getMessage());
}

charEntrada = (char)intEntrada;
texto += charEntrada;
} while (charEntrada != ‘\n’);[/code]

Notem que nada mais é do que o mesmo código anterior mas com um LOOP que só deixa sair quando encontrar a quebra de linha ou nesse caso , o ENTER. Entrando com a mesma string PORTALJAVA, dessa vez o resultado da variável texto no final da execução, será PORTALJAVA. A minha dúvida é : Como o java consegue parar a execução e esperar uma entrada só da primeira vez que ele encontra o read() ??? Como ele sabe que das próximas vezes que encontrar o read() não é para esperar uma entrada e sim para pegar o próximo byte do que já foi digitado ??? Procurei “literatura” sobre isso mas não consegui nada que sanasse essa minha dúvida.

Espero ter sido claro, não é uma dúvida muito fácil de se perguntar como podem ver.

Obrigado

azevedomt,

O método read() é orientado a byte e que retorna um int (existe um read orientado a bloco de bytes também). Quando a execução chega no read a JVM aloca um buffer nativo que começa a coletar pressionamento de teclas. Quando for digitado <Enter>, os dados do buffer nativo são transferidos para a JVM e o primeiro byte digitado é retornado ao usuário e retirado do buffer. Porém se o buffer nativo estiver vazio, o método retorna o int -1.

hipersoft,

Se eu tiver 2 System.in.read() dentro de um mesmo método, no caso preciso ler duas informações do usuário, a JVM coleta o pressionamento de teclas somente no primeiro System.in.read(). Existe alguma configuração propriedade ou método para fazer a JVM para em todos os read() que encontrar ?
Bom… paleativamente, pra sanar isso tive que criar uma classe chamada Entrada, e no constructor dessa classe executo o System.in.read(). Dessa forma crio uma instância dessa minha classe Entrada para cada campo que o usuário precisa preencher.

Obrigado.