java - 读取前刷新/清除 System.in (stdin)

标签 java linux stdin keyboard-events

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

问题是,当我尝试通过 Scanner(这次输入应该由普通键盘生成),我首先从读者那里得到“待定”输入(由10个十六进制数字和一个换行符(\n)组成) .

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

我试过:

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

但是在标准输入上不允许查找(skip 抛出一个 IOException)。

for (int i = 0; i < System.in.available(); i++){
  System.in.read();
}

但是 available() 估计不够(之后仍然在标准输入中)。

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!");

同上。

有人有更多想法吗?

最佳答案

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

这会丢弃标准输入中已经“待定”的数据,并等待输入有效数据。在此上下文中,有效表示十进制整数。

关于java - 读取前刷新/清除 System.in (stdin),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18273751/

相关文章:

java - Jackson ObjectMapper 仅已知接口(interface)

java - 调用扩展 JButton 类中的方法时找不到符号错误

python - 如何由 super 用户运行 celery worker ?

c - stdin 在第一行之后到达 EOF

c - 当我有类似 "executable < example_file"或“cat xyz | 可执行文件?”时如何检查不正确的标准输入?

java - Autowiring 优先级

C 代码中的 Java 数组

linux - 如何在hadoop中根据出生时间 move 文件

c++ - 在 Linux 下使用连字符或下划线作为文件的单词分隔符

c - 这是 realloc() 的正确用法吗?