Existe uma maneira fácil de ler um único caractere no console enquanto o usuário o digita em Java? É possível? Eu tentei com esses métodos, mas todos eles esperam que o usuário pressione Enter tecla :
char tmp = (char) System.in.read();
char tmp = (char) new InputStreamReader(System.in).read ();
char tmp = (char) System.console().reader().read(); // Java 6
Estou começando a pensar que System.in não está ciente da entrada do usuário até que enter seja pressionado.
Você precisa colocar seu console em modo bruto. Não existe uma maneira independente de plataforma integrada de chegar lá. jCurses pode ser interessante, no entanto.
Em um sistema Unix, isso pode funcionar:
Por exemplo, se você quiser levar em consideração o tempo entre os pressionamentos de tecla, aqui está o código de exemplo para chegar lá.
fonte
stty cooked </dev/tty
deve ser executado quando o programa precisar reverter para o modo de buffer e, definitivamente, antes de encerrar o programa.Não há uma maneira portátil de ler caracteres brutos de um console Java.
Algumas soluções alternativas dependentes da plataforma foram apresentadas acima. Mas para ser realmente portátil, você teria que abandonar o modo console e usar um modo de janela, por exemplo, AWT ou Swing.
fonte
System.Console.ReadKey
que funciona em todas as plataformas. Java também distribui JVM e JRE para todas as plataformas com bibliotecas e implementações dependentes da plataforma, então isso não é desculpa.Eu escrevi uma classe Java RawConsoleInput que usa JNA para chamar funções do sistema operacional do Windows e Unix / Linux.
_kbhit()
e_getwch()
de msvcrt.dll.tcsetattr()
para mudar o console para o modo não canônico,System.in.available()
para verificar se os dados estão disponíveis eSystem.in.read()
para ler bytes do console. ACharsetDecoder
é usado para converter bytes em caracteres.Ele suporta entrada sem bloqueio e modo de mixagem bruto e entrada de modo de linha normal.
fonte
Use jline3 :
Exemplo:
fonte