如何从控制台读取单个字符/键而无需按Enter键?有一个old entry in Sun's bug database声称它无法在纯java中完成。我找到了这些方法
我希望在我的类路径中添加一个magic-readkey.jar
,并编写几行代码,例如(def just-hit (com.acme.MagicConsole/read-char))
。
答案 0 :(得分:11)
这是一个使用JLine的“立即回声”应用程序,它将打印int
对应于注册的按键,结构为Leiningen项目:
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)))))
有问题的功能由jline.Terminal
类提供,它提供了一个静态方法getTerminal
,返回特定于平台的子类的实例,可用于与终端进行交互。有关详细信息,请参阅Javadoc。
让我们看看asdf
的样子......
$ java -jar con-1.0.0-SNAPSHOT-standalone.jar
97
115
100
102
( C-c 当然仍会杀死该应用。)
答案 1 :(得分:4)
对于可能在2015年及以后阅读此内容的任何人,请注意更新版本的JLine不再使用方法Terminal/getTerminal
。我确定现在有另一种(可能更好的)方法可以使用JLine2,但你可以随时使用jline "0.9.94"
并且接受的答案仍然可以使用,至少可以使用Clojure 1.6(注意,您不再需要clojure.contrib
)。
作为替代方案,我建议使用优秀的clojure-lanterna,它是围绕Java Lanterna库的Clojure包装器。正如您在the docs中所看到的,有get-key
和get-key-blocking
函数可用于读取输入的单个字符。
答案 2 :(得分:1)
如果你想使用jline2,可以使用Transaction
类,这与MichałMarczyk上面解释的几乎相同:
ConsoleReader