Односимвольный консольный ввод в java / clojure - PullRequest
6 голосов
/ 12 июля 2010

Как я могу прочитать один символ / клавишу с консоли, не нажимая Enter? Существует старая запись в базе данных ошибок Sun , утверждающая, что это не может быть сделано на чистой Java. Я нашел эти подходы

Я бы хотел добавить один magic-readkey.jar в мой путь к классам и написать несколько строк кода, например (def just-hit (com.acme.MagicConsole/read-char)).

Ответы [ 3 ]

11 голосов
/ 12 июля 2010

Вот приложение "немедленное эхо", использующее JLine, которое будет печатать int s, соответствующие зарегистрированным нажатиям клавиш, структурированным как 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)))))
    

Соответствующая функциональность обеспечивается классом jline.Terminal, который предоставляет статический метод getTerminal, возвращающий экземпляр специфичного для платформы подкласса, который можно использовать для взаимодействия с терминалом. См. Javadoc для получения более подробной информации.

Посмотрим, как выглядит asdf ...

$ java -jar con-1.0.0-SNAPSHOT-standalone.jar 
97
115
100
102

( C-c все еще убивает приложение, конечно.)

4 голосов
/ 09 апреля 2015

Для тех, кто может читать это в 2015 году и далее, обратите внимание, что в более поздних версиях JLine больше не используется метод Terminal/getTerminal. Я уверен, что есть другой (возможно, лучший) способ сделать это сейчас с JLine2, но вы всегда можете просто использовать jline "0.9.94", и принятый ответ будет работать, по крайней мере, до Clojure 1.6 (примечание, вам больше не нужно требовать clojure.contrib).

В качестве альтернативы я бы порекомендовал отличную clojure-lanterna , которая является оболочкой Clojure для библиотеки Java Lanterna . Как вы можете видеть в документах , есть функции get-key и get-key-blocking для чтения в виде одиночных символов ввода.

1 голос
/ 19 ноября 2015

Если вы хотите использовать jline2, есть класс ConsoleReader, который делает то же самое, что объяснил Михал Марчик выше:

(ns con.core
  (:import jline.console.ConsoleReader)
  (:gen-class))


(defn -main [& args]
  (while true (->> (ConsoleReader.) (.readCharacter) (println))))
...