Чем входной поток отличается от выходного потока?

Я вижу, что оба "потока" данных. В таком случае, почему вы считаете их разными ? В чем на самом деле разница ?

комментарий - пожалуйста, не закрывайте этот вопрос. Это основной вид вещей, которые могут смущают людей в интервью.

обновление 1 - Кажется, все говорят одно и то же - Вы читаете из IS и записываете в OS. Итак, они в основном одинаковы. Как труба, по которой течет вода. Когда вы используете воду из этой трубы вы называете его InputStream и когда вы закачиваете в него воду, его называют выходным потоком. Неужели это так тривиально ?

обновление 2 - Если разница не такая "большая", то можем ли мы иметь InAndOutStream вместо того, чтобы делать код для двух классов (InputStream и OutputStream) ?

7 ответов


они концептуально разные

  • С InputStream Вы читаете
  • to OutputStream вы пишите

Если разница не такая "большая", то можем ли мы иметь InAndOutStream вместо того, чтобы делать код для двух классов (InputStream и OutputStream) ?

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

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

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

FYI: я написал библиотека, которая делает именно то, что вы предлагаете для потока памяти, такого как "трубы" ;) однако я бы сказал, что это только для опытных разработчиков, и даже тогда я держу интерфейсы как можно более отличными, чтобы предотвратить путаницу.


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

независимо от того, как они работают внутри, все потоки представляют одну и ту же простую модель для программ, которые их используют: поток-это последовательность данных. Программа использует входной поток для чтения данных из источника, по одному элементу за раз: IO Stream

программа использует выходной поток для записи данных в пункт назначения, по одному элементу за раз: IO Stream


вы читать С InputStream и написать до OutputStream. В этом-то и разница между ними.

в некоторых случаях вам нужно уметь читать и писать. Одним из таких примеров является потоком гнездо. Как библиотека Java обрабатывает это, имея InputStream и an OutputStream.


концепция потоков не так симметрично как вы подразумеваете в своем вопросе. Поскольку это Java, читатель и писатель потока занимают радикально разные позиции в среде выполнения: один реализует объект stream, а другой вызывает методы на нем.

таким образом, поскольку язык заставляет асимметрию на модели, разработчик любого объекта ввода-вывода в Java, то необходимо заранее определить, следует ли занимать сторону чтения или сторону записи поток. У пользователей объекта нет выбора. Например, тогда; для реализации средства ввода-вывода, которое получает данные от своих пользователей, необходимо реализовать OutputStream (какие пользователи будут призывать писать).

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

Я надеюсь, что делает его немного более ясным.


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

edit: я был глуп с файлом word, потоки могут использоваться не только для файлов.


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

следующий код помогает нам избежать путаницы между потоками:

//Standard input: 
Scanner scan = new Scanner(System.in);
String s = scan.next();

//Standard output
System.out.println("Hello World!");