Какие существуют виды потоков ввода/вывода?
Потоки ввода/вывода в 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), позволяющего комбинировать функции без создания множества подклассов.
На собеседовании: назовите два вида (байтовые и символьные) и их базовые классы. Дополнительный плюс — упомянуть деление на узловые потоки и потоки-обёртки, а также паттерн Декоратор.