在工作中,我们有5个RFID读取器连接到运行Linux的PC。读取器都被识别为键盘,并将其输入(从芯片读取的内容)作为键输入事件序列发送。为了能够告诉哪个读者发送什么序列,我正在做一个原始阅读,/dev/input/XX并以此方式获取他们的输入。
/dev/input/XX
问题是,RFID读取器生成的发送键盘事件仍在“ stdin”中,当我尝试System.in通过via 读取Scanner(这次输入应由普通键盘生成)时,我首先得到“待处理” ”来自读者的输入(由10个十六进制小数位和一个换行符(\n)组成)。
System.in
Scanner
\n
现在,问题是: 如何从stdin中清除所有这些“待处理”输入 ,然后从键盘上读取我真正想要的内容?
我试过了:
System.in.skip(System.in.available());
但是在stdin上不允许搜索(skip抛出IOException)。
skip
IOException
for (int i = 0; i < System.in.available(); i++){ System.in.read(); }
但是available()估计不够(此后仍会在stdin中进行填充)。
available()
Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()){ scanner.nextLine(); } System.out.println("Clean!");
但是hasNextLine()永远不会变成false(打印永远不会执行)。
hasNextLine()
false
BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = in.readLine()) != null); System.out.println("Clean!");
同上。
还有其他想法吗?
根据 @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... } }
这将丢弃标准输入中已经“挂起”的数据,并等待直到输入有效数据为止。在这种情况下有效,表示十进制整数。