java / clojure中的单字符控制台输入

时间:2010-07-11 23:24:16

标签: java clojure user-input console.readkey

如何从控制台读取单个字符/键而无需按Enter键?有一个old entry in Sun's bug database声称它无法在纯java中完成。我找到了这些方法

我希望在我的类路径中添加一个magic-readkey.jar,并编写几行代码,例如(def just-hit (com.acme.MagicConsole/read-char))

3 个答案:

答案 0 :(得分:11)

这是一个使用JLine的“立即回声”应用程序,它将打印int对应于注册的按键,结构为Leiningen项目:

  1. 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"]])
    
  2. 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)))))
    
  3. 有问题的功能由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-keyget-key-blocking函数可用于读取输入的单个字符。

答案 2 :(得分:1)

如果你想使用jline2,可以使用Transaction类,这与MichałMarczyk上面解释的几乎相同:

ConsoleReader