1つのストリームにデータがいっぱいあり、そのすべてを別のストリームに書き込みたいという問題に遭遇することがよくあります。
そこにあるすべてのコード例では、バイト配列の形式のバッファーを使用しています。
これにもっとエレガントな方法はありますか?
そうでない場合、バッファの理想的なサイズはどれくらいですか。この値を構成する要素はどれですか?
.NET 4.0 では、ついにStream.CopyTo
メソッドを取得しました。わーい!
理想的なバッファサイズについて:
「Readメソッドを使用する場合は、ストリームの内部バッファーと同じサイズのバッファーを使用する方が効率的です。内部バッファーは目的のブロックサイズに設定されており、常にブロックサイズよりも小さい値を読み取ります。ストリームの構築時に内部バッファーのサイズが指定されていなかった場合、デフォルトのサイズは4キロバイト(4096バイト)です。」
ストリーム読み取りプロセスでは、Read(char buffer []、int index、count)を使用します。これは、この引用符が参照するメソッドです。
http://msdn.microsoft.com/en-us/library/9kstw824.aspx(「備考」の下)。
.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);
}
BufferedStream.CopyTo(ストリーム)
おそらくいくつかの方向性があります
バッファを使用するよりもエレガントな方法を知りません。
ただし、バッファーのサイズによって違いが生じる場合があります。Vista のファイル コピーに関する問題を覚えていますか? その理由は(基本的に)バッファサイズを変更することでした。変更については、このブログ投稿で説明されています。その投稿から主な要因を学ぶことができます。ただし、これはファイルのコピーにのみ適用されます。アプリケーションではおそらく大量のメモリ コピーを実行するため、.NET のドキュメントで推奨されているように、その場合は 4KB が最適なバッファ サイズになる可能性があります。