在工作中,我们有5个RFID阅读器连接到运行Linux的个人电脑上。 读者都被识别为键盘,并将它们的input(他们从芯片上读取的内容)作为键input事件序列发送。 为了能够告诉哪个阅读器发送了什么序列,我正在对/dev/input/XX进行原始读取,并以这种方式得到它们的input。
问题在于,由RFID阅读器生成的发送键盘事件仍然是“in”stdin,当我试图通过Scanner从system.in读取(这次input应该由普通键盘生成)时,我首先从读取器(包含十个hex十进制数字和一个换行符( n ))获得“挂起”input。
现在,问题是: 如何从标准input中清除所有这些“未决”input ,然后从键盘读取我真正想要的内容?
我试过了:
C ++控制台键盘事件
不能中断lock.acquire(),而我可以中断time.sleep()
数字键盘事件导致来自GetKeyboardState的卡住键
可以在Shift,Ctrl,Alt或Win键之一中使用其他用途,例如键入文本?
system.in.skip(system.in.available());
但是stdin不允许seek( skip抛出一个IOException )。
for (int i = 0; i < system.in.available(); i++){ system.in.read(); }
但available()不足够估计(之后仍然是stdin的东西)。
Scanner scanner = new Scanner(system.in); while (scanner.hasNextLine()){ scanner.nextLine(); } System.out.println("Clean!");
但hasNextLine()永远不会成为false (打印从不执行)。
BufferedReader in = new BufferedReader(new InputStreamReader(system.in)); String line; while ((line = in.readLine()) != null); System.out.println("Clean!");
同上。
任何人有更多的想法?
发送键盘到应用程序在c#(sendkeys,postmessage,sendmessage都不工作)
如何将键盘事件发送到Windows中的所有types的应用程序?
用linux c shell上的向上箭头显示最后的命令
什么是Win32的虚拟键码0xFF用于和logging的地方?
根据@Joni的建议,我把这些放在一起:
Scanner scanner = new Scanner(system.in); int choice = 0; while (scanner.hasNext()){ if (scanner.hasNextInt()){ choice = scanner.nextInt(); break; } else { scanner.next(); // Just discard this,not interested... } }
这将丢弃标准输入中已经“等待”的数据,并等待输入有效数据。 在这种情况下有效,意味着一个十进制整数。
没有内置的便携式方法来刷新输入流中的数据。 如果您知道未完成的数据以n结尾,为什么不读取,直到找到它?
这对我有效
system.in.read(new byte[system.in.available()])
设备通常使用定义好的协议发送数据,您可以使用该协议来解析数据段。
如果我是正确的,丢弃协议格式不正确的数据。 这可以让你过滤掉你不感兴趣的数据。
由于我不熟悉你使用的RFID扫描仪,我不能有更多的帮助,但这是我的建议。
你可以用多个线程来做到这一点。
您的真实应用程序将从连接到PipedOutputStream的PipedInputStream中读取
您需要连续从system.in读取一个线程。 只要真正的应用程序对来自system.in的数据不感兴趣(由一个布尔标志表示),该线程就会丢弃它读取的所有内容。 但是,当真正的应用程序设置标志来表明它对来自system.in的数据感兴趣时,则该线程将所有读取的数据发送到PipedOutputStream。
您的真实应用程序会打开标志来指示它对数据感兴趣,并在数据不再感兴趣时清除该标志。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。