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