Sự khác biệt giữa Reader và InputStream là gì? Và khi nào thì dùng cái gì? Nếu tôi có thể sử dụng Reader để đọc các ký tự, tại sao tôi lại sử dụng inputstream, tôi đoán để đọc các đối tượng?
Sự khác biệt giữa Reader và InputStream là gì? Và khi nào thì dùng cái gì? Nếu tôi có thể sử dụng Reader để đọc các ký tự, tại sao tôi lại sử dụng inputstream, tôi đoán để đọc các đối tượng?
Câu trả lời:
InputStream là phương pháp thô để lấy thông tin từ một tài nguyên. Nó lấy từng byte dữ liệu mà không cần thực hiện bất kỳ loại dịch nào. Nếu bạn đang đọc dữ liệu hình ảnh hoặc bất kỳ tệp nhị phân nào, đây là luồng để sử dụng.
Trình đọc được thiết kế cho các luồng ký tự. Nếu thông tin bạn đang đọc đều là văn bản, thì Trình đọc sẽ giải mã ký tự cho bạn và cung cấp cho bạn các ký tự unicode từ luồng đầu vào thô. Nếu bạn đang đọc bất kỳ loại văn bản nào, đây là luồng để sử dụng.
Bạn có thể bọc một InputStream và biến nó thành một Trình đọc bằng cách sử dụng lớp InputStreamReader.
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputStreams được sử dụng để đọc các byte từ một luồng. Vì vậy, chúng rất hữu ích cho dữ liệu nhị phân như hình ảnh, video và các đối tượng được tuần tự hóa.
Mặt khác, người đọc là luồng ký tự nên chúng được sử dụng tốt nhất để đọc dữ liệu ký tự.
read()
từng byte và khi nào thì sử dụng read(byte[])
mảng byte. Theo tôi nghĩ mảng đọc luôn tốt hơn. sau đó bạn có thể cho tôi ví dụ về nơi sử dụng read()
từng byte HOẶC read(byte[])
mảng byte. HAY BufferedInputStream
.?
Tôi đoán nguồn gốc của sự nhầm lẫn là InputStream.read()
trả về một int
và Reader.read()
cũng trả về một int
.
Sự khác biệt là InputStream.read()
trả về giá trị byte trong khoảng từ 0 đến 255 tương ứng với nội dung thô của luồng byte và Reader.read()
trả về giá trị ký tự nằm trong khoảng từ 0 đến 65357 (vì có 65358 mã điểm unicode khác nhau)
Một InputStream
cho phép bạn đọc các nội dung byte bởi byte, ví dụ: nội dung "một ‡ một" được đọc như một dòng 5 byte (mỗi người thể hiện dưới dạng một int
từ 0 đến 255) kết quả là 97
, 226
, 128
, 161
và 97
nơi
a -> U+0061 -> 0x61 (hex) -> 97 (dec)
‡ -> U+2021 -> 0xE280A1 (utf-8 encoding of 0x2021) -> 226 128 161 (1 int per byte)
a -> U+0061 -> 0x61 (hex) -> 97 (dec)
Một Reader
cho phép bạn đọc các nhân vật nội dung bởi nhân vật nên các nội dung "một ‡ một" được đọc như 3 nhân vật 97
, 8225
và 97
nơi
a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97
Ký tự ‡ được gọi là U + 2021 trong Unicode
Bối cảnh của InputStream & Reader:
Trong những ngày đầu tiên của java, cách duy nhất để thực hiện nhập bảng điều khiển là sử dụng một luồng byte (InputStream và OutputStream).
Trường hợp sử dụng:
Ngày nay, việc sử dụng luồng byte để đọc luồng bảng điều khiển cũng được chấp nhận. Tuy nhiên, đối với các ứng dụng thương mại, phương pháp ưa thích để đọc đầu vào bảng điều khiển là sử dụng luồng hướng ký tự (Reader). Reader giúp bạn dễ dàng quốc tế hóa và duy trì.
Lưu ý: Đây chỉ là một thông tin bổ sung để khám phá các mã Java I / O vì mẫu thiết kế của việc triển khai Java I / O tuân theo mẫu thiết kế decorator. Nếu bạn quen thuộc với mẫu thiết kế decorator thì bạn có thể dễ dàng bắt kịp việc thực hiện.
Một chấp nhận byte và một chấp nhận ký tự.
InputStream chấp nhận byte , Reader chấp nhận ký tự, Trong Java, một ký tự = hai byte, và Reader sử dụng bộ đệm, InputStream không sử dụng. Tất cả tệp lưu trữ trong đĩa hoặc truyền dựa trên byte, bao gồm hình ảnh và video, nhưng ký tự nằm trong bộ nhớ, vì vậy InputStream được sử dụng thường xuyên.