Jaka jest różnica między PrintStream
i PrintWriter
? Mają wiele wspólnych metod, dzięki czemu często mieszam te dwie klasy. Co więcej, myślę, że możemy ich używać do dokładnie tych samych celów. Ale musi być różnica, w przeciwnym razie byłaby tylko jedna klasa.
Przeszukałem archiwa, ale nie mogłem znaleźć tego pytania.
java
io
printwriter
printstream
Martijn Courteaux
źródło
źródło
Odpowiedzi:
Może to zabrzmieć nonszalancko, ale
PrintStream
drukuje doOutputStream
iPrintWriter
drukuje doWriter
. 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 aWriter
? Oba są strumieniami, przy czym podstawowa różnica polega na tym, że aOutputStream
to strumień bajtów, a aWriter
to strumień znaków.Jeśli
OutputStream
zajmuje się bajtami, co z tymPrintStream.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łanieSystem.out
wygenerować ostrzeżenie przestarzałej API! Również zmiana typu odPrintStream
celuPrintWriter
na standardowych strumieni wyjściowych złamałby istniejące aplikacje).źródło
PrintStream
nie było ograniczone do używania domyślnego kodowania platformy; istnieją konstruktory, które akceptują nazwę zestawu znaków. W związku z tym rozróżnienie międzyPrintStream
iPrintWriter
polega na tym, że aPrintWriter
nie może zapisywać surowych bajtów, a dwie klasy zawijają różne typy miejsc docelowych.PrintStream
„sprint()
metody są funkcje convenience, które wymagająwrite()
, jako takie wywołują autoflush jeśli włączona.PrintWriter
z drugiej strony nie będzie autoflush po wywołaniuprint()
. Demonstrowałem dzisiaj niektórych początkujących w Javie i to było łapanie uczniów, którzy nie byli zaznajomieni z koniecznością ręcznego spłukiwania. W przeciwnym razie twoja odpowiedź jest świetna.Przy
PrintStream
użyciu domyślnego kodowania platformy.Z
PrintWriter
można jednak zdaćOutputStreamWriter
z kodowaniem konkretnego.Zaletą jest to, że możesz kontrolować kodowanie znaków, które powinny być napisane w taki sposób, aby ostatecznie nie skończyły się jako mojibake .
źródło
PrintStream(OutputStream out, boolean autoFlush, String encoding)
Od wersji JDK 1.4 można określić kodowanie znaków dla PrintStream. Tak więc różnice między PrintStream i PrintWriter dotyczą tylko zachowania automatycznego opróżniania i tego, że PrintStream nie może opakować Writer.
źródło
Programy zapisujące, takie jak PrintWriter, są przeznaczone do wyjścia tekstowego, a strumienie do wyjścia binarnego. Pisarze zajmują się zestawami znaków za Ciebie. Strumienie nie, ponieważ zakłada się, że nie chcesz tego rodzaju konwersji, która zepsułaby twoje dane binarne, a gdybyś to zrobił, używałbyś programu zapisującego.
źródło
Możesz zapisać nieprzetworzone bajty do Stream, a nie do modułu Writer. W PrintWriter listy javadoc pozostałe różnice (co najważniejsze, jest w stanie ustawić kodowanie strumienia, więc można go zinterpretować surowe bajty Powiedziałbym).
źródło
z core Java by Horstmann
źródło
Printwriter to udoskonalenie printstream.
IE printstream do określonego celu.
źródło