Как дождаться нажатия клавиши в 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".