2

職場では、Linux を実行している PC に 5 つの RFID リーダーが接続されています。リーダーはすべてキーボードとして認識され、入力 (チップから読み取ったもの) をキー入力イベント シーケンスとして送信します。どのリーダーがどのシーケンスを送信したかを判別できるようにするために、raw-read over/dev/input/XXを実行して、この方法で入力を取得しています。

System.inこれに関する問題は、RFID リーダーによって生成されたキーボード イベントの送信がまだ "in" stdin にScannerあることです。 " リーダーからの入力 (10 桁の 16 進数と改行 ( \n) で構成されます)。

さて、問題は次のとおりです。これらの「保留中の」入力を標準入力からすべてフラッシュし、キーボードから本当に必要なものを読み取るにはどうすればよいですか?

私は試した:

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

しかし、シークは stdin では許可されていません (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!");

同上。

もっとアイデアがある人はいますか?

4

8 に答える 8

3

これは私のために働いた

System.in.read(new byte[System.in.available()])
于 2015-10-20T10:47:24.207 に答える
1

入力ストリーム内のデータをフラッシュする組み込みのポータブルな方法はありません。保留中のデータが で終わることがわかっている場合は、\n見つかるまで読みませんか?

于 2013-08-16T13:29:33.643 に答える
0

通常、デバイスは、データ セグメントの解析に使用できる明確に定義されたプロトコルを使用してデータを送信します。

私が正しければ、プロトコルに対して適切にフォーマットされていないデータを破棄してください。これにより、関心のないデータを除外できます。

私はあなたが使用している RFID スキャナーに詳しくないので、これ以上の助けにはなりませんが、これが私の提案です。

于 2013-08-16T12:54:58.420 に答える
0

複数のスレッドでこれを行うことができます。

  1. 実際のアプリケーションは、PipedOutputStream に接続されている PipedInputStream から読み取ります
  2. System.in1 つのスレッドを継続的に読み取る必要があります。実際のアプリケーションが System.in (ブール値フラグで示される) からのデータに関心がない限り、このスレッドは読み取ったものをすべて破棄します。しかし、実際のアプリケーションが System.in からのデータに関心があることを示すフラグを設定すると、このスレッドは読み取ったすべてのデータを PipedOutputStream に送信します。
  3. 実際のアプリケーションは、データに関心があることを示すためにフラグをオンにし、データに関心がなくなったときにフラグをクリアします。

このようにして、からのデータSystem.inは常に自動的にフラッシュ/クリアされます

于 2016-01-28T03:18:37.543 に答える
0

端末(別名、コンソール) を扱うときのベスト プラクティス (私が見つけた)は、一度に i/oa 回線を処理することです。したがって、理想的な方法は、ユーザー入力の行全体を string として取得し、適切に解析することです。それ以外は、実装固有であるだけでなく、ブロックされる傾向があります。

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無効な入力時にプロンプ​​トが無限にループするようにします。

于 2019-02-21T01:52:43.377 に答える