Почему нажатие любого ключевого метода не останавливается в цикле? [Дубликат]

Пробовал подключиться к удаленному кластеру kafka с моей локальной машины.

У VM было 1 внутреннее (9.0.0.1 и внешнее ip (192.1.1.1), я мог бы ssh только внутреннему & amp; не внешнему, изменения в моем файле conifg / server.properties

// предоставить ip в машине, когда u делает ifconfig или hostname -I

listeners=PLAINTEXT://192.1.1.1:9092

// дает ip-потребителю и производителю connect

advertised.listeners=PLAINTEXT://9.0.0.1:9092  
0
задан IvansAlvares 3 March 2019 в 23:45
поделиться

1 ответ

Стандартная консольная Java просто не может этого сделать. Все вводимые символы буферизуются до тех пор, пока вы не нажмете Enter, и в этот момент все они доступны на System.in.

Итак, если вы зациклите свой код «нажмите любую клавишу», скажем, 5 раз, и я наберу предложение «привет!», Ваш код все еще застревает на первом, ожидая нажатия клавиши. Если я затем нажму Enter, все 5 циклов завершатся немедленно, и если вы вызовете waitForKey позже, он мгновенно вернется еще 2–3 раза (один раз для восклицательного знака и один раз для новой строки ... дважды, если в Windows потому что их переводы строки 2 символа).

TL; DR: Вы не можете использовать System.in.read() для этого. На всех.

Одно из решений состоит в том, чтобы попросить пользователя не нажимать клавишу «любая», а нажать клавишу «ввод», а затем использовать, например, вызов сканера next() после установки разделителя на новую строку или написать код, который продолжает вызывать System.in.read(), пока не вернет '\ n':

private void pressEnterToContinue() {
    while (true) {
        int c;
        try {
            c = System.in.read();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        if (c == -1 || c == '\n') return;
    }
}
0
ответ дан rzwitserloot 3 March 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: