2012-04-03 71 views
1

所以一段时间以来,我一直使用StreamReader/Writer作为TcpClient的NetworkStream的包装 - 主要是为了简单,并节省时间。Stream [Reader/Writer]的优点/缺点

在连接的两端使用streamreader/writer工作正常,但我注意到,当使用其中一个辅助类与不使用辅助对象的端点时,奇怪的事情开始发生。无用的字节被添加到流和其他奇怪的东西。

这让我想到了,也许有一些不需要的开销使用这些包装?或者在使用C++或PHP等其他语言开发客户端时可能会遇到兼容性问题。

使用StreamReader和StreamWriter助手类的含义是什么?有什么好处? (沿错误处理的行或其他任何东西)

+0

文本阅读器和编写者倾向于进行缓冲读取和写入。请参阅有关此行为的文档。 – leppie 2012-04-03 17:24:13

+0

当你掌握协议规范时,那些“奇怪的东西”将会消失,主要是编码。 – 2012-04-03 18:22:18

回答

3

StreamReader/Writer让你轻松地存储/读取文本数据流/从流。没有额外的开销,他们是什么 - 将值转换为正确编码的文本表示。只要双方都对编码达成一致,即使用默认的带有BOM的UTF-8,那么从其他语言中消费此文本流应该没有问题。

“附加前缀的字节”是字节顺序标记(BOM),您可以在构建阅读器时关闭它(仅适用于Unicode UTF-8/7/16编码)。

根据您的目标,使用二进制通信的原始码流可能会更好/更快。

0

我假设你使用ReadLine和WriteLine并看到不一致的结果。

首先,StreamReader采用UTF-8字符,这可能不是从另一端发送的内容。您可以在创建StreamReader时设置编码。其次,StreamReader假定行以\ n,\ r或\ r \ n结尾,这意味着如果另一端发送换行符为\ n \ r,则会导致奇怪。

三,是的,StreamReader存在一些开销,因为它必须缓冲输入以查找换行符。但是如果没有这些,直到找到一条新线很困难。

+0

我正在使用Read,ReadBlock和Write – caesay 2012-04-03 18:07:14

+0

StreamReader/Writer没有固定在UTF8上 – 2012-04-03 18:16:48

+0

@HenkHolterman - 我没有说这是,我说它可以在构造函数中更改。 – 2012-04-03 18:18:42