Java/clojureでの単一文字コンソール入力
-
13-09-2020 - |
質問
Enterキーを押さずにコンソールから単一の文字/キーを読み取るにはどうすればよいですか?があります。 Sunのバグデータベースの古いエントリ 純粋な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
登録されたキー押下に対応するsは、aとして構成されています ライニンゲン プロジェクト:
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 もちろん、まだアプリを殺します。)
他のヒント
2015年以降にこれを読んでいる可能性がある人のために、より最近のJlineのバージョンがメソッドTerminal/getTerminal
を持っていないことに注意してください。Jline2でこれを行うためのもう1つ(おそらくより良い)方法があると確信していますが、常にjline "0.9.94"
を使用するだけで、承認された回答は少なくともCloJure 1.6までのうちに機能します(注意事項はもう必要ありません。clojure.contrib
)。
代替案として、私は優れた clojure-lanterna をお勧めします。java lanterna ライブラリ。 docs 、読み取りのためのget-key
およびget-key-blocking
関数があります。入力の単一文字で。
JLIN2を使用したい場合は、上で説明したMichałMarczykがほとんど同じことがあるConsoleReader
クラスがあります。
(ns con.core
(:import jline.console.ConsoleReader)
(:gen-class))
(defn -main [& args]
(while true (->> (ConsoleReader.) (.readCharacter) (println))))
.