Java 读取前,冲洗/清除System.in(标准输入)

Java 读取前,冲洗/清除System.in(标准输入),java,linux,stdin,keyboard-events,Java,Linux,Stdin,Keyboard Events,在工作中,我们有5个RFID阅读器连接到运行Linux的PC上。读卡器都被识别为键盘,并将其输入(从芯片读取的内容)作为键输入事件序列发送。为了能够知道哪个阅读器发送了什么序列,我正在对/dev/input/XX进行原始读取,并以这种方式获取它们的输入 问题是,RFID读卡器生成的发送键盘事件仍然“在”标准输入中,当我尝试从系统中读取时。在通过扫描仪(这次输入应该由普通键盘生成)中,我首先从读卡器获取“挂起”输入(由10个十六进制十进制数字和一个换行符(\n)组成) 现在,问题是:我如何从std

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

问题是,RFID读卡器生成的发送键盘事件仍然“在”标准输入中,当我尝试从
系统中读取时。在
通过
扫描仪
(这次输入应该由普通键盘生成)中,我首先从读卡器获取“挂起”输入(由10个十六进制十进制数字和一个换行符(
\n
)组成)

现在,问题是:我如何从stdin中刷新所有这些“挂起”输入,然后从键盘读取我真正想要的内容

我试过:

System.in.skip(System.in.available());
但是stdin上不允许seek(
skip
抛出一个
IOException

但是
hasNextLine()
永远不会变为
false
(打印永远不会执行)

同上


任何有更多想法的人?

设备通常使用定义良好的协议发送数据,您可以使用该协议解析数据段

如果我是对的,则丢弃未正确格式化的协议数据。这允许您过滤掉不感兴趣的数据


由于我不熟悉您正在使用的RFID扫描仪,我无法提供更多帮助,但这是我的建议。

没有内置的便携式方法来刷新输入流中的数据。如果您知道挂起的数据以
\n
结尾,为什么您在找到它之前不阅读?

根据@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...
    }
}
这将丢弃stdin中已经“挂起”的数据,并等待输入有效数据。在本上下文中,valid表示十进制整数。

这对我来说很有效

System.in.read(new byte[System.in.available()])

您可以使用多个线程来执行此操作

  • 您的实际应用程序从连接到PipedOutStream的PipedInputStream读取数据
  • 您需要有一个线程连续地从
    System.in
    读取数据。只要实际应用程序对来自System.in的数据不感兴趣(由布尔标志指示),此线程将丢弃它读取的所有内容。但是,当实际应用程序设置标志以指示它对来自System.in的数据感兴趣时,此线程会将它读取的所有数据发送到PipeDoutpStream
  • 您的实际应用程序打开该标志以表明它对数据感兴趣,并在不再对数据感兴趣时清除该标志
  • 这样,来自
    系统中的数据总是自动刷新/清除相关数据

    我读了一个双精度,然后需要读一个字符串

    以下各项工作正常:

    double d = scanner.nextDouble();
    scanner.nextLine(); // consumes \n after the above number(int,double,etc.)
    String s = scanner.nextLine();
    
    处理终端(又称控制台)时的最佳实践(我发现)就是一次处理一行i/o。因此理想的做法是将整行用户输入作为字符串,然后按照您认为合适的方式对其进行解析。其他任何操作不仅是特定于实现的,而且容易阻塞

    Scanner sc = new Scanner(System.in);
    String line = "";
    
    while (true) {
        System.out.println("Enter something...");
    
        try {
            line = sc.nextLine();
            //Parse `line` string as you see fit here...
            break;
        } catch (Exception e) {}
    }
    

    我将
    while
    try/catch
    块包括在内,这样提示将无限循环无效输入。

    如果没有输入,则可能会被阻止,因此我怀疑您的print语句从未执行过。这不是一个解决方案,而是观察您的至少一种方法失败的原因。(没有足够的代表进行评论)…这真是太棒了:这对我System.in.read(新字节[System.in.available()])user5466753**起作用了。传入的数据可能是格式化的,我也对它感兴趣,但不是在以后的时间。我怀疑数据仍然在stdio中,因为我从未从stdio中读取它,而是从设备本身读取它。。。
    System.in.read(new byte[System.in.available()])
    
    double d = scanner.nextDouble();
    scanner.nextLine(); // consumes \n after the above number(int,double,etc.)
    String s = scanner.nextLine();
    
    Scanner sc = new Scanner(System.in);
    String line = "";
    
    while (true) {
        System.out.println("Enter something...");
    
        try {
            line = sc.nextLine();
            //Parse `line` string as you see fit here...
            break;
        } catch (Exception e) {}
    }