2010-07-11 24 views
6

¿Cómo puedo leer un solo caracter/clave de la consola sin tener que presionar Entrar? Hay un old entry in Sun's bug database que dice que no se puede hacer en Java puro. He encontrado estos enfoquesEntrada de consola de un solo carácter en java/clojure

yo esperaría a añadir una sola magic-readkey.jar a mi ruta de clases, y para escribir unas pocas líneas de código, como (def just-hit (com.acme.MagicConsole/read-char)).

Respuesta

11

Aquí hay una aplicación "eco inmediato" usando JLine que imprimirá int s que corresponde a las pulsaciones de teclas registradas, estructurado como un proyecto 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))))) 
    

La funcionalidad en cuestión se proporciona por la clase jline.Terminal, que proporciona un método estático getTerminal devolver una instancia de una subclase específica de la plataforma que se puede utilizar para interactuar con el terminal. Vea el Javadoc para más detalles.

Veamos lo que parece ... asdf

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

(Cc sigue matando a la aplicación, por supuesto.)

+0

cómo es esta respuesta aceptada? jline todavía requiere ingresar clave ... – Enerccio

+0

Si prueba el código anterior, encontrará que de hecho funciona sin ingresar/regresar. (Verificado ahora en una caja de Ubuntu con openjdk-8-jdk. Parece que clojure-contrib 1.1.0 ya no está disponible desde Central, pero puede simplemente eliminarlo y las cosas seguirán funcionando; las versiones de dependencia no están actualizadas porque esta respuesta se remonta a 2010.) –

+0

No estoy seguro, pero mi Termina.readCharacter simplemente lee desde System.in y aún necesita esperar para ingresar – Enerccio

1

Si desea utilizar jline2 hay una clase ConsoleReader disponible que hace más o menos lo mismo Michał Marczyk explicado anteriormente:

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


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