Escrever no System.in

7 respostas
D

Olá a todos.

Gostaria de saber se é possível escrever no buffer do System.in .

Não sei se este é o melhor método de expor o que eu estou precisando.
No entanto, de um modo bem objetivo, o que eu preciso fazer é o seguinte:

// System.in.write(10); // não funciona int num = System.in.read(); // retorna 10 imediatamente (sem ler o teclado)Será que alguém pode me ajudar?

Um abraço e agradeço qualquer ajuda.

Atenciosamente,

7 Respostas

ViniGodoy

O que exatamente você quer fazer?

B

Como o nome mesmo diz, System.in é somente para entrada, leituras. Escrever nele não é possível.

E segundo, a leitura padrão do System.in é diretamente do teclado, via console. E essa leitura só acontece quando algo é digitado.

Se você quer que ele retorne o valor 10 em byte, alguem terá que digitar o caracter que corresponda a 10 na tabela de caracteres. Não há nada automático.

D

Obrigado pela resposta de vocês.

Bom, quando digitamos no teclado, o conteúdo digitado vai para um buffer de entrada que, por sua vez, é lido através do System.in.read().

Exemplificando, são três passos:
Leitura do Teclado > Armazenamento no Buffer > Leitura do Buffer

No entanto, se o buffer já contém dados, a leitura de teclado não é feita e apenas o conteúdo do buffer é lido.

Analisando isso tudo, é importante notar que existe uma distância entre o que é digitado e o que é, de fato, lido.
No fundo, o que eu preciso é escrever nesse buffer. Deste modo eu ativo um comportamento esperado que fará com que a chamada System.in.read() não solicite que o usuário digite algo pelo teclado e retorne o que eu armazenei no buffer.

Por incrível que pareça, ainda estou convicto que há um meio de fazer isso.
Continuo no aguardo de qualquer tipo de ajuda e, agradeço antecipadamente.

gomesrod

Na verdade seria melhor você colocar o efeito prático que espera, ou seja, qual o problema que precisa resolver, com certeza o pessoal vai indicar boas alternativas. Já que dessa maneira (in.write) infelizmente não vai dar mesmo.

D

Infelizmente não existe alternativa que seja aplicável para mim além dessa.

Faz muito tempo, mas, pelo que eu lembro, eu que já fiz algo parecido com isso.
O problema é que eu não usava Java, era C++ e interagia diretamente com APIs do Sistema Operacional (se eu não me engano era algo relativo a função CreatePipe da API do Windows).

Com relação ao meu problema, a saber, o fato é que existem classes que recebem a entrada de dados via System.in.
Eu estou criando uma outra classe que interage com estas e preciso de um método de entrar os dados nelas sem precisar alterá-las.

Não sei se ajuda, mas é parecido com o que se faz neste link: http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx
Você cria um subprocesso estabelecendo quem será a entrada e quem será a saída (podendo ser qualquer coisa).

Continuo agradecendo todo tipo de ajuda.

gomesrod

Como diz algum personagem de filme que eu não lembro, "you always have a choice" :D

No seu caso:

1) Se tiver como alterar essas classes que recebem dados diretamente da System.in, arrume imediatamente!
Que coisa feia!!!
Se (E SOMENTE SE!) não tiver controle sobre essas classes pule para a número 2.

2) Não é possível escrever em um stream de input, mas é possível trocar a System.in por uma entrada mais conveniente que não a da console. Isso é feito pelo método mágico System.setIn():
// Cria um InputStream qualquer:
byte[] inputBytes = { (byte)1, (byte)2, (byte)3 };
java.io.InputStream fakeSystemIn = new java.io.ByteArrayInputStream(inputBytes);

// Substitui a entrada padrão do sistema por este novo Stream
System.setIn(fakeSystemIn);

// E pronto
System.out.println(System.in.read());
System.out.println(System.in.read());
System.out.println(System.in.read());
D

Olá gomesrod.

Isso era exatamente o que eu procurava!

Sabia que o Java teria uma maneira elegante de resolver meu problema.

Muitíssimo obrigado pela sua ajuda e espero poder retribuir algum dia.

Um abraço.

Criado 23 de setembro de 2009
Ultima resposta 24 de set. de 2009
Respostas 7
Participantes 4