ストリームを別のストリームに読み込む最も効率的な方法は何ですか? この場合、Filestream のデータを汎用ストリームに読み込もうとしています。私は次のことができることを知っています:
1.行ごとに読み取り、データをストリームに書き込みます
2.バイトのチャンクを読み取り、ストリームに書き込みます
3.など
私はただ最も効率的な方法を見つけようとしています。
ありがとう
私は簡単な拡張方法をまとめました(VS 2008 w / 3.5のみ):
public static class StreamCopier
{
private const long DefaultStreamChunkSize = 0x1000;
public static void CopyTo(this Stream from, Stream to)
{
if (!from.CanRead || !to.CanWrite)
{
return;
}
var buffer = from.CanSeek
? new byte[from.Length]
: new byte[DefaultStreamChunkSize];
int read;
while ((read = from.Read(buffer, 0, buffer.Length)) > 0)
{
to.Write(buffer, 0, read);
}
}
}
次のように使用できます。
using (var input = File.OpenRead(@"C:\wrnpc12.txt"))
using (var output = File.OpenWrite(@"C:\wrnpc12.bak"))
{
input.CopyTo(output);
}
ロジックを少し入れ替えて、CopyFrom()
メソッドを記述することもできます。
Stephen Toub は、こちらの MSDN .NET 関連コラムでストリーム パイプラインについて説明しています。この記事では、ある入力ストリームから別のストリームにコピーする CopyStream() メソッドについて説明しています。これは、あなたがやろうとしていることと非常によく似ています。
バイトのバッファを読み取ってから書き込むのが最速です。のようなメソッドReadLine()
は行区切り文字を探す必要があり、バッファを埋めるよりも時間がかかります。
一般的なストリームとは、メモリストリームなどの他の種類のストリームを意味すると思います.
その場合、最も効率的な方法は、バイトのチャンクを読み取り、それらを受信側ストリームに書き込むことです。チャンク サイズは 512 バイト程度になります。