Flush/Système Clair.dans (stdin) avant de lire
Au travail, nous avons 5 lecteurs RFID attachée à un PC équipé de Linux. Les lecteurs sont tous reconnus comme les claviers et les envoyer leurs commentaires (ce qu'ils ont lu la forme de la Puce) comme une clé d'entrée de séquence d'événements. Pour être en mesure de dire qui de lecteur d'envoyer ce que la séquence, je suis en train de faire un cru lire sur /dev/input/XX
et d'obtenir leurs commentaires de cette façon.
Le problème avec cela est que de l'envoyer clavier-les événements générés par les lecteurs RFID sont toujours "dans" stdin et lorsque je tente de lire à partir de System.in
via Scanner
(entrée doit être généré par un clavier normal cette fois), j'ai d'abord obtenir le "en attente" d'entrée pour le lecteur (qui se compose de 10 Hex-chiffres décimaux et un retour à la ligne (\n
)).
Maintenant, la question est: Comment puis-je vider toutes ces "en attente" d'entrée est à partir de stdin et puis lire ce que j'ai vraiment envie de le clavier?
J'ai essayé:
System.in.skip(System.in.available());
Mais chercher n'est pas autorisée sur stdin (skip
jette un IOException
).
for (int i = 0; i < System.in.available(); i++){
System.in.read();
}
Mais available()
n'a pas d'estimer assez (encore des trucs dans stdin après).
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()){
scanner.nextLine();
}
System.out.println("Clean!");
Mais hasNextLine()
ne devient jamais false
(l'impression de ne jamais s'exécute).
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null);
System.out.println("Clean!");
Même que ci-dessus.
Quelqu'un avec plus d'idées?
Scanner.hasNextLine()
peut bloquer si il n'y a pas d'entrée, alors je soupçonne votre rapport d'impression ne s'exécute jamais pour cette raison. Pas une solution, mais une observation de pourquoi au moins l'un de vos approches a échoué.- (pas assez de rep pour le commentaire)... C'est génial: Cela a fonctionné pour moi Système.dans.lire(new byte[Système.dans.disponible()]) user5466753**
Vous devez vous connecter pour publier un commentaire.
Basé sur @Joni's des conseils, j'ai mis cela ensemble:
Il ignore les données qui sont déjà "en attente" dans stdin et attend jusqu'à ce que des données valides est entré. Valable, dans ce contexte, le sens d'un nombre décimal.
Cela a fonctionné pour moi
Il n'est pas intégré dans le portable de façon à purger les données dans un flux d'entrée. Si vous savez que les données en attente se termine avec
\n
pourquoi n'avez-vous pas lu jusqu'à ce que vous trouver?La plupart des périphériques envoyer des données à l'aide d'un protocole bien défini qui vous pouvez utiliser pour analyser les segments de données.
Si je suis à droite, jeter de données qui n'est pas correctement formaté pour le protocole. Cela vous permet de filtrer les données qui ne vous intéresse pas.
Que je ne suis pas familier avec la RFID scanner que vous utilisez, je ne peux pas être de plus d'aide, mais c'est ce que je suggère.
Vous pouvez le faire avec plusieurs threads.
System.in
en permanence. Tant que l'application n'est pas intéressé par les données provenant du Système.dans (indiqué par un drapeau booléen), ce fil ignore tout ce qu'il lit. Mais quand le real application définit le drapeau pour indiquer qu'il est intéressé par les données provenant du Système.en, puis ce thread envoie toutes les données qu'il lit à la PipedOutputStream.De cette façon, les données de
System.in
est toujours automatiquement supprimées/camenerComplémentaire.
J'ai lu un double, alors nécessaires pour lire une chaîne de caractères.
Ci-dessous fonctionné correctement:
La meilleure pratique (que j'ai trouvé) lors du traitement bornes (aka. la console) est à traiter avec i/o une ligne à la fois. Donc l'idéal chose à faire est de obtenir la totalité de la ligne de saisie de l'utilisateur, comme une chaîne de caractères, puis l'analyser comme bon vous semble. Rien d'autre n'est pas seulement la mise en œuvre spécifique, mais aussi sujettes à de blocage.
- Je inclure le
while
&try/catch
blocs de sorte que l'invite de commandes en boucle à l'infini sur une entrée non valide.