2008-09-24 2 views
39

多くの場合、1つのストリームにデータがいっぱいあり、そのすべてを別のストリームに書きたいという問題が発生します。1つのストリームの内容を.netの別のストリームに書き込む方法は?

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

もっとエレガントな方法がありますか?

もしそうでなければ、理想的なバッファのサイズは何ですか。この要素を構成する要素はどれですか?理想的なバッファサイズに関しては

答えて

16

「Readメソッドを使用している場合、内部のバッファがあなたに設定されているストリームの内部バッファと同じサイズのバッファを使用する方が効率的です必要なブロック・サイズ、およびブロック・サイズよりも少ないバイト数を常に読み取ることができます。ストリームの作成時に内部バッファーのサイズが指定されていない場合、デフォルト・サイズは4キロバイト(4096バイト)です。

ストリーム読み込み処理では、この引用が参照するメソッドであるRead(char buffer []、int index、count)が使用されます。

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

7

に行くためにいくつかの方向性を持つことになりますが、.NETで別の直接のパイプ1つのストリーミングできるかどうかはわからないんだけど、ここでは中間バイトでそれを行うための方法がありますバッファ。バッファのサイズは任意です。最も効率的なサイズは、転送するデータの量によって大きく異なります。

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); 
} 
+1

あなたがC#3.0の拡張メソッドとしてこれを実装し、静的な無効のCopyTo(このストリーム入力、ストリーム出力)のようなものとして、それを持っている可能性が... –

2

私はバッファを使用するよりもエレガントな方法を知らない。

しかし、バッファのサイズが違いを生む可能性があります。 Vistaのファイルコピーに関する問題を覚えていますか?それは(基本的に)バッファサイズを変更した理由です。変更はthis blogpostで説明されています。あなたはそのポストからの主な要因を知ることができます。ただし、これはファイルのコピーにのみ適用されます。アプリケーションでは、おそらくたくさんのメモリコピーがあります。この場合、4KBが最良のバッファサイズのas recommended by the .NET documentationになる可能性があります。

68

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

+4

これがまさにそれであります! –

+2

私はStream.CopyToメソッドに逆コンパイルし、 "this.InternalCopyTo(destination、81920);"を呼び出します。 整数値はバッファサイズです。ほとんどのバッファリング手法が採用していると思われる標準の4kと比べて、狂ったバッファサイズのようです。 誰でもこれについてコメントできますか? – ctrlplusb

+2

その数値は、大きな量のヒープの使用を避けようとしているように見えます。 –

5

BufferedStream.CopyTo(ストリーム)

関連する問題