如何从.NET中的Stream获取MemoryStream?

fea*_*net 60 .net c# file-io memorystream stream

我有以下构造方法MemoryStream从文件路径打开一个:

MemoryStream _ms;

public MyClass(string filePath)
{
    byte[] docBytes = File.ReadAllBytes(filePath);
    _ms = new MemoryStream();
    _ms.Write(docBytes, 0, docBytes.Length);
}
Run Code Online (Sandbox Code Playgroud)

我需要更改它以接受Stream而不是文件路径.什么是最简单/最有效的方法来MemoryStreamStream对象获取?

Phi*_*ney 185

在.NET 4中,您可以使用Stream.CopyTo复制流,而不是其他答案中列出的home-brew方法.

MemoryStream _ms;

public MyClass(Stream sourceStream)

    _ms = new MemoryStream();
    sourceStream.CopyTo(_ms);
}
Run Code Online (Sandbox Code Playgroud)

  • 确保首先设置sourceStream.Position = 0; (4认同)
  • 您需要设置 _ms.Position = 0; 在使用它之前。 (2认同)

小智 45

用这个:

var memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
Run Code Online (Sandbox Code Playgroud)

这将转换StreamMemoryStream.


Jus*_*ner 28

如果您要修改类以接受Stream而不是文件名,请不要费心转换为MemoryStream.让底层Stream处理操作:

public class MyClass
{ 
    Stream _s;

    public MyClass(Stream s) { _s = s; }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您确实需要MemoryStream进行内部操作,则必须将源Stream中的数据复制到MemoryStream中:

public MyClass(Stream stream)
{
    _ms = new MemoryStream();
    CopyStream(stream, _ms);
}

// Merged From linked CopyStream below and Jon Skeet's ReadFully example
public static void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[16*1024];
    int read;
    while((read = input.Read (buffer, 0, buffer.Length)) > 0)
    {
        output.Write (buffer, 0, read);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来缺少一个右括号.应该是`while((read = input.Read(buffer,0,buffer.Length))> 0)` (3认同)
  • 可能想添加`output.Position = 0;`作为最后一行,否则你需要记住以后重置它. (2认同)

Reb*_*cca 5

你可以简单地做:

var ms = new MemoryStream(File.ReadAllBytes(filePath));
Run Code Online (Sandbox Code Playgroud)

流位置为 0 并准备使用。