IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Mélange de données binaires et textuelles en lecture réseau


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Par défaut Mélange de données binaires et textuelles en lecture réseau
    Bonjour à tous !

    Je suis confronté à un problème de lecture depuis un socket. Le protocole est le suivant :
    • Arrivée d'une ligne de texte terminée par un LF et contenant, entres autres, la taille du flux binaire qui va suivre.
    • Immédiatement, le flux binaire.


    La grande majorité du protocole, en dehors des rares cas où j'ai besoin de transférer des données brutes, est textuelle. Donc j'utilise un BufferedReader dans une méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            BufferedReader in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            String answer = null;
            try {
                answer = in.readLine();
            } catch (IOException ex) {
                  // Gestion de l'erreur
            }
    Dans une autre méthode, j'ai donc la lecture du flux binaire, avec un InputStream classique et une boucle. Les deux lectures sont séparées, pour des questions de factorisation de code.

    Sauf que...

    De temps en temps, le BufferedReader absorbe un peu trop d'octets depuis le socket. Je l'ai vérifié en faisant des traces. Ce qui fait que la lecture binaire échoue, puisqu'il manque les premiers octets. Ce sont des JPEG, c'est assez facile à voir.

    J'ai bien essayé d'initialiser le BufferedReader avec une taille de 1, mais je retombe sur le même problème. C'est assez énervant, parce que j'aimerais pouvoir ne pas me passer de cette classe, c'est quand même assez pratique pour le décodage des caractères. Mais je ne vois pas comment lui dire de ne pas bouffer les caractères après un readLine...

    Si vous avez des idées, je suis preneur

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    C'est le principe même du BufferedReader de lire un flux plus grand, afin d'optimiser la lecture et de faire la conversion byte->char.


    Tu dois tout faire via un seul et unique flux...


    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Par défaut
    J'imagine, mais ça ne me fait pas vraiment plaisir, parce que entre l'arrivée du flux texte et du flux binaire, il y a des données métiers que je dois décoder, donc je dois modifier une grande partie du modèle juste pour ce genre de bêtises... Ou bien ne pas utiliser de BufferedReader, au risque de pourrir mes performances

  4. #4
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par hermes1983 Voir le message
    J'imagine, mais ça ne me fait pas vraiment plaisir, parce que entre l'arrivée du flux texte et du flux binaire, il y a des données métiers que je dois décoder, donc je dois modifier une grande partie du modèle juste pour ce genre de bêtises... Ou bien ne pas utiliser de BufferedReader, au risque de pourrir mes performances
    rien ne t'empêche de tout pomper dans le même buffered inputStream

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    rien ne t'empêche de tout pomper dans le même buffered inputStream
    Si, car le reader transforme les données dans l'encodage de la plate-forme (ou en tout cas celui que je lui spécifie), je ne peux donc pas lire de données binaires.

    Extrait de la Javadoc de l'InputStreamReader (classe à la base) :
    To enable the efficient conversion of bytes to characters, more bytes may be read ahead from the underlying stream than are necessary to satisfy the current read operation.
    Donc en fait, c'est mort, je dois passer par autre chose. Peut-être les NIO, mais je sens que ça ne va pas m'arranger ça...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 22
    Par défaut
    Réponse, pour fermer cette discussion.

    Je suis donc passé aux NIO, c'était plus ou moins indispensable, en utilisant un ByteBuffer, un CharsetDecoder, et en décodant les octets un par un. Il suffit d'en mettre plein dans le ByteBuffer, et une fois que j'ai atteint mon séparateur, de garder le contenu de ce buffer dans un attribut, et de le réutiliser lors de la lecture binaire.

  7. #7
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par hermes1983 Voir le message
    Si, car le reader transforme les données dans l'encodage de la plate-forme (ou en tout cas celui que je lui spécifie), je ne peux donc pas lire de données binaires.

    Extrait de la Javadoc de l'InputStreamReader (classe à la base) :


    Donc en fait, c'est mort, je dois passer par autre chose. Peut-être les NIO, mais je sens que ça ne va pas m'arranger ça...
    ce n'est pas ce que j'ai dit! BufferedInputStream n'est pas un BufferedReader!
    tu n'as pas besoin de filtrer avec un inputStreamReader pour repérer ta ligne et ensuite la retransformer en chaine....

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    BufferedReader.readLine() retourne la chaine se trouvant avant '\r'(CR), '\n' (LF) en ignorant ces 2 derniers
    Sachant qu'un char = 1 ou 2 bytes selon l'encodage par défaut de ta plateforme (en utilisant InputStreamReader sans encodage).
    Le plus simple c'est de lire byte par byte jusqu'au LF après tu lit la taille du buffer que tu veux.
    A++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture de registres et données binaires
    Par Mariquiqui dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 11/09/2009, 16h32
  2. [MySQL] lecture de données binaires dans une BDD
    Par Sion_Sempai dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/03/2006, 12h18
  3. Manipulation de données binaires
    Par Defre87 dans le forum Général Python
    Réponses: 3
    Dernier message: 28/09/2005, 16h16
  4. Problème avec les données binaire
    Par Lachessis dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/08/2005, 17h38
  5. Données ASCII et données binaires
    Par chourmo dans le forum Langage
    Réponses: 2
    Dernier message: 20/06/2005, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo