Gymterview
junior

Какие существуют виды потоков ввода/вывода?

Потоки ввода/вывода в Java делятся на два основных вида по типу обрабатываемых данных: байтовые и символьные.

Байтовые потоки оперируют сырыми байтами и подходят для работы с любыми данными — изображениями, аудио, бинарными файлами. Символьные потоки оперируют символами Unicode (char, 16 бит) и предназначены для работы с текстовыми данными, автоматически учитывая кодировку.

Вид Чтение Запись Единица данных
Байтовые java.io.InputStream java.io.OutputStream байт (8 бит)
Символьные java.io.Reader java.io.Writer char (16 бит)

Помимо этого, потоки делятся по роли:

  • Узловые потоки (node streams) — работают непосредственно с источником данных (файл, массив, строка, сетевое соединение): FileInputStream, ByteArrayInputStream, FileReader.
  • Потоки-обёртки (filter/processing streams) — добавляют функциональность к другим потокам (буферизация, сжатие, преобразование типов): BufferedInputStream, DataInputStream, InputStreamReader.

Этот паттерн обёртывания потоков — классический пример применения паттерна Декоратор (Decorator), позволяющего комбинировать функции без создания множества подклассов.

На собеседовании: назовите два вида (байтовые и символьные) и их базовые классы. Дополнительный плюс — упомянуть деление на узловые потоки и потоки-обёртки, а также паттерн Декоратор.