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 :

De la bonne utilisation d'un input stream.


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut De la bonne utilisation d'un input stream.
    Bonjour,

    Je lis un flux de donné envoyé en streaming par le réseaux(protocole non définie, mais ca devrait pas changer grand chose je pense).
    Je créé donc le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       BufferedInputStream bis = new BufferedInputStream(url.openStream());
       byte[] tabDonnee = new byte[188];
       int nbDonneeLu;
       nbDonneeLu = bis.read(tabDonnee);
    Je pensais qu'en utilisant la fonction read de cette façon, j'allais forcément lire mes 188 bytes (soit la taille d'un des packets que je veux récupérer). Mais queneni ! Si jamais le buffer ne contient pas encore les 188 bytes, au lieu d'attendre d'être de les contenir, il va renvoyer uniquement ce qui existe.

    Après réflexion, je me dis que c'est pas si aberrant que ca que l'inputstream n'attende pas d'avoir 188. Par contre je ne comprend pas comment cela se fait que des packets de seulement quelques bytes puissent être envoyé sur ce flux ...

    Il me faut donc pouvoir lire exactement 188 bytes à chaque fois, tout en gardant une sorte de timeout au cas ou le flux soit fermé.
    Je pourrais faire comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    while(bis.avaible() < 188 || timer < 30s) {
    ...
    }
    Bon le "timer<30s" c'est pour simplifier hein ^^.

    Je voulais donc savoir si :
    J'ai raté un truc important dés le début ?
    Ma solution convient ?
    Il existe déjà un objet java appliquant ca ?

  2. #2
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Tes conclusions sont juste, read bloque jusqu'à ce que quelque chose soit disponible, sinon il retourne ce qu'il a sous la main.

    En fait tu as plusieurs cas possibles...
    Visiblement tu souhaiteras utiliser cette variante :

    int read(byte[] b, int off, int len)

    au sein d'une boucle, à chaque iteration, tu dois controler combien cette méthodes a lu de bytes (c'est ce qu'elle te retourne), et laisser tourner autant de fois que nécessaire.

    Tu peux avoir différent cas :

    -Une exception à cause du timeout socket.
    -Une lecture de n bytes.
    -La fin du flux (retour -1).

    En fait je pourrai te suggérer différentes choses mais je ne sais pas la raison de cette lecture de 188 bytes, ni ce que tu es censé faire avec le reste...

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    En fait j'ai en entré un flux de donné vidéo qui arrive en streaming.
    Je veux effectuer un traitement sur chacun des packets. Donc je lis un par un tous les packets du flux et effectue le traitement dessus (bon en réalité ils sont stocké puis traité par un thread mais ca revient au même ^^).

    Alors en pratique, ca me semble très peu probable que je puisse lire dans le buffer du flux flux alors qu'il ne contient pas plus de 188 bytes, mais n'étant pas à l'abris d'un gros ralentissement réseaux, je préfères ne pas prendre de risque.

Discussions similaires

  1. de la bonne utilisation de const
    Par gangsoleil dans le forum C
    Réponses: 2
    Dernier message: 14/09/2005, 15h44
  2. [Singleton] En faire une bonne utilisation
    Par Koubi dans le forum Langage
    Réponses: 6
    Dernier message: 01/09/2005, 17h52
  3. [C#] La bonne utilisation des WinForms (ouverture-Fermeture)
    Par Harry dans le forum Windows Forms
    Réponses: 28
    Dernier message: 03/08/2005, 11h39
  4. La bonne utilisation de TIBTransaction
    Par jibe74 dans le forum Connexion aux bases de données
    Réponses: 15
    Dernier message: 29/01/2005, 16h18
  5. [Tomcat][sleep]De la bonne utilisation du sleep??
    Par Titom dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 11/01/2005, 10h25

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