2012-07-09 12 views
19

トピックに似ています:ファイル(ストリームから)をメモリ(memorystream)に読み込んで、アプリケーションの速度を向上させたい。どうやってするの?ストリーム全体をMemoryStreamにロードするには?

+0

あなたはStreamReader.ReadToEndメソッドを使用することができ、それを行います。これにより、すべてのファイルが文字列に読み込まれます。なぜそれをストリームに読みたいのですか? streamReaderはストリームを使用するので、必要に応じてストリームから読み込み、フレームワークを使用して物を最適化することができます。 –

+0

@AmiramKorach:これはテキストだと仮定しています。 StreamReaderはテキストデータにのみ適しています*。 –

答えて

51

いくつかのオプション:

...最初のバイト配列にそれをすべて読みます
byte[] data = File.ReadAllBytes(file); 
MemoryStream stream = new MemoryStream(data); 

または.NET 4のCopyToメソッドを使用する

MemoryStream memoryStream = new MemoryStream(); 
using (Stream input = File.OpenRead(file)) 
{ 
    input.CopyTo(memoryStream); 
} 
memoryStream.Position = 0; 

または手動で

MemoryStream memoryStream = new MemoryStream(); 
using (Stream input = File.OpenRead(file)) 
{ 
    byte[] buffer = new byte[32 * 1024]; // 32K buffer for example 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     memoryStream.Write(buffer, 0, bytesRead); 
    } 
} 
memoryStream.Position = 0; 
+0

私は、最初のメソッド 'File.ReadAllBytes'が、メモリ消費量が行く限り(「.NET 4.5」)、「CopyTo」メソッドとはかなり異なる動作をしていることに気付きました。具体的には、 'File.ReadAllBytes'メモリを使ってタイトなループで何十ものファイルを読むことは、' CopyTo'バージョンと同様に再利用されません。もう少し調査する価値があるかもしれない。 –

8

あなたはFile.ReadAllBytesがあなたのために働く必要があり、メモリ内のファイル全体を保持することができる場合:

using (var ms = new MemoryStream(File.ReadAllBytes(file))) 
{ 
    // do work 
} 
関連する問題