Existe-t-il un moyen simple de lire un seul caractère de la console lorsque l'utilisateur le saisit en Java? C'est possible? J'ai essayé ces méthodes, mais elles attendent toutes que l'utilisateur appuie sur la touche Entrée :
char tmp = (char) System.in.read();
char tmp = (char) new InputStreamReader(System.in).read ();
char tmp = (char) System.console().reader().read(); // Java 6
Je commence à penser que System.in n'est pas conscient de l'entrée de l'utilisateur jusqu'à ce que vous appuyez sur Entrée .
Vous devez faire passer votre console en mode brut. Il n'y a pas de moyen intégré indépendant de la plate-forme pour y arriver. jCurses pourrait être intéressant, cependant.
Sur un système Unix, cela peut fonctionner:
Par exemple, si vous souhaitez prendre en compte le temps entre les frappes, voici un exemple de code pour y arriver.
la source
stty cooked </dev/tty
doit être exécuté lorsque le programme doit revenir en mode tampon, et définitivement avant la fermeture du programme.Il n'existe aucun moyen portable de lire des caractères bruts à partir d'une console Java.
Certaines solutions de contournement dépendant de la plate-forme ont été présentées ci-dessus. Mais pour être vraiment portable, il faudrait abandonner le mode console et utiliser un mode fenêtrage, par exemple AWT ou Swing.
la source
System.Console.ReadKey
qui fonctionne sur toutes les plates-formes. Java distribue également JVM et JRE pour chaque plate-forme avec des bibliothèques et des implémentations dépendant de la plate-forme, ce n'est donc pas une excuse.J'ai écrit une classe Java RawConsoleInput qui utilise JNA pour appeler les fonctions du système d'exploitation de Windows et Unix / Linux.
_kbhit()
et à_getwch()
partir de msvcrt.dll.tcsetattr()
pour basculer la console en mode non canonique,System.in.available()
pour vérifier si les données sont disponibles etSystem.in.read()
pour lire les octets de la console. ACharsetDecoder
est utilisé pour convertir des octets en caractères.Il prend en charge l'entrée non bloquante et mélange le mode brut et l'entrée en mode ligne normale.
la source
Utilisez jline3 :
Exemple:
la source