一尘不染

阅读前冲洗/清除System.in(stdin)

linux

在工作中,我们有5个RFID读取器连接到运行Linux的PC。读取器都被识别为键盘,并将其输入(从芯片读取的内容)作为键输入事件序列发送。为了能够告诉哪个读者发送什么序列,我正在做一个原始阅读,/dev/input/XX并以此方式获取他们的输入。

问题是,RFID读取器生成的发送键盘事件仍在“ stdin”中,当我尝试System.in通过via
读取Scanner(这次输入应由普通键盘生成)时,我首先得到“待处理” ”来自读者的输入(由10个十六进制小数位和一个换行符(\n)组成)。

现在,问题是: 如何从stdin中清除所有这些“待处理”输入 ,然后从键盘上读取我真正想要的内容?

我试过了:

System.in.skip(System.in.available());

但是在stdin上不允许搜索(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!");

同上。

还有其他想法吗?


阅读 392

收藏
2020-06-03

共1个答案

一尘不染

根据 @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...
    }
}

这将丢弃标准输入中已经“挂起”的数据,并等待直到输入有效数据为止。在这种情况下有效,表示十进制整数。

2020-06-03