Gymterview
junior

Чем отличаются и что общего у InputStream, OutputStream, Reader, Writer?

Эти четыре класса образуют фундамент системы ввода/вывода Java, представляя собой корневые абстрактные классы двух пар: байтовой и символьной.

Характеристика InputStream OutputStream Reader Writer
Направление Чтение Запись Чтение Запись
Тип данных byte (8 бит) byte (8 бит) char (16 бит, Unicode) char (16 бит, Unicode)
Базовый метод read() write(int) read() write(int)
Реализует Closeable Closeable, Flushable Closeable Closeable, Flushable

Общее

  • Все четыре — абстрактные классы, определяющие контракты для своих иерархий.
  • Все реализуют CloseableAutoCloseable), что позволяет использовать try-with-resources.
  • Все используют паттерн Декоратор для добавления функциональности (буферизация, сжатие, кодирование).
  • У всех есть методы close() для освобождения ресурсов.

Различия

  • Байтовые потоки (InputStream/OutputStream) работают с сырыми байтами и подходят для любых данных (бинарные файлы, изображения, сеть).
  • Символьные потоки (Reader/Writer) работают с символами Unicode и предназначены для текстовых данных с учётом кодировки.
  • Потоки вывода (OutputStream/Writer) дополнительно реализуют интерфейс Flushable с методом flush() для принудительного сброса буфера.

Мост между байтовыми и символьными потоками обеспечивают InputStreamReader (байты в символы при чтении) и OutputStreamWriter (символы в байты при записи).

На собеседовании: покажите понимание двух измерений: тип данных (byte vs char) и направление (чтение vs запись). Упомяните мосты InputStreamReader/OutputStreamWriter и общие черты (AutoCloseable, паттерн Декоратор).