Gibt es eine einfache Möglichkeit, ein einzelnes Zeichen von der Konsole zu lesen, während der Benutzer es in Java eingibt? Ist es möglich? Ich habe es mit diesen Methoden versucht, aber alle warten darauf, dass der Benutzer die Eingabetaste drückt :
char tmp = (char) System.in.read();
char tmp = (char) new InputStreamReader(System.in).read ();
char tmp = (char) System.console().reader().read(); // Java 6
Ich fange an zu glauben , dass System.in keine Kenntnis von der Benutzereingabe , bis Eingabe gedrückt wird.
Sie müssen Ihre Konsole in den Raw-Modus versetzen. Es gibt keine integrierte plattformunabhängige Möglichkeit, dorthin zu gelangen. jCurses könnte jedoch interessant sein.
Auf einem Unix-System könnte dies funktionieren:
Wenn Sie beispielsweise die Zeit zwischen den Tastenanschlägen berücksichtigen möchten, finden Sie hier einen Beispielcode, um dorthin zu gelangen.
quelle
stty cooked </dev/tty
sollte, wenn das Programm in den gepufferten Modus zurückkehren muss und definitiv bevor das Programm beendet wird.Es gibt keine tragbare Möglichkeit, Rohzeichen von einer Java-Konsole zu lesen.
Einige plattformabhängige Problemumgehungen wurden oben vorgestellt. Aber um wirklich portabel zu sein, müssten Sie den Konsolenmodus verlassen und einen Fenstermodus verwenden, z. B. AWT oder Swing.
quelle
System.Console.ReadKey
was auf allen Plattformen funktioniert. Java verteilt auch JVM und JRE für jede Plattform mit plattformabhängigen Bibliotheken und Implementierungen. Das ist also keine Entschuldigung.Ich habe eine Java-Klasse RawConsoleInput geschrieben , die JNA verwendet , um Betriebssystemfunktionen von Windows und Unix / Linux aufzurufen.
_kbhit()
und_getwch()
von msvcrt.dll verwendet.tcsetattr()
die Konsole in den nicht-kanonischen Modus geschaltet, umSystem.in.available()
zu überprüfen, ob Daten verfügbar sind, undSystem.in.read()
um Bytes von der Konsole zu lesen. ACharsetDecoder
wird verwendet, um Bytes in Zeichen umzuwandeln.Es unterstützt den nicht blockierenden Eingang und das Mischen des Raw-Modus und des normalen Line-Modus-Eingangs.
quelle
Verwenden Sie jline3 :
Beispiel:
quelle