Как визуализировать объект Stream (и некоторые другие типы данных)?

#java

#java

Вопрос:

Я хочу создать небольшое руководство по программированию, в котором будет несколько изображений, визуализирующих различные типы данных, но я не уверен, как нарисовать эти изображения типов данных.

Предположим, что у меня есть FileOutputStream объект, который записывает данные в файл 1.txt .

Как я могу думать об этом FileOutputStream объекте, думаю ли я о нем как о контейнере потока данных (т. Е. канале), например:

введите описание изображения здесь

Или я думаю об этом только как о потоке данных, например:

введите описание изображения здесь

Я думаю, что термин «поток воды» в реальной жизни означает только текущую воду (без наличия контейнера, содержащего текущую воду).


Мой вопрос также применим к другим типам данных, например, думаю ли я о Stack целых числах как о контейнере стека целых чисел, например:

введите описание изображения здесь

Или я думаю об этом только как о стеке целых чисел, например:

введите описание изображения здесь

Я думаю, что термин «стопка книг» в реальной жизни означает только сложенные книги (без наличия контейнера, содержащего сложенные книги).


То же самое для int типа данных, думаю ли я о int как о контейнере целого числа, например:

введите описание изображения здесь

Или я думаю об этом только как о целом числе, например:

введите описание изображения здесь

Комментарии:

1. Поток можно почти рассматривать как отображение, которое всегда является некоторым вводом A (количества 0...n ) и выходом B (количества 1 ... n ). Если вы собираетесь использовать диаграммы, я бы использовал диаграммы UML. В этом смысле поток затем может быть представлен с использованием множественного отношения между двумя классами.

Ответ №1:

Взгляните на руководства по Java для потоков ввода-вывода: https://docs.oracle.com/javase/tutorial/essential/io/streams.html и как это иллюстрирует:

введите описание изображения здесь

Я думаю, что этот вопрос несколько субъективен. «Контейнер» помогает сделать представление более четким за счет наличия четких контуров для различных компонентов на изображении (как в приведенном выше примере). Это также может дать контекст читателю: например, для стека имеет смысл представить его в виде контейнера, поскольку это коллекция, содержащая элементы. Но что это означает для int? Распределение памяти?

Имейте в виду, что в конце концов, это всего лишь абстрактное представление концепции.

Ответ №2:

Это всегда контейнеры.

Позвольте мне начать снизу, потому что я думаю, так будет проще.

Не вдаваясь слишком далеко в особенности управления памятью, вы должны думать обо всех как о КОНТЕЙНЕРЕ плюс ДАННЫЕ. Особенно в типизированных типах.

Что-то без контейнера — это просто биты.

Пример: целое число 4 — это просто ‘1000’. Но что 4, если бы это был ascii, это был бы некоторый записываемый символ, и это было бы просто ‘1000’. Контейнер — это то, что придает смысл данным внутри. Данные без contanier, необработанные данные, это просто биты.

Переходя к стеку, опять же, вы должны думать так же. Абстракция — ЭТО контейнер, и это контейнер КОНТЕЙНЕРОВ.

Итак, что-то вроде стека — это что-то вроде

 _______________
|
| *top
| ==== type T==
| ==== type T==
| ==== type T==
|______________|
  

И затем, после, эти типы T , или целые числа, или строки, или что угодно, будут контейнерами, которые будут содержать некоторые другие фрагменты другим точным способом.

Важно всегда говорить об абстракции, блоке, потому что реализация полностью зависит от системы, языка, компиляции, архитектуры процессора … так что для as они всегда будут блоками.

Переходя к потоку, поток немного отличается от других, потому что поток, теоретически, отправляет только необработанные данные, и они преобразуются только тогда, когда вы собираетесь их использовать. Это верно для потоков ввода-вывода в Java, но не для самой концепции Streams или потоков, как в реактивном программировании, которые очень разные вещи. Но, в качестве общего упрощения, поток просто отправляет данные в сжатом виде оптимизированным способом, а затем вы или поток обрабатываете эти данные так, как это необходимо для понимания при выходе из него.

Если у вас есть еще какие-либо вопросы, не стесняйтесь задавать

Ответ №3:

Каждая переменная непримитивного типа в Java является указателем на объект. Объект любого типа является экземпляром класса. С каким бы типом данных вы ни имели дело, на самом деле это всего лишь один объект. Например, ArrayList<String> li; это НЕ несколько строк, это 1 объект li типа ArrayList .

Уточнив это, поток, будь то ввод или вывод, представляет собой 1 объект, то есть контейнер. стек — это то же самое. Практически во всех языках программирования вы не можете иметь данные без контейнера.

Для всех примитивных типов, конечно, вы должны думать о них как о самих данных. Например, int a=3; вы должны думать о a как о 3, контейнера нет. Это потому, что в Java у вас не может быть указателя на примитивный тип.

Ответ №4:

Вот краткий и, надеюсь, полезный ответ.

Для всех типов данных это должны быть «Контейнеры«, Почему? — Поскольку все является объектом (инкапсуляция) — даже «int» взаимозаменяем с «Integer».

Более конкретно

для FileIOСформируйте контейнеры в виде каналов, чтобы вы могли их обернуть. Вот так — Ссылка на изображение — https://i.stack.imgur.com/zRqoL.png

из самой библиотеки Oreily — https://www.oreilly.com/library/view/learning-java-4th/9781449372477/ch12s01.html

Для стековКонтейнеры в форме коробок.
https://i.stack.imgur.com/JP7Dz.jpg

Для типов данныхКапсула вполне подходит.
https://i.stack.imgur.com/Qqhrw.png

ссылка — https://stackify.com/oop-concept-for-beginners-what-is-encapsulation /

Надеюсь, это помогло.

Ответ №5:

Мне нравятся ссылки на знакомые вещи (например, поток воды или стопку книг), это может быть очень полезно, особенно для начинающих или широкой публики. Если это ваша аудитория, не стесняйтесь добавлять это в свое описание.

Что касается stream, меня устраивает как с контейнером, так и без него, но я бы предложил указывать направление потока.

Что касается стека, я предпочитаю, чтобы у него не было контейнера в целом. Что еще более важно, это организованная куча, в которой один элемент находится явно выше другого.

Что касается int , ему не нужен контейнер, когда он объясняется как тип данных. (Однако, как только он будет помещен в переменную, «контейнер», на мой взгляд, был бы уместен).