当字符可从System.in
获得字符时,是否有优雅的方式来触发事件?我想避免投票InputStream.available()
。如何异步读取stdin?
回答
你将不得不创建一个单独的线程阻塞读取,直到有东西可用。
如果你不想真的吃掉输入,你必须用内部缓冲区包装它,读入缓冲区,留言,当被问及输入时,从缓冲区返回数据。
你可以解决这个问题是这样的:
InputStream stdin = System.in;
// Create a wrapper (with it's own dedicated read-thread)
MyListenableInputStream listenableInputStream =
new MyListenableInputStream(stdin);
// Update System.in with something more useful.
System.setIn(listenableInputStream);
强大的答案,谢谢。 – 2011-04-30 04:29:56
当然......开始一个阻塞输入的线程,然后在事件方法被调用时调用你的事件方法。
new Thread(){
public void run() {
while(System.in.get()){
}
}.start();
非常一般地讲:
如果你已经有一个事件反应器运行,创建一个线程,并让它在read()
阻塞。当有数据可用时,让该线程排队反应堆处理的事件。如果不能这样做,大多数事件反应器都会提供InvokeLater
或CallLater
方法,供您在事件处理线程中运行一些代码。
通知或调度函数调用后,返回到read()
上的阻塞。
如果你想要的东西优雅,你可以很容易地实现一个ObservableInputStream
它接受被警告数据的可用性Listener
但你必须有内螺纹定期检查数据来实现它,并呼吁听众的情况。
想想一个事实,即流不应该被用作发送小的数据包,但连续的字节流对象,这就是为什么如果是考虑到输入流中的数据没有这种做法只会工作有效地到达太频繁(否则它会继续呼叫收听者随意)。另外,如果有数据到达时,如果有数据到达,并且监听器被警告,则可能需要所有字节(应该放在临时缓冲区中),但是如果有更多数据刚刚到达,您应该决定如何处理(将它与缓冲区放在一起,放入缓冲区并再次呼叫监听器等)
- 1. 从stdin读取
- 2. 如何异步读取文件?
- 3. 如何读取Process.StandardOutput属性异步?
- 4. 如何获得在异步读取中读取的字节数?
- 5. 如何正确读取C中的stdin?
- 6. Perl6:如何读取STDIN原始数据?
- 7. 如何启用atom.io来读取STDIN?
- 8. 如何从yii命令读取stdin
- 9. 如何从stdin读取一行
- 10. 如何让rsync从STDIN读取SRC?
- 11. 读取文件异步
- 12. NSStreamDelegate读取异步数据
- 13. 使用TIdTCPClient异步读取
- 14. 异步读取失败
- 15. 安卓读取USB异步
- 16. 异步套接字读取
- 17. 异步套接字读取
- 18. 如何读取STDIN并将内容写回到Perl中的STDIN?
- 19. 如何从stdin多次读取stdin中的数据
- 20. 如何使用读取功能从终端输入(stdin)读取?
- 21. 异步读取文件 - 异步读取所有文件并查找最大值
- 22. 逐行读取stdin - php
- 23. c等待stdin读取?
- 24. 从stdin反复读取EOF
- 25. 从stdin与monkeyrunner读取
- 26. 无法正确读取STDIN
- 27. 从Stdin读取字符串
- 28. stdin的非阻塞读取?
- 29. Ruby - 从STDIN读取CSV
- 30. 从STDIN读取的脚本
您应该注意System.in是行缓冲的,因此您一次无法读取一个按键。如果你想要一个接口应用程序,你需要一个GUI。 – 2010-11-23 22:37:22