Вопрос о потоках в Java - PullRequest
       3

Вопрос о потоках в Java

2 голосов
/ 28 апреля 2011

В последние дни я читал о потоках в Java. Прочитав немного, я начинаю понимать, что название «поток» было выбрано из-за сходства с тем, о чем мы используем слово в «реальной жизни», такой как вода. И что нет необходимости знать, откуда поступают данные. Пожалуйста, исправьте, если я неверно истолковал это.

Но я не понимаю этого. Например, когда я говорю getOutputStream или getInputStream в сокете, я получаю InputStream, который я могу связать с любыми вещами. Но не являются ли InputStream / OutputStream абстрактными классами? Я не знаю точно, как объяснить это правильно, но я не понимаю, что соединение с сокетом, просто вызывая этот метод, автоматически имеет поток / канал, по которому могут передаваться байты / символы? Что на самом деле является InputStream / OutputStream? Являются ли потоки способом абстрагирования реальных источников?

Я думаю, что понимаю различные способы их объединения, однако чувствую, что упускаю суть концепции.

В отсутствие надлежащего способа объяснения я удалю вопрос, если это плохо.

Спасибо за ваше время.

Ответы [ 4 ]

3 голосов
/ 28 апреля 2011

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

Когда вы получаете InputStream из Socket, вы можете получить доступ к любым данным, поступающим в этот сокет. При чтении из этого потока, как правило, вы предоставляете байтовый массив и просите поток заполнить его для вас. Он будет читать столько данных, сколько доступно, либо заполнит буфер. Вам решать, что вы будете делать с данными в этом байтовом массиве.

Для любого вида Socket IO, хотя, сказав все это о Streams, API сокетов Java довольно стар, и есть несколько действительно хороших доступных альтернатив, которые обертывают его и легче использовать. Я настоятельно рекомендую Netty , используя который вы можете забыть о потоках и сосредоточиться на POJO и как их кодировать и декодировать.

3 голосов
/ 28 апреля 2011

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

В случае Socket реализация представляет собой SocketInputStream, который расширяет FileInputStream

3 голосов
/ 28 апреля 2011

InputStream / OutputStream это, ну, абстракции. Они дают вам некоторый базовый API для чтения / записи байтов или групп байтов без раскрытия фактической реализации. Давайте возьмем OutputStream в качестве примера:

OutputStream получает кучу байтов через открытый API. Вы на самом деле не знаете (и не заботитесь), что происходит с этими байтами впоследствии: они отправлены . Реальная реализация может: добавлять их в файл, игнорировать их (NullOutputStream в Apache Commons), сохранять их в памяти или ... отправлять через сокет.

Вот что происходит, когда вы звоните Socket.getOutputStream(): вы получаете некоторую реализацию OutputStream, просто все равно, это зависит от реализации и специфично. Когда вы отправляете байты в этот поток, базовая реализация проталкивает их, используя TCP / IP или UDP. Фактически сам TCP / IP является потоковым протоколом, хотя он работает с пакетами / кадрами.

Ситуация похожа на InputStream - вы получаете некоторую реализацию из сокета. Когда вы запрашиваете у потока несколько байтов, базовая реализация InputStream запрашивает у сокета ОС такое же количество байтов, возможно, блокируя. Но это настоящее удовольствие от наследства: вам все равно! Просто используйте эти потоки так, как вы хотите: цепочки, буферизация и т. Д.

3 голосов
/ 28 апреля 2011

Когда вы вызываете getInputStream, сокет возвращает экземпляр какого-то конкретного подкласса InputStream.Обычно вы не беспокоитесь о точном классе возвращаемого объекта;поскольку это InputStream, вы просто работаете с ним таким образом.(Подкласс может даже быть частным вложенным классом класса сокета.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...