2010-12-18 20 views
10

我想在用户按下某个按键时跳出循环。如何等待Clojure中的按键操作

在C我会使用kbhit()。是否有Clojure(或Java)等价物?

+1

你使用什么样的应用程序?控制台,Swing,servlets? – ffriend 2010-12-18 21:11:49

+0

只是从一个控制台REPL使用swank或其他。 – justinhj 2010-12-19 03:09:52

+1

开始新的线程('agent','future','Thread'或其他你所用的任何东西),它会进行实际的处理,保存线程变量,从'main'读取输入,当它不是空的时候,停止你的专用线程。如果你只是在玩REPL,[this](http://www.objectcommando.com/blog/2010/06/10/clojure-futures/)将完全覆盖你的需求。 – ffriend 2010-12-19 04:02:46

回答

2

您正在寻找在Java中的(Linux?)控制台中按键的非阻塞处理。一个earlier question建议两个可能启用此功能的Java库。如果它不需要便携,则有一个解决方案here

基本上,

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

作品,但(在Linux上)只有在按“回归”之后,因为在控制台输入流缓冲和由操作系统决定。这意味着你无法通过使用频道或任何其他NIO类来克服该问题。要确保控制台刷新每个字符,您需要修改终端设置。我曾经写过一个C程序来完成这项工作(修改当前终端的termios结构的ICANON标志),但我不知道如何从Java执行此操作(但请参阅the second link)。

一般来说,您可以在searching的'java非阻塞输入'中找到更多。