如何在不按Enter的情况下从控制台读取单个字符/键?有一个old entry in Sun's bug database声称它不能在纯Java中完成。我发现了这些方法

  • JNI
  • JLine [http://jline.sourceforge.net/]
  • Javacurses [http://sourceforge.net/projects/javacurses/]

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

    最佳答案

    这是一个使用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仍然会杀死该应用程序。)

    09-26 05:53