Partage
  • Partager sur Facebook
  • Partager sur Twitter

BufferedInputStream et BufferedOutputStream

    19 mars 2019 à 23:13:29

    Bonjour,

    Je souhaiterais obtenir plus de précisions sur le fonctionnement de ces deux classes.

    La classe BufferedInputStream permet donc d'obtenir un buffer qui va stocker le contenu de la source dans la limite de la taille du buffer.

    Je souhaitais savoir à quel moment ce buffer s'initialise et se remplit ? Est-ce à la création de l'objet ? Et ensuite une fois que l'on lit les données, il se remplit à nouveau automatiquement dès qu'il est vide ? Est-ce bien cela ?

    Dans le cas de la classe BufferedOutputStream, j'ai du mal à saisir l'intérêt du buffer et comment il est utilisé.

    En vous remerciant par avance pour les éclaircissements.

    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2019 à 23:33:44

      BufferedOutputStream elle sert par exemple pour ne pas déranger ta disque dure chaque fois lorsque tu envoie une lettre. Il y a une méthode flush() pour envoyer tes données.
      • Partager sur Facebook
      • Partager sur Twitter
        20 mars 2019 à 12:29:34

        Merci pour la réponse, mais je ne saisis toujours pas le principe de fonctionnement de BufferedOutputStream.

        Quand on écrit :

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.txt"));
        
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test2.txt"));
        
        byte[] buf = new byte[8];
        
        while(bis.read(buf) != -1)
        
                bos.write(buf);

        Comment le buffer de BufferedOutputStream fonctionne t-il ? Ici on lit les données d'un fichier texte que l'on écrit directement dans un autre fichier texte à chaque tour de boucle. J'ai donc du mal à comprendre où se situe la différence par rapport à FileOutputStream et pourtant le gain de temps de temps est effectivement bien plus important avec BufferedOutputStream.

        Merci par avance.

        -
        Edité par yoles 20 mars 2019 à 12:31:04

        • Partager sur Facebook
        • Partager sur Twitter
          20 mars 2019 à 20:04:28

          Imagine que pour envoyer une ligne de texte il te faut 10 ms, mais pour envoyer un fichier entier avec 50 lignes, 14 ms. Si tu utilise buffer il n'envoie pas les données chaque tour de boucle, c'est pour ça tu gagne de temps.
          • Partager sur Facebook
          • Partager sur Twitter
            20 mars 2019 à 23:31:32

            Merci, je comprends que sur le read on gagne du temps, puisqu'on lit à partir d'un buffer, mais pour le write c'est plus compliqué à saisir pour moi. Donc ce que t'es en train de me dire c'est que si on fait "bos.write(buf)", les données ne sont pas écrites directement dans le fichier mais dans un buffer ? Dans ce cas à partir de quand sont-elles réellement écrites dans le fichier de sortie ? Y a t-il une sorte de "timeout" au bout duquel les données sont écrites automatiquement dans le fichier à partir du buffer ?

            Merci beaucoup.

            • Partager sur Facebook
            • Partager sur Twitter
              21 mars 2019 à 1:16:58

              Output c'est quand toi envoyer les données vers  un output.
              • Partager sur Facebook
              • Partager sur Twitter
                21 mars 2019 à 20:28:52

                Merci mais ça ne répond pas à ma question. Ma question est de comprendre les étapes qui aboutissent à l'écriture dans un fichier par l'intermédiaire d'un buffer. Je ne pense pas que les données passent directement du buffer au fichier à chaque tour de boucle, sinon je ne comprendrais pas comment il peut y avoir un gain de temps, j'aimerais donc comprendre comment cela se passe et par conséquent comprendre le gain de temps.

                • Partager sur Facebook
                • Partager sur Twitter
                  21 mars 2019 à 21:55:49

                  BufferedInputStream

                  Tu gagnes de temps parce que il ne fais pas chaque fois un appel système de la méthode read() qui est plus lent et il ne lit pas les données byte par byte.

                  BufferedOutputStream

                  Tu gagnes de temps parce que il n'envoie pas les données chaque fois lorsque tu appelles  la méthode write(), il garde les données et les envoie quand tu appelles la méthode flush() ou si tu ferme le Stream.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 mars 2019 à 0:04:57

                    Merci à toi j'ai compris.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    BufferedInputStream et BufferedOutputStream

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown