41

1つのストリームにデータがいっぱいあり、そのすべてを別のストリームに書き込みたいという問題に遭遇することがよくあります。

そこにあるすべてのコード例では、バイト配列の形式のバッファーを使用しています。

これにもっとエレガントな方法はありますか?

そうでない場合、バッファの理想的なサイズはどれくらいですか。この値を構成する要素はどれですか?

4

7 に答える 7

71

.NET 4.0 では、ついにStream.CopyToメソッドを取得しました。わーい!

于 2009-10-22T17:31:42.373 に答える
16

理想的なバッファサイズについて:

「Readメソッドを使用する場合は、ストリームの内部バッファーと同じサイズのバッファーを使用する方が効率的です。内部バッファーは目的のブロックサイズに設定されており、常にブロックサイズよりも小さい値を読み取ります。ストリームの構築時に内部バッファーのサイズが指定されていなかった場合、デフォルトのサイズは4キロバイト(4096バイト)です。」

ストリーム読み取りプロセスでは、Read(char buffer []、int index、count)を使用します。これは、この引用符が参照するメソッドです。

http://msdn.microsoft.com/en-us/library/9kstw824.aspx(「備考」の下)。

于 2008-09-24T19:28:11.383 に答える
7

.NET であるストリームを別のストリームに直接パイプできるかどうかはわかりませんが、中間バイト バッファーを使用してそれを行う方法を次に示します。バッファのサイズは任意です。最も効率的なサイズは、転送するデータの量に大きく依存します。

static void CopyStream(Stream input, Stream output){
    byte[] buffer = new byte[0x1000];
    int read;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
        output.Write(buffer, 0, read);
}
于 2008-09-24T19:32:10.703 に答える
5

BufferedStream.CopyTo(ストリーム)

于 2010-05-19T16:34:17.133 に答える
2

FileStreamのデータを汎用ストリームに読み込みます

おそらくいくつかの方向性があります

于 2008-09-24T19:28:28.373 に答える
2

バッファを使用するよりもエレガントな方法を知りません。

ただし、バッファーのサイズによって違いが生じる場合があります。Vista のファイル コピーに関する問題を覚えていますか? その理由は(基本的に)バッファサイズを変更することでした。変更については、このブログ投稿で説明されています。その投稿から主な要因を学ぶことができます。ただし、これはファイルのコピーにのみ適用されます。アプリケーションではおそらく大量のメモリ コピーを実行するため、.NET のドキュメントで推奨されているように、その場合は 4KB が最適なバッファ サイズになる可能性があります。

于 2008-10-03T11:22:09.333 に答える