2013-08-16 39 views
1

在工作中,我们将5台RFID阅读器连接到运行Linux的PC上。这些阅读器都被识别为键盘,并将它们的输入(他们从芯片上读取的内容)作为键输入事件序列发送。为了能够告诉哪个读者发送了什么序列,我正在通过/dev/input/XX进行原始读取,并以这种方式得到他们的输入。读取之前冲洗/清除System.in(stdin)

这里的问题是,由RFID阅读器产生的发送键盘事件仍然是“在”标准输入,当我试图通过ScannerSystem.in读取(应该由一个普通的键盘这个时候产生的输入),我首先从读取器(包含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!"); 

同上。

任何有更多想法的人?

+2

['Scanner.hasNextLine()'](http://docs.oracle.com/javase/7/docs/api/ java/util/Scanner.html#hasNextLine%28%29)可能会阻塞如果没有输入,所以我怀疑你的打印语句从来没有执行过这个原因。这不是一个解决方案,而是一个观察你为什么至少有一个方法失败的原因。 –

+0

(没有足够的代表评论)......这是真棒:这个工作对我** System.in.read(新字节[System.in.available()])** ** user5466753的 – JeffBship

回答

3

基于@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... 
    } 
} 

这丢弃已经是数据‘待定’的标准输入和等待,直到输入有效数据。在这种情况下有效,意味着一个十进制整数。

0

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

如果我是对的,丢弃没有正确格式化协议的数据。这可以让你过滤掉你不感兴趣的数据。

因为我不熟悉你使用的RFID扫描仪,我不能提供更多帮助,但这是我的建议。

+0

传入的数据可能是格式化,我也对它感兴趣,但不是在稍后的时间。我怀疑数据仍然在stdio中,因为我从未从stdio获取它,而是从设备本身读取它。 –

1

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

2

这为我工作

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

你可以这样做多线程。

  1. 您的实际应用从连接到PipedOutputStream
  2. 你需要有一个线程System.in连续读取PipedInputStream的一读。只要真正的应用程序对来自System.in的数据不感兴趣(用布尔标志表示),该线程就会丢弃它读取的所有内容。但是当真正的应用程序设置标志来表明它对来自System.in的数据感兴趣时,那么这个线程将所有读取的数据发送到PipedOutputStream。
  3. 真实的应用程序打开的标志,以表明它是感兴趣的数据,并清除标志时,它不再感兴趣的数据。

通过这种方式,从System.in数据总是自动冲洗/ clead