17

ストリームに書き込むためのメソッドを呼び出すStreamなどのオブジェクトのインスタンス化と、ストリームを使用してオブジェクトをインスタンス化して呼び出すことの違いは何ですか?MemoryStreammemoryStream.Write()StreamWriterstreamWriter.Write()

次のシナリオを検討してください。

Streamを受け取り、値を書き込んで、それを返すメソッドがあります。ストリームは後で読み取られるため、位置をリセットする必要があります。それを行うには2つの方法があります(どちらも機能するようです)。

// Instantiate a MemoryStream somewhere
//     - Passed to the following two methods
MemoryStream memoryStream = new MemoryStream();

// Not using a StreamWriter
private static Stream WriteToStream(Stream stream, string value)
{
    stream.Write(Encoding.Default.GetBytes(value), 0, value.Length);
    stream.Flush();
    stream.Position = 0;
    return stream;
}

// Using a StreamWriter
private static Stream WriteToStreamWithWriter(Stream stream, string value)
{
    StreamWriter sw = new StreamWriter(stream);
    sw.Write(value, 0, value.Length);
    sw.Flush();
    stream.Position = 0;
    return stream;
}

後で読み取られるので、ストリームに書き込んだ後にストリームを閉じたくないので、これは部分的にスコープの問題です。私も確かにそれを処分したくありません、なぜならそれは私のストリームを閉じるからです。違いは、StreamWriterを使用しないと、Encoding.Defaultに直接依存するように見えることですが、それが非常に大きな問題であるかどうかはわかりません。もしあれば、違いは何ですか?

4

4 に答える 4

19

StreamWriterを使用すると、詳細を気にせずにさまざまなタイプをストリームに書き込むことができる、より高いレベルのオーバーロードがあります。たとえば、あなたのコード

sw.Write(value, 0, value.Length);

実際には

sw.Write(value);

StreamWriter.Write(string)オーバーロードを使用します。

于 2010-05-21T12:57:11.883 に答える
2

1つの違いは、new StreamWriter(stream)デフォルトでUTF-8エンコーディングを使用するため、Unicodeデータをサポートすることです。Encoding.Default(少なくとも私のマシンでは)固定サイズのコードページ(Windows-1250など)であり、ASCIIと限られた国別文字セット(合計256文字)のみをサポートします。

あなたは本当に次のことをすべきではありません:

stream.Write(encoding.GetBytes(value), 0, value.Length);

使用するエンコーディングのサイズが1バイトに固定されているのは偶然です。(UTF-16、またはUTF-8と非ASCIIデータでは機能しません。)代わりに、ストリームに直接書き込む必要がある場合は、次のようにします。

byte[] byteData=encoding.GetBytes(value);
stream.Write(byteData, 0, byteData.Length);
于 2018-04-18T08:18:28.870 に答える
1

byte[]配列に関してはStreamWriter、他のタイプを操作する場合でも、他のより便利な方法を導入するものはありません。

于 2010-05-21T12:57:32.950 に答える
1

StreamWriterは、テキストの処理を容易にするためにTextWriterを実装するStreamのスーパークラスです。ただし、はスーパークラスであるため、テキスト処理メソッドに加えて、すべて同じメソッドがあります。このため、最初の例ではEncoding.Default.GetBytes(value)が必要ですが、2番目の例では必要ありません。

于 2010-05-21T12:59:37.110 に答える