Czy istnieje łatwy sposób na odczytanie pojedynczego znaku z konsoli, gdy użytkownik wpisuje go w Javie? Czy to możliwe? Próbowałem z tymi metodami, ale wszystkie czekają, aż użytkownik naciśnie klawisz Enter :
char tmp = (char) System.in.read();
char tmp = (char) new InputStreamReader(System.in).read ();
char tmp = (char) System.console().reader().read(); // Java 6
Zaczynam myśleć, że System.in nie jest świadomy danych wejściowych użytkownika, dopóki nie zostanie naciśnięty klawisz Enter .
Musisz przełączyć konsolę do trybu surowego. Nie ma wbudowanego niezależnego od platformy sposobu, aby się tam dostać. jCurses może być jednak interesujące.
W systemie Unix może to zadziałać:
Na przykład, jeśli chcesz wziąć pod uwagę czas między naciśnięciami klawiszy, oto przykładowy kod, aby się tam dostać.
źródło
stty cooked </dev/tty
należy to uruchomić, gdy program musi powrócić do trybu buforowanego, a na pewno przed zakończeniem programu.Nie ma przenośnego sposobu odczytywania surowych znaków z konsoli Java.
Niektóre obejścia zależne od platformy zostały przedstawione powyżej. Ale aby być naprawdę przenośnym, musiałbyś porzucić tryb konsoli i użyć trybu okienkowego, np. AWT lub Swing.
źródło
System.Console.ReadKey
co działa na wszystkich platformach. Java dystrybuuje również JVM i JRE dla każdej platformy z bibliotekami i implementacjami zależnymi od platformy, więc to nie jest wymówka.Napisałem klasę RawConsoleInput w Javie, która używa JNA do wywoływania funkcji systemu operacyjnego Windows i Unix / Linux.
_kbhit()
i_getwch()
z msvcrt.dll.tcsetattr()
systemie Unix używa do przełączania konsoli w tryb niekanoniczny,System.in.available()
do sprawdzania, czy dane są dostępne iSystem.in.read()
do odczytu bajtów z konsoli. ACharsetDecoder
służy do konwersji bajtów na znaki.Obsługuje nieblokujące wejście i miksowanie trybu surowego i normalnego wejścia w trybie liniowym.
źródło
Użyj jline3 :
Przykład:
źródło