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

avec Java Discussion :

FileInputStream,BufferedInputStream et tampon


Sujet :

avec Java

  1. #1
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut FileInputStream,BufferedInputStream et tampon
    Bonjour,

    je cherche à comprendre la notion de tampon utilisé par les classes FileInputStream et BufferedInputStream.

    En effet, la classe FileInputStream propose une surchage de la méthode read() qui permet de prendre en compte la taille d'un tampon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    in = new FileInputStream(this.inFileName);	
     
     byte[] byteBuffer = new byte[bufferSizeB];   	
     int c = in.read(byteBuffer);	  
     while (c != -1) { out.write(byteBuffer, 0, c);  c = in.read(byteBuffer); }
    A côté de cela, un constructeur de la classe BufferedInputStream(InputStream in, int size) prends aussi en charge un tampon. Es-ce le même que celui de la méthode read() ? Sinon, quelle différence entre les deux ?

    Enfin, on peut encapsuler un FileInputStream dans un BufferedInputStream.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bin = new BufferedInputStream(new FileInputStream(this.inFileName), sizeBuffer);
    Quels rôles jouent alors le(s?) tampons (?) Peut-être qu'une réponse aux questions précédente résolvera celle-ci !

    Merci de vos lumières
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Tous les InputStream ont des méthodes read(byte[]) et read(byte[], int, int) qui permettent de lire des octets par lots, plutôt que un par un. Autrement dit, quand on peut lire les données dans un tampon, tous les InputStream permettent de le faire.

    Mais, supposons que tu veuilles écrire un parseur de fichiers CSV, par exemple.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    truc;chose;machin
    chouette;bidule;truc

    Tu as besoin de le lire ligne par ligne, donc de le lire jusqu'à rencontrer une fin de ligne. Une fin de ligne, c'est un caractère \n. Ou bien deux caractères \r\n. Ou bien un caractère \r. Mais attention, ça ne compte que s'ils ne font pas entourés de quotes " et " :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    truc;bidule;"ceci ne compte
    que pour une ""entree"", pas deux";chouette

    Donc il faut maintenir un état des caractères rencontrés.

    Donc le flux doit être analysé caractère par caractère, et non pas par lots : deux tampons qui se suivent ne se suivent sans doute pas là où ça t'arrange, ils se suivent n'importe où, en général en plein milieu d'une ligne, où un " a peut-être été commencé et peut-être pas.
    Tu dois t'abstraire de l'existence des tampons, faire comme s'ils n'existaient pas. Traiter un octet à la fois. Autrement dit, appeler read() un octet à la fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(int ch = stream.read(); ch >= 0; ch = stream.read()) {
      if(ch == '"') {
        // traiter un quote
      } else if(ch == '\r') {
        // traiter un retour chariot
      } // ...
    }
    Mais, cela n'est pas du tout efficace : faire des IOs un caractère à la fois, c'est monstrueusement long, c'est d'ailleurs pour ça qu'on utilise des tampons.

    BufferedInputStream sert à ça : il fait les IOs par lots et les stocke dans son propre buffer. Quand quelqu'un l'appelle pour lire un octet à la fois, il lui donne un octet de son tampon. Quand il n'en a plus, il fait une IO pour remplir son tampon.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Ok thevin, merci pour ces explications.
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

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

Discussions similaires

  1. [Console] Tampon de sortie et endl
    Par Évariste Galois dans le forum C++
    Réponses: 18
    Dernier message: 09/07/2005, 17h48
  2. [BufferedInputStream] Détecter la fin du stream
    Par pmartin8 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 02/06/2005, 15h57
  3. Erreur: tampon de réponse dépassée
    Par vinze11 dans le forum ASP
    Réponses: 6
    Dernier message: 18/11/2004, 09h38
  4. [FileInputStream] readObject
    Par schousso dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 27/05/2004, 15h21
  5. [TP]vider le tampon clavier
    Par kael kael dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 11/01/2003, 22h19

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