Sự khác biệt giữa Reader và InputStream là gì?


87

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?


3
Liên quan đến "Tôi đoán để đọc các đối tượng?", Có các luồng Đầu vào / Đầu ra đặc biệt để đọc / ghi các đối tượng Java. Chúng lần lượt là ObjectInputStream và ObjectOutputStream và là một phần của khuôn khổ tuần tự hóa lớn hơn. java.sun.com/developer/technicalArticles/Programming/… Nhưng đó chỉ là một cách sử dụng các luồng đầu vào / đầu ra, những người khác có thể gửi dữ liệu qua ổ cắm, v.v.
Mark Peters

Câu trả lời:


138

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);

câu trả lời hoàn hảo Berin! Cảm ơn!
Gaurav

18

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ự.


Khi nào sử dụng 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.?
Asif Mushtaq

11

Tôi đoán nguồn gốc của sự nhầm lẫn là InputStream.read()trả về một intReader.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 InputStreamcho 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 inttừ 0 đến 255) kết quả là 97, 226, 128, 16197nơ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 Readercho 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, 822597nơ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


Đây phải là câu trả lời được chấp nhận. Cảm ơn bạn về ví dụ
bảng điều khiển

2

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.



0

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.