Điều này có thể nghe có vẻ thiếu sót, nhưng PrintStreamin ra OutputStreamvà PrintWriterin thành a Writer. Ok, tôi nghi ngờ tôi sẽ nhận được bất kỳ điểm nào cho thấy rõ ràng. Nhưng còn nhiều hơn thế.
Vậy, sự khác biệt giữa an OutputStreamvà a là Writergì? Cả hai đều là luồng, với sự khác biệt chính là a OutputStreamlà luồng byte trong khi a Writerlà luồng ký tự.
Nếu một OutputStreamgiao dịch với byte, thì PrintStream.print(String)sao? Nó chuyển đổi ký tự thành byte bằng cách sử dụng mã hóa nền tảng mặc định. Sử dụng mã hóa mặc định nói chung là một điều tồi tệ vì nó có thể dẫn đến lỗi khi chuyển từ nền tảng này sang nền tảng khác, đặc biệt nếu bạn đang tạo tệp trên một nền tảng và tiêu thụ nó trên nền tảng khác.
Với a Writer, bạn thường chỉ định mã hóa để sử dụng, tránh mọi phụ thuộc nền tảng.
Tại sao phải có một PrintStreamJDK, vì mục đích chính là viết các ký tự chứ không phải byte? PrintStreamcó trước JDK 1.1 khi các luồng ký tự Reader / Writer được giới thiệu. Tôi tưởng tượng Sun sẽ không dùng nữa PrintStreamnếu chỉ vì nó được sử dụng rộng rãi như vậy. (Rốt cuộc, bạn sẽ không muốn mỗi cuộc gọi System.outtạo cảnh báo API không dùng nữa! Ngoài ra, việc thay đổi loại từ PrintStreamsang PrintWriterluồng đầu ra tiêu chuẩn sẽ phá vỡ các ứng dụng hiện có.)