2010-07-13 3 views
1

enter code here Je suis en train de lire un flux à partir d'un périphérique Linux contenant des lettres hexadécimales et délimité par "^ M". Chaque fois que l'appareil est prêt pour plus d'informations, il envoie le caractère ">". Le flux ressemble à ceci:Action BufferedReader Java sur le personnage?

^M^M01 02 F3^M00 01 F3 3E^M>" 

J'ai besoin de détecter le caractère> et d'effectuer une action sur ce caractère. Y a-t-il un moyen de délimiter ">" et de faire lire ce personnage?

Fondamentalement, il ressemble actuellement à ce

01 02 F3 
00 01 F3 3E 

J'ai besoin> pour déclencher une action distincte. Il ne déclenche pas le tampon de lecture si un seul caractère est présent pour une raison quelconque. Je délimite sur^M. J'ai besoin de> faire autre chose.

+0

Etes-vous sûr que c'est deux char séquence '^ M' et pas votre éditeur rendant le caractère de nouvelle ligne en tant que tel? – polygenelubricants

+1

'^ M' est typique pour une nouvelle ligne de Windows qui est tronquée pendant le transfert FTP de Windows vers Linux. Vous devriez en fait transférer le fichier en mode binaire plutôt qu'en mode caractère/ASCII. – BalusC

Répondre

1

C'est tout à fait possible de le faire. J'ai récemment écrit un projet qui lisait l'entrée de plusieurs souris en utilisant une interface très similaire. Les données binaires des souris sont entrées via des E/S de fichiers. Je pense que les E/S mises en mémoire tampon sont inappropriées dans ce cas. Les E/S mises en mémoire tampon essaieront de remplir un tampon pour vous, pour des raisons de performances. Mais il semble que votre application passera le plus clair de son temps à attendre de nouveaux personnages. Si vous ne lisez pas en gros, alors les octets crus lisent InputStream fera l'affaire: ils reviendront immédiatement après que le nombre demandé/attendu d'octets (1 dans votre cas) ait été reçu. Dans votre cas, après avoir lu le caractère >, vous émettez une autre lecture à un octet pour le caractère suivant.

Vous aurez besoin de comprendre ce qu'il faut faire avec les caractères intermédiaires. Une fois que vous avez traité votre > et le caractère suivant, que voulez-vous faire avec les caractères suivants qui ne sont pas >?

Ce que j'ai fait dans mon application était de lire directement des octets uniques à partir d'un InputStream. Cela bloquerait, donc cela devait se faire dans un Thread séparé qui passait le plus clair de son temps à attendre. Quand le premier personnage est entré, j'ai su lire une poignée de plus (comme vous voulez), que je pouvais ensuite traiter. J'ai mis en place une sorte de file d'attente pour transmettre cette information au reste de mon application - vous devrez établir une sorte de synchronisation pour votre communication inter-thread.

EDIT: Plusieurs petites modifications pour clarifier les points. Désolé si cela finit par être source de confusion.