Pobierz znak wejściowy z czytnika

Próbuję znaleźć sposób na pobranie danych wejściowych char z klawiatury.

Próbowałem użyć:

Scanner reader = new Scanner(System.in);
char c = reader.nextChar();

Ta metoda nie istnieje.

Próbowałem wziąć c jako String. Jednak nie zawsze zadziałałoby to w każdym przypadku, ponieważ inna metoda, którą wywołuję z mojej metody wymaga char jako wejścia. Dlatego muszę znaleźć sposób, aby jawnie przyjąć znak jako wejście.

Jakaś pomoc?

Rozwiązanie

Mógłbyś wziąć pierwszy znak z Scanner.next:

char c = reader.next().charAt(0);

Aby skonsumować dokładnie jeden znak, mógłbyś użyć:

char c = reader.findInLine(".").charAt(0);

Aby skonsumować ściśle jedną postać można by użyć:

char c = reader.next(".").charAt(0);
Komentarze (12)

Nie ma metody API do uzyskania znaku ze skanera. Powinieneś pobrać String używając scanner.next() i wywołać metodę String.charAt(0) na zwróconym Stringu.

Scanner reader = new Scanner(System.in);
char c = reader.next().charAt(0);

Aby być bezpiecznym z białymi przestrzeniami, możesz również najpierw wywołać trim() na łańcuchu, aby usunąć wszystkie białe przestrzenie.

Scanner reader = new Scanner(System.in);
char c = reader.next().trim().charAt(0);
Komentarze (0)

Do tego problemu można podejść na trzy sposoby:

  • Wywołaj next() na skanerze i wyodrębnij pierwszy znak String (np. charAt(0)) Jeśli chcesz odczytać resztę linii jako znaki, iteruj nad pozostałymi znakami w String. Inne odpowiedzi mają ten kod.

  • Użyj setDelimiter(""), aby ustawić ogranicznik na pusty ciąg. To spowoduje, że next() tokenizuje do łańcuchów, które mają dokładnie jeden znak długości. Więc wtedy możesz powtarzalnie wywołać next().charAt(0) aby iterować znaki. Następnie możesz ustawić ogranicznik na jego oryginalną wartość i wznowić skanowanie w normalny sposób!

  • Użyj API czytnika zamiast API skanera. Metoda Reader.read() dostarcza pojedynczy znak odczytany ze strumienia wejściowego. Na przykład:

    Reader reader = new InputStreamReader(System.in);
    int ch = reader.read();
    if (ch != -1) { // sprawdź czy nie ma EOF
        // mamy znak ...
    }

Kiedy czytasz z konsoli poprzez System.in, dane wejściowe są zazwyczaj buforowane przez system operacyjny i tylko "uwalniane" do aplikacji, kiedy użytkownik wpisze ENTER. Więc jeśli zamierzasz, aby twoja aplikacja reagowała na poszczególne uderzenia w klawiaturę, to nie będzie działać. Musiałbyś zrobić kilka specyficznych dla systemu operacyjnego rzeczy w kodzie natywnym, aby wyłączyć lub obejść buforowanie linii dla konsoli na poziomie systemu operacyjnego.

Odnośnik:

Komentarze (1)