Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将整个流加载到MemoryStream?_C#_.net_Stream - Fatal编程技术网

C# 如何将整个流加载到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

就像在主题中一样:我想将数据从文件(从流)读入内存(memorystream),以提高我的应用程序速度。如何操作?

如果您可以将整个文件保存在内存中,则应该适合您:

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是至关重要的;-)我的错,抱歉吵闹。