【问题标题】:How to load entire stream into MemoryStream?如何将整个流加载到 MemoryStream 中?
【发布时间】:2012-07-08 23:59:49
【问题描述】:

就像主题:我想从文件(从流)中读取数据到内存(memorystream)中以提高我的应用程序速度。怎么做?

【问题讨论】:

  • 您可以使用 StreamReader.ReadToEnd 方法。这会将所有文件读入一个字符串。为什么要将其读取到流中? streamReader 使用流,因此您可以根据需要从中读取数据,并依靠框架来优化内容。
  • @AmiramKorach:一方面,您假设这是文本。 StreamReader 适用于文本数据。

标签: c# .net stream


【解决方案1】:

几个选项:

先将其全部读入一个字节数组中……

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;

【讨论】:

  • 我注意到第一种方法File.ReadAllBytes 的行为与“CopyTo”方法有很大不同,就内存消耗而言(.NET 4.5)。具体来说,使用File.ReadAllBytes 内存在紧密循环中读取数十个文件并没有像CopyTo 版本那样回收。可能值得进行更多调查。
  • 谢谢,奇怪的是 CopyTo 对我来说行为不端,最终流没有看到所有数据。我使用了@Austin Salonen 方法(使用 ReadAllBytes),这个方法效果很好。奇怪的东西……
  • @greenoldman:在不了解更多细节的情况下,这很难说,但听起来你可能已经先从流中读取了一些数据。
  • 哦,经过更多测试后,我发现了罪魁祸首,这个小家伙在复制后将Position 重置为 0 至关重要 ;-) 我的错,抱歉出现噪音。
【解决方案2】:

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

using (var ms = new MemoryStream(File.ReadAllBytes(file)))
{
    // do work
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多