Điều này có thể nghe có vẻ thiếu sót, nhưng PrintStream
in ra OutputStream
và PrintWriter
in 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 OutputStream
và a là Writer
gì? Cả hai đều là luồng, với sự khác biệt chính là a OutputStream
là luồng byte trong khi a Writer
là luồng ký tự.
Nếu một OutputStream
giao 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 PrintStream
JDK, vì mục đích chính là viết các ký tự chứ không phải byte? PrintStream
có 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 PrintStream
nế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.out
tạo cảnh báo API không dùng nữa! Ngoài ra, việc thay đổi loại từ PrintStream
sang PrintWriter
luồng đầu ra tiêu chuẩn sẽ phá vỡ các ứng dụng hiện có.)