Как ждать нажатия клавиши в Clojure

Я хотел бы выйти из цикла, когда пользователь нажимает клавишу.

В C я бы использовал kbhit(). Есть ли эквивалент Clojure (или Java)?

1 ответ

Вы ищете неблокирующую обработку нажатия клавиши на консоли (Linux?) В Java. В предыдущем вопросе предлагалось две библиотеки Java, которые могли бы включить это. Если он не должен быть переносимым, здесь есть решение.

В принципе,

public class Foo {
  public static void main(String[] args) throws Exception {
    while(System.in.available() == 0) {
       System.out.println("foo");
       Thread.sleep(1000);
    }
  }
}

работает, но (в Linux) только после нажатия 'return', потому что входной поток консоли буферизуется и это решает ОС. Это означает, что вы не можете преодолеть это, используя каналы или любой другой класс NIO. Чтобы консоль сбрасывала каждый символ, вам нужно изменить настройки терминала. Однажды я написал программу на C, которая делает это (изменив флаг ICANON структуры termios текущего терминала), но я не знаю, как это сделать с Java (но см. Вторую ссылку).

В общем, вы можете найти еще кое-что в этом выпуске, выполнив поиск "неблокирующий ввод Java".

Другие вопросы по тегам