Почему мы записываем байты в OutputStream и читаем Line из InputStream в java? - PullRequest
1 голос
/ 07 декабря 2010

Вот только этот пример:

http://www.xyzws.com/Javafaq/how-to-use-httpurlconnection-post-data-to-web-server/139

Почему это так странно?

Ответы [ 3 ]

5 голосов
/ 07 декабря 2010

Вы на самом деле смотрите на два разных вида потока.

Классы и подклассы Writer / Reader предназначены для чтения / записи символьных данных.Он заботится о преобразовании между внутренним представлением текста UTF-16 в Java и кодировкой символов, используемой снаружи.Класс BufferedReader добавляет метод readLine(), который понимает создателей конца строки.

Классы и подклассы InputStream / OutputStream предназначены для чтения и записи байтовых данных без каких-либо предположений окодировки символов, или что данные являются текстовыми.Поскольку он избегает этих предположений, «строка» не имеет четкого значения, и, следовательно, класс BufferedInputStream не имеет метода readLine().

(Кстати, DataInputStream имеет метод readLine(),но он устарел, потому что он не работает. Он делает предположения о кодировках и т. д., которые недопустимы на некоторых платформах!)


В вашем конкретном примере код асимметричен, потому что служба HTTP, предназначенная для разговорак асимметрична.Служба ожидает запрос с двоичным содержимым (закодированный с использованием оболочки DataOutputStream) и доставляет ответ с текстовым содержимым.В этом нет ничего необычного ... или неправильного.

Странность записи «входных данных» на сервер в «выходных данных» - это просто вопрос перспективы.Проще говоря, OutputStream / Writer - это то, что вы «записываете» (т.е. приемник данных), а InputStream или Reader - это то, что вы «читаете» (т.е. источник данных).Так оно и есть, и это совсем не странно, когда ты привыкла к этому.

4 голосов
/ 07 декабря 2010

На самом деле, мы не. Не существует метода readLine, определенного в InputStream . Он также работает только с байтами, как и OutputStream.

В коде, на который вы ссылаетесь, readLine вызывается для BufferedReader .

Reader и Writer предназначены для текстовых данных и работают с символами (и строками), InputStream и OutputStream работают с двоичными данными (необработанными байтами). Чтобы выполнить преобразование между ними (т. Е. Обернуть InputStream в Reader или OutputStream в Writer), вам нужно выбрать набор символов.

Мне странно, почему не читал из OutputStream, а из InputStream

Это просто вопрос перспективы.

OutputStream или Writer - это место, где вы записываете свой вывод в

InputStream или Reader - это то место, где вы читаете свой ввод из.

Конечно, где-то, на другом конце потока, кто-то может рассматривать ваш OutputStream как свой InputStream ...

1 голос
/ 07 декабря 2010

readLine делает именно то, что подразумевает название - он читает строку текста до маркера конца строки.

Когда вы пишете в поток, вы уже знаете, где заканчивается ваша строка.

Если вы ищете способ записи в потоки более интуитивным способом, попробуйте PrintWriter.

...