Quelle est la différence entre PrintStream
et PrintWriter
? Ils ont de nombreuses méthodes en commun en raison desquelles je mélange souvent ces deux classes. De plus, je pense que nous pouvons les utiliser pour exactement les mêmes choses. Mais il doit y avoir une différence, sinon, il n'y aurait eu qu'une classe.
J'ai cherché dans les archives, mais n'ai pas trouvé cette question.
Cela peut sembler désinvolte, mais PrintStream
s'imprime sur un OutputStream
et PrintWriter
s'imprime sur un Writer
. Ok, je doute d’obtenir des points pour avoir énoncé une évidence. Mais il y a plus.
Alors, quelle est la différence entre un OutputStream
et un Writer
? Les deux sont des flux, la principale différence étant que OutputStream
est un flux d'octets, tandis que Writer
est un flux de caractères.
Si un OutputStream
traite des octets, qu'en est-il de PrintStream.print(String)
? Il convertit les caractères en octets en utilisant le codage de plate-forme par défaut. L'utilisation de l'encodage par défaut est généralement une mauvaise chose car elle peut entraîner des problèmes lors du déplacement d'une plate-forme à une autre, en particulier si vous générez le fichier sur une plate-forme et le consommez sur une autre.
Avec Writer
, vous spécifiez généralement le codage à utiliser, évitant ainsi les dépendances de la plate-forme.
Pourquoi avoir la peine d'avoir PrintStream
dans le JDK, puisque le but principal est d'écrire des caractères, et non des octets? PrintStream
est antérieur à JDK 1.1 lorsque les flux de caractères Reader/Writer ont été introduits. J'imagine que Sun aurait déprécié PrintStream
si seulement il était si largement utilisé. (Après tout, vous ne voudriez pas que chaque appel à System.out
pour générer un avertissement déconseillé pour les API! En outre, changer le type de PrintStream
en PrintWriter
sur les flux de sortie standard aurait endommagé les applications existantes.)
Avec le PrintStream
, vous êtes bloqué au codage par défaut de la plateforme.
PrintStream stream = new PrintStream(output);
Avec le PrintWriter
vous pouvez cependant passer un OutputStreamWriter
avec un encodage spécifique.
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
L’avantage est que vous pouvez contrôler le codage des caractères. Les caractères doivent être écrits de telle sorte qu’ils ne finissent pas par devenir mojibake .
Depuis JDK 1.4, il est possible de spécifier le codage de caractères pour un flux d'impression. Ainsi, les différences entre PrintStream et PrintWriter ne concernent que le comportement de vidage automatique et qu’un PrintStream ne peut pas envelopper un Writer.
Les graveurs tels que PrintWriter sont destinés à la sortie texte, les flux à la sortie binaire. Les rédacteurs gèrent les jeux de caractères pour vous. Les flux ne le font pas, car on suppose que vous ne voulez pas ce type de conversion, ce qui gâcherait vos données binaires et utiliserait un scripteur si vous le vouliez.
Vous pouvez écrire des octets bruts dans un flux et non dans un écrivain. Le PrintWriter javadoc répertorie les autres différences (plus important encore, être capable de définir un codage sur un flux afin qu'il puisse interpréter les octets bruts, je dirais).
de noyau Java par Horstmann
Les vétérans de Java pourraient se demander ce qui est arrivé à la classe PrintStream et à System.out. Dans Java 1.0, la classe PrintStream a simplement tronqué tous les caractères Unicode en ASCII caractères en supprimant l’octet supérieur. (À l’époque, Unicode était encore un code 16). codage en bits.) Il est clair que ce n'était pas une approche propre ou portable, et il a été corrigé avec l'introduction de lecteurs et d'écrivains dans Java 1.1. Pour la compatibilité avec le code existant, System.in, System Les fichiers .out et System.err sont toujours des flux d'entrée/sortie, et non des lecteurs et des rédacteurs, mais la classe PrintStream convertit en interne les caractères Unicode en codage d'hôte par défaut de la même manière que le permet PrintWriter. lorsque vous utilisez les méthodes print et println, mais contrairement aux imprimeurs, elles vous permettent de générer des octets bruts avec les méthodes write (int) et write (byte []).