web-dev-qa-db-fra.com

Comment lire un seul caractère depuis la console dans Java (comme l'utilisateur le tape))?

Existe-t-il un moyen simple de lire un seul caractère depuis la console, car l'utilisateur le tape en Java? C'est possible? J'ai essayé avec ces méthodes, mais ils attendent tous 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 la saisie de l'utilisateur tant que vous n'avez pas appuyé sur entrée.

100
victor hugo

Ce que vous voulez faire est de mettre la console en mode "brut" (modification de ligne ignorée et aucune clé d’entrée requise) par opposition au mode "cuit" (modification de ligne avec la touche entrée requise). Sur les systèmes UNIX, la commande 'stty' peut changer de mode.

Maintenant, en ce qui concerne Java ... voir Entrée de console non bloquante dans Python et Java . Extrait:

Si votre programme doit être basé sur une console, vous devez passer votre terminal hors du mode ligne en mode caractère et n'oubliez pas de le restaurer avant la fermeture de votre programme. Il n'y a pas de moyen portable de le faire sur tous les systèmes d'exploitation.

Une des suggestions est d'utiliser JNI. Encore une fois, ce n'est pas très portable. Une autre suggestion à la fin du fil, et en commun avec le post ci-dessus, consiste à utiliser jCurses .

57
Chris W. Rea

Vous devez assommer votre console en mode brut. Il n'y a pas de moyen intégré, indépendant de la plate-forme, d'y arriver. jCurses pourrait être intéressant, cependant.

Sur un système Unix, cela pourrait fonctionner:

String[] cmd = {"/bin/sh", "-c", "stty raw </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();

Par exemple, si vous souhaitez prendre en compte le temps entre les frappes, voici un exemple de code pour y arriver.

23
nes1983

Il n’existe aucun moyen portable de lire les caractères bruts d’une console Java.

Certaines solutions de contournement dépendantes de la plate-forme ont été présentées ci-dessus. Mais pour être vraiment portable, vous devez abandonner le mode console et utiliser un mode fenêtrage, par exemple. AWT ou Swing.

14
rustyx

J'ai écrit un Java classe RawConsoleInput qui utilise JNA pour appeler les fonctions du système d'exploitation de Windows et Unix/Linux.

  • Sous Windows, il utilise _kbhit() et _getwch() à partir de msvcrt.dll.
  • Sous Unix, il utilise tcsetattr() pour passer la console en mode non canonique, System.in.available() pour vérifier si des données sont disponibles et System.in.read() pour lire des octets à partir de la console. Un CharsetDecoder est utilisé pour convertir des octets en caractères.

Il prend en charge les entrées non bloquantes et le mélange en mode brut et en mode ligne normal.

13

Utilisez jline :

Exemple:

Terminal terminal = TerminalBuilder.builder()
    .jna(true)
    .system(true)
    .build();

// raw mode means we get keypresses rather than line buffered input
terminal.enterRawMode();
reader = terminal .reader();
...
int read = reader.read();
....
reader.close();
terminal.close();
6
Pod