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