Всем привет! Эта тема почему-то с трудом оседает в голове. Сколько раз к ней возвращаюсь — возникают какие-то сложности с пониманием. Буду признательна, если поможете разобраться. Ниже опишу все, что вызывает непонимание: 1) Что такое поток? В интернете читаю, что поток (stream) — абстракция, которая используется для чтения или записи информации. Также читаю, что Объект, из которого можно считать данные, называется потоком ввода, а объект, в который можно записывать данные, - потоком вывода. Правильно ли я понимаю, что сам поток — это абстракция, которую мы "накладываем"/"примеряем" на нужные нам объекты? И тогда мы называем какой-то объект потоком ввода/вывода, используя его как реализацию абстракции? То есть объект, к которому мы "подключили" поток с помощью конструктора потока будет для нас потоком ввода или вывода. 2) Также я не совсем понимаю логику того, что у нас есть байтовые потоки и символьные, а также есть классы File, Files, Path. Все ли эти классы предназначены для работы с потоками? 3) У нас есть Writer и Reader для работы с символами, есть ли что-то подобное для работы со звуковыми файлами и файлами изображения, или в их случае мы работаем напрямую с байтами? 4) Верно ли, что все классы для работы с потоками ("под капотом" или явно) работают с байтами файла? 5) Я столкнулась с тем, что классов для работы очень много. И мне не совсем понятно, как выбрать, какой класс в каких случаях нужно использовать. Можете ли подсказать, какие "обязательные" классы нужно изучить, чтобы уметь делать базовые операции (произвести манипуляции с текстовым/звуковым/графическим файлом) ? 6) Смотрела текстовые и графические лекции по этой теме. Дается с трудом. Можете ли вы посоветовать ресурс, который помог вам разобраться в этой теме?