Flush/Clear-System.in (stdin) Lesen, bevor
Bei der Arbeit, wir haben 5 RFID-Leser angeschlossen an einen PC mit Linux. Die Leser sind alle anerkannt, wie Tastaturen und senden Sie Ihre Eingabe (was Sie Lesen, bilden den Chip) als ein key-input-event-Sequenz. Um in der Lage zu sagen, welche reader senden welcher Reihenfolge mache ich eine raw-Lesen über /dev/input/XX
erhalten Ihren Eingang auf diese Weise.
Das problem mit diesem ist, dass das senden von Tastatur-Ereignisse, die durch die RFID-Lesegeräte sind immer noch "in" stdin " und wenn ich versuche zu Lesen, von System.in
über Scanner
(input erzeugt werden sollen, von einer normalen Tastatur mal), bekomme ich als erstes die "pending" - input von den Lesern (die besteht aus 10 Hex-dezimal-Ziffern und ein newline (\n
)).
Nun ist die Frage: "Wie kann ich flush all diese "pending" Eingabe von stdin und dann Lesen, was ich wirklich will von der Tastatur?
Habe ich versucht:
System.in.skip(System.in.available());
Aber suchen, ist nicht erlaubt, auf stdin (skip
wirft ein IOException
).
for (int i = 0; i < System.in.available(); i++){
System.in.read();
}
Aber available()
nicht Schätzung genug (immer noch Sachen in stdin danach).
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()){
scanner.nextLine();
}
System.out.println("Clean!");
Aber hasNextLine()
wird nie false
(der Druck wird nie ausgeführt).
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null);
System.out.println("Clean!");
Gleiche wie oben.
Jeder, der keine Ideen mehr?
Scanner.hasNextLine()
blockieren kann, wenn es keine Eingabe, so dass ich vermute, Ihr print-Anweisung wird nie ausgeführt deshalb. Keine Lösung, aber eine Beobachtung, warum zumindest einer Ihrer Ansätze ist fehlgeschlagen.(nicht genug rep Kommentar)... Das ist genial: Dieser arbeitete für mich System.in.read(new byte[System.in.verfügbar()]) user5466753**
InformationsquelleAutor Lukas Knuth | 2013-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf @Joni's Beratung, ich habe dies zusammen:
Dieser verwirft die Daten, die bereits "in Bearbeitung" in "stdin" und wartet, bis gültige Daten eingegeben werden. Gültig ist in diesem Zusammenhang, also eine Dezimalzahl.
InformationsquelleAutor Lukas Knuth
Dieser arbeitete für mich
InformationsquelleAutor
Gibt es keine built-in tragbaren Weg zu Spülen, die Daten in einem input-stream. Wenn Sie wissen, dass die ausstehenden Daten endet mit
\n
warum gehst du nicht zu Lesen, bis Sie es finden?InformationsquelleAutor Joni
Geräte in der Regel senden von Daten über ein gut definiertes Protokoll, das Sie verwenden können, um zu analysieren, Daten-Segmente.
Wenn ich Recht habe, verwerfen-Daten, die nicht korrekt formatiert sind, für das Protokoll. Dies ermöglicht Ihnen das herausfiltern der Daten, die Sie nicht interessieren.
So, ich bin nicht vertraut mit dem RFID-scanner, die Sie verwenden, kann ich nicht mehr helfen, aber das ist, was ich vorschlagen.
InformationsquelleAutor William Morrison
Könnte man das mit mehreren threads.
System.in
kontinuierlich. Solange die eigentliche Anwendung ist nicht daran interessiert, die Daten aus System.in (gekennzeichnet durch ein boolean-flag), wird dieser thread verwirft alles, was er liest. Aber wenn die Reale Anwendung wird das flag, um anzuzeigen, dass er daran interessiert ist, in die Daten aus System.in, dann ist dieser thread die Daten sendet, dass es liest, um die PipedOutputStream.Diese Weise werden die Daten aus
System.in
wird immer automatisch geleert/cleadInformationsquelleAutor Erwin Bolwidt
Einem verwandten eine.
Lese ich ein Doppel -, dann brauchte zum Lesen eine Zeichenfolge.
Unten richtig geklappt hat:
InformationsquelleAutor Manohar Reddy Poreddy
Die besten Praxis (die ich gefunden habe) beim Umgang mit terminals (aka. die Konsole) ist zu Umgang mit i/o eine Zeile zu einem Zeitpunkt. Also die ideale, was zu tun ist Holen Sie sich die gesamte Linie der Benutzereingabe als string, und dann analysiert werden, wie Sie sehen, passen. Alles andere ist nicht nur die Umsetzung spezifische, aber auch anfällig für Blockierung.
Habe ich auch die
while
&try/catch
Blöcke so, dass die Eingabe in eine Endlosschleife, die auf ungültige Eingabe.InformationsquelleAutor veganaiZe