在阅读之前清除/清除System.in(stdin)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在阅读之前清除/清除System.in(stdin)相关的知识,希望对你有一定的参考价值。
在工作中,我们有5个RFID阅读器连接到运行Linux的PC上。读者都被认为是键盘,并将他们的输入(他们从芯片中读取的内容)作为键输入事件序列发送。为了能够告诉哪个读者发送了什么序列,我正在对/dev/input/XX
进行原始读取并以这种方式获取输入。
这个问题是,RFID阅读器生成的发送键盘事件仍然是“in”stdin,当我尝试通过System.in
从Scanner
读取时(这次输入应该由普通键盘生成),我首先得到的读者的“待定”输入(由10个十六进制数字和一个换行符(
)组成)。
现在,问题是:如何从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!");
与上述相同。
谁有更多的想法?
基于@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中已“挂起”的数据,并等待直到输入有效数据。在此上下文中,有效意义为十进制整数。
这对我有用
System.in.read(new byte[System.in.available()])
没有内置的可移植方法来刷新输入流中的数据。如果您知道挂起的数据以
结尾,为什么在您找到它之前不阅读?
设备通常使用定义良好的协议发送数据,您可以使用该协议来解析数据段。
如果我是对的,请丢弃未正确格式化协议的数据。这允许您过滤掉您不感兴趣的数据。
由于我不熟悉您使用的RFID扫描仪,我无法提供更多帮助,但这是我的建议。
您可以使用多个线程执行此操作。
- 您的实际应用程序从连接到PipedOutputStream的PipedInputStream读取
- 你需要连续从
System.in
读一个线程。只要真正的应用程序对来自System.in的数据不感兴趣(由布尔标志指示),该线程就会丢弃它读取的所有内容。但是当真正的应用程序设置标志以指示它对来自System.in的数据感兴趣时,该线程将其读取的所有数据发送到PipedOutputStream。 - 您的实际应用程序打开标志以指示它对数据感兴趣,并在数据不再感兴趣时清除该标志。
这样,来自System.in
的数据总是自动刷新/清除
一个相关的。
我读了一个double,然后需要读一个字符串。
以下工作正常:
double d = scanner.nextDouble();
scanner.nextLine(); // consumes
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
块,以便提示将无效循环无效输入。
以上是关于在阅读之前清除/清除System.in(stdin)的主要内容,如果未能解决你的问题,请参考以下文章