У чому різниця між Reader та InputStream?


87

У чому різниця між Reader та InputStream? І коли чим користуватися? Якщо я можу використовувати Reader для читання символів, чому я буду використовувати вхідний потік, я думаю, для читання об'єктів?


3
Щодо "Я думаю, щоб читати об'єкти?", Існують спеціальні вхідні / вихідні потоки для читання / запису об'єктів Java. Вони є ObjectInputStream та ObjectOutputStream відповідно і є частиною більшої структури серіалізації. java.sun.com/developer/technicalArticles/Programming/ ... Але це лише одне використання вхідних / вихідних потоків, інші можуть надсилати дані через сокет і т. д.
Марк Пітерс

Відповіді:


138

InputStream - це необроблений метод отримання інформації з ресурсу. Він захоплює байт даних за байтом, не виконуючи жодного перекладу. Якщо ви читаєте дані зображень або будь-який двійковий файл, цей потік потрібно використовувати.

Читач призначений для потоків символів. Якщо інформація, яку ви читаєте, - це весь текст, то програма Reader подбає про декодування символів і надасть вам символи Unicode із вихідного потоку вводу. Якщо ви читаєте текст будь-якого типу, цей потік потрібно використовувати.

Ви можете обернути InputStream і перетворити його на Reader, використовуючи клас InputStreamReader.

Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);

бездоганна відповідь Берін! Дякую!
Gaurav,

18

InputStreams використовуються для зчитування байтів з потоку. Тому вони корисні для двійкових даних, таких як зображення, відео та серіалізовані об'єкти.

З іншого боку, читачі - це потоки символів, тому їх найкраще використовувати для читання символьних даних.


Коли використовувати read()байт за байтом, а коли - read(byte[])масив байтів. Як я думаю, читати масив завжди краще. тоді ви можете навести мені приклад, де використовувати read()байт за байтом АБО read(byte[])масив байтів. АБО BufferedInputStream.?
Асіф Муштак

11

Я думаю, джерелом плутанини є те, що InputStream.read()повертає і, intа Reader.read()також повертає int.

Різниця полягає в тому, що InputStream.read()повертаються значення байтів між 0 і 255, що відповідають Reader.read()вихідному вмісту байтового потоку, і повертають значення символу, яке знаходиться між 0 і 65357 (оскільки існує 65358 різних кодових точок Unicode)

InputStreamДозволяє зчитувати вміст байт за байтом, наприклад вміст «A ‡ A», зчитуються у вигляді потоку 5 байтів (кожен з яких представлено в вигляді intвід 0 до 255) , в результаті чого 97, 226, 128, 161і , 97де

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)

A Readerдозволяє читати вміст символ за символом, щоб вміст "a ‡ a" читався як 3 символи 97, 8225і 97де

a -> U+0061 -> 0x61 -> 97
‡ -> U+2021 -> 0x2021 -> 8225 (single int, not 3)
a -> U+0061 -> 0x61 -> 97

Символ ‡ в Unicode називається U + 2021


Це має бути прийнятою відповіддю. Дякую за приклад
інформаційна панель

2

Передумови InputStream і Reader:

У перші дні Java єдиним способом введення консолі було використання байтового потоку (InputStream та OutputStream).

Варіанти використання:

Сьогодні використання байтового потоку для читання консольного потоку також є прийнятним. Однак для комерційних програм кращим методом введення консолі для читання є використання символьно-орієнтованого потоку (Reader). Reader спрощує інтернаціоналізацію та підтримку.

Примітка: Це лише додаткова інформація для вивчення кодів вводу-виводу Java, полягає в тому, що шаблон дизайну реалізації вводу-виводу Java відповідає шаблону дизайну декоратора. Якщо ви знайомі з дизайном дизайну декоратора, то ви можете легко наздогнати реалізацію.



0

InputStream приймає байт , Читач приймає символ, У Java один символ = два байти, а Reader використовує буфер, InputStream не використовує. Усі файли, що зберігаються на диску або передаються на байті, включають зображення та відео, але символ є в пам'яті, тому InputStream використовується часто.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.