Cela peut paraître désinvolte, mais PrintStream
imprime dans un OutputStream
y PrintWriter
imprime dans un Writer
. Ok, je ne pense pas que je vais obtenir des points pour avoir énoncé l'évidence. Mais il y a plus.
Alors, quelle est la différence entre un OutputStream
et un Writer
? Les deux sont des flux, la différence principale étant une OutputStream
est un flux d'octets tandis qu'un 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 l'encodage par défaut de la plate-forme. L'utilisation de l'encodage par défaut est généralement une mauvaise chose car elle peut entraîner des bogues lors du passage d'une plateforme à une autre, surtout si vous générez le fichier sur une plateforme et le consommez sur une autre.
Avec un Writer
vous spécifiez généralement le codage à utiliser, en évitant toute dépendance vis-à-vis de la plate-forme.
Pourquoi s'embêter à avoir un PrintStream
dans le JDK, puisque l'intention première est d'écrire des caractères, et non des octets ? PrintStream
est antérieure au JDK 1.1, lorsque les flux de caractères Reader/Writer ont été introduits. J'imagine que Sun aurait déprécié PrintStream
ne serait-ce que pour le fait qu'il est si largement utilisé. (Après tout, vous ne voudriez pas que chaque appel à System.out
pour générer un avertissement d'API obsolète ! De même, la modification du type de PrintStream
a PrintWriter
sur les flux de sortie standard aurait cassé les applications existantes).
3 votes
+1 Bonne question, je mélange aussi ces deux classes, et la doc API ne m'aide pas beaucoup non plus.
2 votes
Une autre différence est le fonctionnement de l'autoflush. Pour un écrivain, la présence d'un \n dans la sortie déclenche flush(). Mais dans un flux d'octets (PrintStream) il n'y a que des octets. autoflush fonctionne alors comme décrit dans la Javadoc, basé sur : "la notion propre à la plateforme de séparateur de ligne plutôt que le caractère de nouvelle ligne".