2012-04-03 5 views
1

しばらくの間、TcpClientのNetworkStream上のラッパーとしてStreamReader/Writerを使用してきました。主に単純化のため、時間を節約するためです。ストリームの長所/短所[リーダー/ライター]

接続の両端でstreamreader/writerを使って作業するときはうまく動作しますが、ヘルパの相手も使用していないエンドポイントでこれらのヘルパークラスのいずれかを使用すると、 。ストリームに追加された余分なバイトやその他の奇妙なもの。

これは私に考えさせてくれました。おそらく、これらのラッパーを使用する際に必要とされないオーバーヘッドがありますか? C++やPHPのような他の言語でクライアントを開発する際に互換性の問題が発生する可能性があります。

StreamReaderヘルパークラスとStreamWriterヘルパークラスを使用することの意味は何ですか。また、何か利点はありますか? (エラー処理などの行に沿って)

+0

テキストリーダーとライターは、バッファされた読み取りと書き込みを行う傾向があります。この動作については、ドキュメントを参照してください。 – leppie

+0

これらの「変なもの」は、プロトコルの仕様、主にエンコーディングを把握すると消えてしまいます。 –

答えて

3

StreamReader/Writerを使用すると、ストリームとの間でテキストデータを簡単に保存/読み取ることができます。その上に付加的なオーバーヘッドはありません。値を正しいエンコーディングのテキスト表現に変換します。両方の側がエンコードに同意する限り、このテキストストリームを他の言語から浪費することはありません。つまり、BOM付きのデフォルトのUTF-8です。

「余分なバイトが先頭に追加されました」は、バイトオーダーマーク(BOM)です。これは、リーダーの作成時にオフにすることができます(Unicode UTF-8/7/16エンコードのみ)。

バイナリ通信にRAWストリームを使用する目標に応じて、より良い/より速くなる場合があります。

0

あなたはReadLineとWriteLineを使用しており、矛盾した結果が見られると思います。

最初に、StreamReaderはUTF-8文字を想定していますが、これは相手側から送信されるものではない可能性があります。 StreamReaderの作成時にエンコードを設定できます。

第2に、StreamReaderは\ n、\ rまたは\ r \ nで終わるとみなします。つまり、もう一方の端が\ n \ rとして改行を送信すると、それは不自然さを引き起こします。

3つ目は、改行を探すために入力をバッファしなければならないため、StreamReaderにいくらかのオーバーヘッドがあります。しかし、それがなければ、新しい行が見つかるまでははるかに難しいです。

+0

私はRead、ReadBlock、およびWriteを使用しています – caesay

+0

StreamReader/WriterはUTF8で修正されていません –

+0

@HenkHolterman - 私はそれがコンストラクタで変更できると言っていませんでした。 –

関連する問題