Może to zabrzmieć nonszalancko, ale PrintStreamdrukuje do OutputStreami PrintWriterdrukuje 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 OutputStreama a Writer? Oba są strumieniami, przy czym podstawowa różnica polega na tym, że a OutputStreamto strumień bajtów, a a Writerto strumień znaków.
Jeśli OutputStreamzajmuje 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ą Writerzwykle określasz kodowanie, które ma być używane, unikając wszelkich zależności platformy.
Po co zawracać sobie głowę posiadaniem PrintStreamlitery JDK, skoro głównym celem jest zapisywanie znaków, a nie bajtów? PrintStreampoprzedza JDK 1.1, kiedy wprowadzono strumienie znaków programu Reader / Writer. Wyobrażam sobie, że Sun zdezaktualizowałby się, PrintStreamgdyby tylko fakt, że jest tak szeroko stosowany. (Wszakże nie chcesz Każde wywołanie System.outwygenerować ostrzeżenie przestarzałej API! Również zmiana typu od PrintStreamcelu PrintWriterna standardowych strumieni wyjściowych złamałby istniejące aplikacje).