Performance: BufferedOutputStream vs FileWriter
J'ai toujours utilisé un FileWriter
pour écrire du texte dans un fichier en Java. Apparemment, vous pouvez également utiliser un BufferedOutputStream
. Après lecture de la documentation javadoc attentivement, je ne peux pas me dire qui était est plus rapide/plus efficace.
Alors je vous le demande: est-il un différentiel de performance (même minime) entre ces deux e/S de fichier méthodes? Si oui, quels sont-ils et pourquoi? Si non, pourquoi sont-ils effectivement la même chose?
Sont là des scénarios où l'on est privilégié par rapport à l'autre? Merci à l'avance!
OriginalL'auteur | 2013-07-08
Vous devez vous connecter pour publier un commentaire.
Si vous voulez vraiment comparer un
FileWriter
avec unBufferedOutputStream
d'écrire un fichier texte, ce dernier devrait être plus rapide, car il y a moins d'opérations d'e/S.FileWriter
, chaque appel à une méthode d'écriture sera conservée à la fois (sans tampon).BufferedOutputStream
, les données seront écrites sur le disque, si le tampon est plein (ou le tampon est vidé explicitement à l'aide de laflush
méthode).Mais si vous écrivez des fichiers texte, vous devez utiliser un
Writer
; dans ce cas, on peut comparer uneFileWriter
avec unBufferedWriter
:Regardant
et
vous avez la même situation en ce qui concerne le nombre d'opérations d'e/S.
Un
FileWriter
utilise unFileOutputStream
en interne. La raison d'utiliser unFileWriter
est qu'il utilise automatiquement le codage de caractères par défaut, lorsque vous écrivez dans un fichier (Java interne de la chaîne est encodé en UTF-8 par exemple). Si vous utilisez unOutputStream
, vous devez coder manuellement à chaque écriture:Donc cet exemple pour un
BufferedWriter
:correspond à celle de l'exemple pour un
BufferedOutputStream
:si votre encodage par défaut est
utf-8
.Un
OutputStream
traite (raw) octets alors qu'unWriter
traite (texte) caractères.OriginalL'auteur Beryllium
Un
FileWriter
écrit texte à fichiers, tandis qu'unBufferedOutputStream
est titulaire d'un tampon de données binaires arbitraires dans la mémoire avant de les écrire sur un autre flux binaire que vous avez à offrir. Ils ne font pas la même chose à tous, afin de comparer leur performance à un sens.En général, de mise en mémoire tampon améliore le débit, mais ajoute de la latence. Dans le cas de fichiers, vous pouvez produire plus de sortie par seconde parce que vous pouvez transférer de gros blocs de disque à la fois, de sorte que les frais généraux par octet est plus faible. D'autre part, tandis que les données sont mises en mémoire tampon, c'est de ne pas être écrites sur le disque, de sorte qu'il faut plus de temps pour tout octet pour être écrits sur le disque.
Dans le cas de
FileWriter
, il a déjà une mémoire tampon interne qui aide à l'encodage des caractères en octets. En ajoutant plus de mise en mémoire tampon a probablement que peu de valeur.BufferedOutputStream
?!? Cet article semble penser le contraire. Si cet article est vrai, alors, bien queFileWriter
etBufferedOutputStream
peut être prévu pour 2 utilisations différentes, c'est possible (et donc le point de ma question) afin de comparer leurs performances lors de l'écriture du texte dans un fichier.Encore une fois, des choses très intéressantes @Joni! Selon ce DONC, la question il semble possible de surcharger la mémoire tampon interne qui
FileWriter
utilise. J'aimerais essayer, si rien d'autre, pour mon propre amusement. Pour la vie de moi je ne peux pas comprendre comment configurer unOutputStreamWriter
et unFileOutputStream
et de les injecter dans unFileWriter
constructeur - des idées? Et où aurais-je spécifier la nouvelle taille de la mémoire tampon? Merci encore pour toute l'aide que jusqu'à présent!Comme vous pouvez le voir dans l'article, afin d'écrire du texte avec un
BufferedOutputStream
ils ont d'abord convertir n'importe quel texte en octets manuellement, par calinggetBytes
, ce qui est gênant et crée un tableau d'octets qui vont dans les ordures immédiatementFileWriter
est en fait une sous-classe deOutputStreamWriter
truquées, de sorte qu'il ne peut écrire dans unFileOutputStream
, donc si vous voulez personnaliser une partie de la propriété, vous pouvez simplement créer unOutputStreamWriter
connecté à unFileOutputStream
. Il n'y a pas moyen de changer la taille du tampon interne. La valeur par défaut de la mémoire tampon de 8 ko est probablement assez grand pour la plupart des applications.OriginalL'auteur Joni