Może to zabrzmieć nonszalancko, ale PrintStream
drukuje do OutputStream
i PrintWriter
drukuje do Writer
. Ok, wątpię, czy dostanę jakiekolwiek punkty za stwierdzenie oczywistości. Ale to nie wszystko.
Jaka jest więc różnica między OutputStream
a a Writer
? Oba są strumieniami, przy czym podstawowa różnica polega na tym, że a OutputStream
to strumień bajtów, a a Writer
to strumień znaków.
Jeśli OutputStream
zajmuje się bajtami, co z tym PrintStream.print(String)
? Konwertuje znaki na bajty przy użyciu domyślnego kodowania platformy. Używanie domyślnego kodowania jest ogólnie złe, ponieważ może prowadzić do błędów podczas przenoszenia z jednej platformy na drugą, zwłaszcza jeśli generujesz plik na jednej platformie, a konsumujesz go na innej.
Za pomocą Writer
zwykle określasz kodowanie, które ma być używane, unikając wszelkich zależności platformy.
Po co zawracać sobie głowę posiadaniem PrintStream
litery JDK, skoro głównym celem jest zapisywanie znaków, a nie bajtów? PrintStream
poprzedza JDK 1.1, kiedy wprowadzono strumienie znaków programu Reader / Writer. Wyobrażam sobie, że Sun zdezaktualizowałby się, PrintStream
gdyby tylko fakt, że jest tak szeroko stosowany. (Wszakże nie chcesz Każde wywołanie System.out
wygenerować ostrzeżenie przestarzałej API! Również zmiana typu od PrintStream
celu PrintWriter
na standardowych strumieni wyjściowych złamałby istniejące aplikacje).