У чому різниця між Reader та InputStream? І коли чим користуватися? Якщо я можу використовувати Reader для читання символів, чому я буду використовувати вхідний потік, я думаю, для читання об'єктів?
У чому різниця між Reader та InputStream? І коли чим користуватися? Якщо я можу використовувати Reader для читання символів, чому я буду використовувати вхідний потік, я думаю, для читання об'єктів?
Відповіді:
InputStream - це необроблений метод отримання інформації з ресурсу. Він захоплює байт даних за байтом, не виконуючи жодного перекладу. Якщо ви читаєте дані зображень або будь-який двійковий файл, цей потік потрібно використовувати.
Читач призначений для потоків символів. Якщо інформація, яку ви читаєте, - це весь текст, то програма Reader подбає про декодування символів і надасть вам символи Unicode із вихідного потоку вводу. Якщо ви читаєте текст будь-якого типу, цей потік потрібно використовувати.
Ви можете обернути InputStream і перетворити його на Reader, використовуючи клас InputStreamReader.
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
InputStreams використовуються для зчитування байтів з потоку. Тому вони корисні для двійкових даних, таких як зображення, відео та серіалізовані об'єкти.
З іншого боку, читачі - це потоки символів, тому їх найкраще використовувати для читання символьних даних.
read()
байт за байтом, а коли - read(byte[])
масив байтів. Як я думаю, читати масив завжди краще. тоді ви можете навести мені приклад, де використовувати read()
байт за байтом АБО read(byte[])
масив байтів. АБО BufferedInputStream
.?
Я думаю, джерелом плутанини є те, що 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
Передумови InputStream і Reader:
У перші дні Java єдиним способом введення консолі було використання байтового потоку (InputStream та OutputStream).
Варіанти використання:
Сьогодні використання байтового потоку для читання консольного потоку також є прийнятним. Однак для комерційних програм кращим методом введення консолі для читання є використання символьно-орієнтованого потоку (Reader). Reader спрощує інтернаціоналізацію та підтримку.
Примітка: Це лише додаткова інформація для вивчення кодів вводу-виводу Java, полягає в тому, що шаблон дизайну реалізації вводу-виводу Java відповідає шаблону дизайну декоратора. Якщо ви знайомі з дизайном дизайну декоратора, то ви можете легко наздогнати реалізацію.
Один приймає байти, а інший - символи.
InputStream приймає байт , Читач приймає символ, У Java один символ = два байти, а Reader використовує буфер, InputStream не використовує. Усі файли, що зберігаються на диску або передаються на байті, включають зображення та відео, але символ є в пам'яті, тому InputStream використовується часто.