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 :

[Flux] lecture : boucler ou pas ?


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut [Flux] lecture : boucler ou pas ?
    Bonjour,

    Je test la communication entre plusieurs programmes via des sockets. Et je me pose la question de la nécessité de procéder comme suis pour effectuer une lecture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ...
     
    DataInputStream dis = null;
     
    ...
     
    dis = new DataInputStream(serviceSocket.getInputStream());
     
    ...
     
    // code pour la lecture
     
    byte[] tempBytes = new byte[dis.readInt()];    // lit un int qui représente la longueur du message qui suit
    int length = 0;
    while(length < tempBytes.length){
    	length += dis.read(tempBytes, length, tempBytes.length-length);
    }
    String msgRecu = new String(tempBytes, "ISO-8859-1");
    plutot que comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    byte[] tempBytes = new byte[dis.readInt()];    // lit un int qui représente la longueur du message qui suit
    dis.read(tempBytes, 0, tempBytes.length);
    Je me demande si de faire des boucles comme ca est nécessaire ou si ca fait double emploi avec l'implémentaion des flux (haut niveau). Meme question pour l'envoi : Est il judicieux de faire une boucle afin de ne pas envoyer de trop gros message en une fois.

    pour infos le code de l'ecriture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ByteArrayOutputStream baos = null;
    DataOutputStream dos = null;
     
    ...
     
    dos = new DataOutputStream(serviceSocket.getOutputStream());
    baos = new ByteArrayOutputStream();
     
    ....
     
    //code pour l'écriture
     
    String toSend = "CONNECT";
    baos.reset();
    new DataOutputStream(baos).writeInt(toSend.length());
    baos.write(toSend.getBytes("ISO-8859-1"));
    dos.write(baos.toByteArray(), 0, baos.toByteArray().length);
    dos.flush();
    Merci, Fred.

  2. #2
    Membre averti
    Inscrit en
    Août 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 32
    Par défaut
    La question que je me pose, c'est pourquoi tu te demandes si c'est mieux de faire compliqué que simple !
    Si tu as un doute, le mieux est de faire un test rapide en itérant de nombreuses fois le traitement et de mesurer les perfs.
    A mon avis la seconde solution + simple est la + efficace et tu peux même encore simplifier en remplaçant la seconde lecture par :

  3. #3
    ndp
    ndp est déconnecté
    Membre expérimenté Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Par défaut
    salut,
    je vais te donner une autre piste de reflexion: imagine que ton flux de sortie te permette d'envoyer des donnes sur le reseau. En plus de ta "charge utile", tu envois des donnees de routage...

  4. #4
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    Salut Didier 69,
    Ce n'est pas que je veux faire compliquer et je ne recherche pas spécialement une meilleur performence. Mais par exemple si j'envois un très long texte (la bible ) cela ne pose pas non plus de problemes ? C'est une déformation de programmation C ? En fait la boucle de lecture se trouve tel quel dans le cours Java de mon prof qui n'est pas un con alors je me pose vraiment la question de la pertinence de cette boucle.

    Fred.

  5. #5
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    Salut ndp,
    Tu veux dire que c'est les flux qui gerent tout automatiquement et que je ne dois pas me tracasser et regarder si toutes les données envoyées sont bien recues.

    Fred.

  6. #6
    Membre averti
    Inscrit en
    Août 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 32
    Par défaut
    Oups, autant pour moi, je n'avais pas bien vu où était ton problème.
    La bonne solution est effectivement la première puisque tu ne vas pas forcément obtenir le max que tu demandes à lire : cf. javadoc DataInputStream. read :
    An attempt is made to read as many as len bytes, but a smaller number may be read, possibly zero
    Pour info, si tu veux systématiquement convertir tous tes byte[] en String avec CharSet spécifique, tu peux utiliser l'option -Dfile.encoding=charsetName ou faire un
    System.setProperty("file.encoding", charsetName);
    en début de programme.

  7. #7
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    Ok merci beaucoup pour ces explications .
    Dis, tu ne saurais pas m'éclairer à propos du l'écriture ? Faut il aussi prevoir une boucle si on veux écrire un très gros texte ? Apparement pas d'apres ce que je comprends dans les javadocs.

    Fred.

  8. #8
    Membre averti
    Inscrit en
    Août 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 32
    Par défaut
    En fait tout dépend si l'écriture est bloquante ou non.
    Et tu peux surement te baser également sur la signature de la méthode : si elle retourne le nb d'octets écrits, c'est que l'écriture peut ne pas se faire d'un seul coup, sinon c'est très probablement bloquant donc une écriture suffit.

  9. #9
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    DataOutputStream :

    void write(byte[] b, int off, int len)
    Donc normalement c'est bloquant ?

    Je pense aussi au Timeout de ma socket, ca peux poser des problèmes (si par exemple une TimeoutException est lancée pendant l'écriture (je ne sais meme pas si c'est possible ...))?

  10. #10
    Membre averti
    Inscrit en
    Août 2003
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 32
    Par défaut
    Je pense donc que oui.
    Et selon la javadoc, la seule exception que tu peux avoir est une IOException, donc tu n'as que ces cas à prévoir.

  11. #11
    Membre averti
    Inscrit en
    Septembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 25
    Par défaut
    ok merci pour tout ces eclaircissements.

    Fred.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/02/2015, 15h55
  2. Comment fusionner deux flux qui n'ont pas le meme shéma
    Par zerocoolyoussef dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 20/03/2009, 18h35
  3. Flux RSS qui met pas l'heure correctement
    Par jojo15320 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/08/2007, 11h21
  4. [Java][Socket] Pas de lecture de flux
    Par mavina dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 20/10/2006, 19h02
  5. Un edit control en lecture seule mais pas avec un fond gris?
    Par Magus (Dave) dans le forum Windows
    Réponses: 2
    Dernier message: 04/12/2005, 21h58

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