web-dev-qa-db-fra.com

Java: Différence entre PrintStream et PrintWriter

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.

121

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.)

125
mdma

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 .

61
BalusC

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.

17
Renan Mozone

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.

3
sblundy

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).

2
Simon Groenewolt

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 []).

1
nichijou