Caractère unique d'entrée de la console java/clojure
-
13-09-2020 - |
Question
Comment puis-je lire un seul caractère/la clé de la console sans avoir à taper Entrée?Il y a un ancienne entrée dans le Soleil de la base de données de bogues en prétendant qu'elle ne peut pas être fait en java pur.J'ai trouvé ces approches
- JNI
- JLine [http://jline.sourceforge.net/]
- Javacurses [http://sourceforge.net/projects/javacurses/]
Je m'attends à ajouter un seul magic-readkey.jar
à mon classpath, et d'écrire quelques lignes de code, comme (def just-hit (com.acme.MagicConsole/read-char))
.
La solution
Voici un "écho immédiat" de l'app à l'aide de JLine qui permet d'imprimer int
s correspondant à un régime enregistré d'appuis sur les touches, structuré comme un Leiningen projet:
project.clj
:(defproject con "1.0.0-SNAPSHOT" :description "FIXME: write" :main con.core :dependencies [[org.clojure/clojure "1.1.0"] [org.clojure/clojure-contrib "1.1.0"] [jline "0.9.94"]])
src/con/core.clj
:(ns con.core (:import jline.Terminal) (:gen-class)) (defn -main [& args] (let [term (Terminal/getTerminal)] (while true (println (.readCharacter term System/in)))))
La fonctionnalité en question est fourni par le jline.Terminal
de la classe, qui fournit une méthode statique getTerminal
retourner une instance de la plate-forme sous-classe spécifique qui peut être utilisé pour interagir avec le terminal.Voir la Javadoc pour plus de détails.
Voyons ce que asdf
ressemble...
$ java -jar con-1.0.0-SNAPSHOT-standalone.jar
97
115
100
102
(C-c tue encore l'application, bien sûr.)
Autres conseils
Pour n'importe qui qui peut être la lecture de cet en 2015 et au-delà, notez que les versions plus récentes de JLine n'ont plus la méthode Terminal/getTerminal
.Je suis sûr qu'il y en est une autre (peut-être mieux) façon de le faire maintenant avec JLine2, mais vous pouvez toujours l'utiliser jline "0.9.94"
et l'on a accepté de répondre à fonctionnera toujours, au moins jusqu'à Clojure 1.6 (de la note, vous n'avez plus besoin d'exiger clojure.contrib
).
Comme une alternative, je vous recommande l'excellent clojure-lanterna, qui est un Clojure wrapper autour de la Java Lanterna de la bibliothèque.Comme vous pouvez le voir dans les docs, il y a get-key
et get-key-blocking
les fonctions de la lecture dans de simples caractères de l'entrée.
Si vous souhaitez utiliser jline2 il y a un ConsoleReader
classe disponible, ce qui fait à peu près la même chose Michał Marczyk expliqué ci-dessus:
(ns con.core
(:import jline.console.ConsoleReader)
(:gen-class))
(defn -main [& args]
(while true (->> (ConsoleReader.) (.readCharacter) (println))))