Плюсы/минусы Stream[Чтение/Запись]

Поэтому какое-то время я использовал StreamReader/Writer в качестве оболочки для NetworkStream TcpClient — в основном просто для простоты и для экономии времени.

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

Это заставило меня задуматься, может быть, использование этих оберток связано с некоторыми ненужными накладными расходами? или, возможно, проблемы совместимости при разработке клиентов на других языках, таких как C++ или PHP.

Каковы последствия использования вспомогательных классов StreamReader и StreamWriter и есть ли какие-либо преимущества? (вдоль линии обработки ошибок или чего-то еще)


person caesay    schedule 03.04.2012    source источник
comment
Средства чтения и записи текста, как правило, выполняют буферизованное чтение и запись. Обратитесь к документации по этому поведению.   -  person leppie    schedule 03.04.2012
comment
Эти странные вещи исчезнут, когда вы разберетесь со спецификациями протокола, в основном с кодировкой.   -  person Henk Holterman    schedule 03.04.2012


Ответы (2)


StreamReader/Writer позволяют легко сохранять/считывать текстовые данные в/из потока. Нет дополнительных накладных расходов помимо того, для чего они предназначены - преобразование значений в текстовое представление в правильной кодировке. Не должно быть проблем с использованием этого текстового потока с других языков, если обе стороны согласны с кодировкой, т.е. по умолчанию используется UTF-8 со спецификацией.

«Добавлены лишние байты» — это метка порядка байтов (BOM), которую можно отключить при создании ридер (и это только для кодировки Unicode UTF-8/7/16).

В зависимости от ваших целей использование необработанных потоков для бинарной связи может быть лучше/быстрее.

person Alexei Levenkov    schedule 03.04.2012

Я предполагаю, что вы используете ReadLine и WriteLine и видите противоречивые результаты.

Во-первых, StreamReader принимает символы UTF-8, которые могут не совпадать с тем, что отправляется с другой стороны. Вы можете установить кодировку при создании StreamReader.

Во-вторых, StreamReader предполагает, что строки оканчиваются на \n, \r или \r\n. Это означает, что если другой конец отправляет новую строку как \n\r, это вызовет странность.

В-третьих, да, у StreamReader есть некоторые накладные расходы, поскольку он должен буферизовать ввод для поиска новых строк. Но без этого гораздо сложнее, пока не будет найдена новая линия.

person Erik Funkenbusch    schedule 03.04.2012
comment
Я использую Read, ReadBlock и Write - person caesay; 03.04.2012
comment
StreamReader/Writer не исправлены в UTF8 - person Henk Holterman; 03.04.2012
comment
@HenkHolterman - я не говорил, что это так, я сказал, что это можно изменить в конструкторе. - person Erik Funkenbusch; 03.04.2012