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 :

[Stream]Méthode read et retour


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut [Stream]Méthode read et retour
    J'ai donc une question par rapport aux flux Java (InputStream ou Reader):


    Par rapport à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read(byte[] b, int off, int len) throws IOException
    Elle renvoie soit le nombre d'octet lu, soit -1 quand la fin du flux est atteint.

    Mais si la fin du flux arrive pendant la lecture du tableau, comment peut - on savoir le nombre de byte qui on été lu dans le flux par la fonction ?

    Parceque la javadoc ne donne que :
    the total number of bytes read into the buffer, or -1 if there is no more data because the end of the file has been reached.

  2. #2
    Membre actif Avatar de bidi
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 262
    Points : 266
    Points
    266
    Par défaut
    bah si tu lis et que tu arrive a la fin ça te renvoie le nombre de byte lu...

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut
    Ok merci

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut
    En fait je reviens vers vous (les altruistes du forum), car je n'ai pas encore totalement compris le fonctionnement de cette fonction read des Reader et InputStream :

    - 1er cas : il y a au moins autant d'octets à lire que la taille du tableau, dans ce cas, la fonction read renvoie ce nombre d'octet.
    - 2ème cas : il y a moins d'octet dans le tableau que d'octet à lire dans ce cas la fonction read renvoi le nombre d'octet lu.

    Maintenant je ne suis pas sur et j'aurais besoin d'une confirmation

    - 3ème cas : On a atteint le but du flux et on renvoie -1.
    - 4ème cas : On a déjà indiqué que l'on était au bout du flux en renvoyant -1, la fonction est alors bloquée jusqu'à ce que des données arrive .

    Pourriez vous ô expert Java :-) me dire si je suis dans le juste ?

  5. #5
    Membre habitué Avatar de Oui-Oui MB
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 127
    Points
    127
    Par défaut
    La fonction read te renvoi -1 si tu es au bout du flux. Tu peux l'appeller autant de fois que tu veux, tu auras toujours -1 si tu es au bout...

    Maintenant, si y a du nouveau dans le flux, et que tu as déja atteint le bout, alors je pense que le flux repoursuivra sa lecture. Mais y a une méthode nommé "available()" qui te renvoi le nombre de byte disponible sur le flux.
    Que la Schtuche soit avec vous !!!

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut
    Ca se précise (dans ma tête), dans ce cas,

    à quel moment cette fonction read est bloquante ?

    Ou existe une fonction dans les flux qui permet de bloquer un thread par exemple sur l'attente de données ?

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par jeje99
    à quel moment cette fonction read est bloquante ?
    La méthode read() se met en attente lorsqu'il n'y a rien à lire dans le flux, mais qu'on n'est pas forcément à la fin du flux. Par exemple :
    • Lorsqu'un fichier est en train d'être lu (ce n'est pas forcément perceptible pour un humain, mais la lecture sur un disque dur est beaucoups plus lente que le traitement des données par le processeur).
    • Lorsqu'on attend des données depuis une socket.
    • Lorsqu'on attend des données depuis une ligne de commande.
    • Plus globalement lorsque les données ne sont pas prêtes à être lu, mais que le flux est toujours valide...



    Le quatrième cas que tu indique est "impossible" :
    Citation Envoyé par jeje99
    - 4ème cas : On a déjà indiqué que l'on était au bout du flux en renvoyant -1, la fonction est alors bloquée jusqu'à ce que des données arrive .
    Si la méthode read() a renvoyé -1 c'est que plus aucune donnée ne pourra arriver par ce flux (fin du fichier, fermeture de la socket, etc...), donc rappeller read() renverra automatiquement -1 (sauf cas particulier où tu peux déplacer le curseur de lecture -- RamdomAccessFile, StringReader...).



    Donc pour résumer, lorsque tu appelles read() :
    • 1) Le flux comporte des données -> Le maximum de données sera lu (selon la taille de ton buffer) et la valeur de retour correspond au nombre d'octet lu.
    • 2) La fin du flux a été atteinte (qui dépend donc du type de flux) et donc il n'y a plus rien à lire, la valeur de retour est -1.
    • 3) Il n'y a pas de données à lire, mais on n'a pas encore atteint la fin du flux. La méthode se met en attente de la reception des données et procède ensuite comme dans le 1).


    a++

  8. #8
    Membre habitué Avatar de Oui-Oui MB
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Avril 2005
    Messages : 111
    Points : 127
    Points
    127
    Par défaut
    La fonction read() est bloquante dans tous les cas. Tant qu'elle n'a pas remplit son buffer ou qu'elle n'a pas atteint la fin du flux, elle reste bloquée. Mais ça ne se voit presque pas...

    [EDIT]

    adiGuba a été plus rapide et plus complet il me semble... :-)
    Que la Schtuche soit avec vous !!!

  9. #9
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut
    Merci bien pour toutes ces infos, comme on dit :
    "je comprend vite mais il faut qu'on m'explique longtemps"

    Et hop je remet le résolu en haut de mon topic

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

Discussions similaires

  1. Colle : Read sans retour à la ligne
    Par Yorel2006 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 15/04/2009, 16h39
  2. read sans retour à la ligne
    Par Alain Defrance dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 04/12/2008, 22h28
  3. [Erreur Stream closed] sur un read de BufferedInputStream
    Par nebule dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 21/06/2007, 08h58
  4. Indy 10 TCPClient - read stream et ligne mélangée....
    Par cmarcx dans le forum Web & réseau
    Réponses: 17
    Dernier message: 20/03/2006, 09h36
  5. [C#] Comment utiliser correctement Stream.Read ?
    Par ArChAnGe76 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/12/2005, 20h48

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