Всем привет! Эта тема почему-то с трудом оседает в голове. Сколько раз к ней возвращаюсь — возникают какие-то сложности с пониманием. Буду признательна, если поможете разобраться. Ниже опишу все, что вызывает непонимание:
1) Что такое поток? В интернете читаю, что поток (stream) — абстракция, которая используется для чтения или записи информации. Также читаю, что Объект, из которого можно считать данные, называется потоком ввода, а объект, в который можно записывать данные, - потоком вывода.
Правильно ли я понимаю, что сам поток — это абстракция, которую мы "накладываем"/"примеряем" на нужные нам объекты? И тогда мы называем какой-то объект потоком ввода/вывода, используя его как реализацию абстракции? То есть объект, к которому мы "подключили" поток с помощью конструктора потока будет для нас потоком ввода или вывода.
2) Также я не совсем понимаю логику того, что у нас есть байтовые потоки и символьные, а также есть классы File, Files, Path. Все ли эти классы предназначены для работы с потоками?
3) У нас есть Writer и Reader для работы с символами, есть ли что-то подобное для работы со звуковыми файлами и файлами изображения, или в их случае мы работаем напрямую с байтами?
4) Верно ли, что все классы для работы с потоками ("под капотом" или явно) работают с байтами файла?
5) Я столкнулась с тем, что классов для работы очень много. И мне не совсем понятно, как выбрать, какой класс в каких случаях нужно использовать.
Можете ли подсказать, какие "обязательные" классы нужно изучить, чтобы уметь делать базовые операции (произвести манипуляции с текстовым/звуковым/графическим файлом) ?
6) Смотрела текстовые и графические лекции по этой теме. Дается с трудом. Можете ли вы посоветовать ресурс, который помог вам разобраться в этой теме?
Ada
1 уровень
Помогите разобраться с потоками ввода-вывода
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Стас ПасинковSoftware Developer в ZipyMaster
2 июля 2022, 23:46решение
1. да. в джаве почти все объекты (ну кроме примитивов). есть объекты для разных абстракций, например для такой абстракции как "список". когда нам нужен список - мы создаем объект определенного класса и работаем с ним. так и с потоками. когда нам нужен поток для чтения файла - мы создаем объект определенного класса и работаем с этим объектом.
2. на самом деле все данные хранятся в компе в виде байтов. но это удобно компу, и возможно каким-нибудь роботам. людям, которые работают с этими данными - удобнее использовать строки/символы. мы тогда лучше понимаем что это за данные, и все такое. поэтому для удобства работы нам дали возможность не заниматься постоянным превращением байтов в строки (еще и с учетом кодировки символов, они же разные бывают), а сразу работать с потоком символов. но так как далеко не все данные в компе это текстовые файлы (есть еще картинки, звуки, как вы заметили, и еще куча всего) - вот и решили оставить нам возможность работать и с байтами напрямую.
поскольку доступ к файлам организован в любом случае через потоки - то да, можно сказать, что они предназначены для работы с потоками, но только с теми, где это файлы. это такие специфические классы, где нам еще проще работать с файлами, чем если бы мы это делали просто с использованием потоков напрямую.
в общем, это все разные уровни абстракций. байтовые потоки - это такой, самый низкий уровень, символьные - чуть поудобней (для работы с символьными данными в потоках), все те классы, что вы указали - еще удобнее работать именно с файлам, то-есть еще более высокий уровень абстракции. итд
3. у нас есть ридеры и врайтеры для работы с символами потому что у нас есть строки. такая структура данных, в которой удобно представлены символы в джаве. если есть какая-то структура данных для того, чтобы как-то удобно представить картинку или звук - тогда я думаю и будут дополнительные классы (новые уровни абстракций) для работы с ними. но я лично о таком не знаю) возможно их и нет. ведь звук сложно представить
+4
Стас ПасинковSoftware Developer в ZipyMaster
3 июля 2022, 00:03решение
ведь звук сложно представить на экране компьютера в понятном виде. например, чтобы в дебаге вы могли понять что вот в этом объекте - доминант септаккорд, а вот в этом объекте - звук удара по хай-хэту :) изображение представить чуть проще, но в принципе, мы и так его видим каким оно есть. просто размеры изображения настолько огромны, что нам просто неудобно работать с такими большими данными в сыром виде. возьмите любую картинку и увеличьте ее по максимуму, и вы заметите, что вот этот пиксель беленький, а вот этот - серенький, и на самом деле это просто огромная rgb-матрица :)
4. да
5. да, классов всегда много) их и так много, так еще и каждый свои новые классы пишет! как тут ВСЕ выучить то? ответ: никак. да их и не надо все учить) надо изучить абстракции над ними, как например вот тут
а если вам нужны будут какие-то конкретные библиотеки для работы с чем-то специфическим - то надо будет просто изучить классы из тех библиотек, вот и все. сейчас вы изучаете не какие-то специфические штуки, а общие абстракции для работы с ними.
исходя из ответа на вопрос 4 - то мы и со звуком, и с картинками в конечном итоге работаем с байтами, да. но мы этого так не любим, что придумываем разные абстракции (новые классы) чтобы было удобнее работать с данными.
6. когда-то давно еще на инфо.джавараш.ру видел пару статей одного чувака, который показывал как работать с изображениями. очень понравились те статьи, но ссылочки, к сожалению, не сохранил(( но когда джавараш переезжал с инфо - они перенесли все годные статьи в раздел Статьи тут на сайте. ищите в архиве там. ну а вообще, в интернете вы найдете кучу всяких статей на любую тему. какие-то сложнее, какие-то проще. но мы все так делаем :)
+4
Стас ПасинковSoftware Developer в ZipyMaster
3 июля 2022, 00:21решение
нашел))
можете дополнительно спросить у гугла про этого автора, может еще и другие статьи найдете его) он там про буффер еще неплохую статью написал с примерами)
+4
Ada
3 июля 2022, 06:12
Стас, спасибо большое! Вы действительно очень помогли уложить в голове эту тему!)
+1
Lexman (Алексей)Full Stack Developer в TrendSoft
2 июля 2022, 20:14
1) Поток- это когда мы данные читаем последовательно. и по моему мнению как раз поток не абстракция, так как если глубоко задуматься, то все в компьютере работает последовательно, и следовательно это поток. исполнение вашего джава кода тоже является потоком.
Если применять поток к каким либо коллекциям или массивам, то тогда поток можно назвать абстракцией.
2) классы File, Files, Path предназначены для работы с файлами, а поток это не только работа с файлами, это намного больший функционал
6) На джавараш и разобрался. Можете посмотреть комментарии к лекциям с потоками. Там часто кидают годный материал
+1