C# 如何将整个流加载到MemoryStream?
就像在主题中一样:我想将数据从文件(从流)读入内存(memorystream),以提高我的应用程序速度。如何操作?如果您可以将整个文件保存在内存中,则应该适合您:C# 如何将整个流加载到MemoryStream?,c#,.net,stream,C#,.net,Stream,就像在主题中一样:我想将数据从文件(从流)读入内存(memorystream),以提高我的应用程序速度。如何操作?如果您可以将整个文件保存在内存中,则应该适合您: using (var ms = new MemoryStream(File.ReadAllBytes(file))) { // do work } 有几个选择: 首先将其全部读入字节数组… byte[] data = File.ReadAllBytes(file); MemoryStream stream = new Mem
using (var ms = new MemoryStream(File.ReadAllBytes(file)))
{
// do work
}
有几个选择:
首先将其全部读入字节数组…
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;
您可以使用StreamReader.ReadToEnd方法。这将把所有文件读入一个字符串。你为什么要把它读给一个流?streamReader使用流,因此您可以根据需要从中读取数据,并依靠框架来优化内容。@AmiramKorach:首先,您假设这是文本。StreamReader仅适用于文本数据。我注意到第一种方法
File.ReadAllBytes
的行为与“CopyTo”方法在内存消耗方面有很大不同(.NET 4.5)。具体来说,使用File.ReadAllBytes
内存在一个紧密循环中读取几十个文件不会像CopyTo
版本那样被回收。也许值得更多的调查。谢谢你,奇怪的是,对我来说,CopyTo行为不当,最终的流没有看到所有的数据。我使用了@Austin Salonen方法(使用ReadAllBytes),这一方法效果很好。奇怪的东西…@greenoldman:不知道更多细节,很难说,但听起来你可能已经先从流中读取了一些数据。哦,经过更多的测试,我发现了罪魁祸首,这个小家伙在复制后将位置
重置为0是至关重要的;-)我的错,抱歉吵闹。