我有以下构造函数方法,可以从文件路径打开MemoryStream:

MemoryStream _ms;

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

我需要将其更改为接受Stream而不是文件路径.从Stream个物体中得到MemoryStream的最简单/最有效的方法是什么?

推荐答案

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

public class MyClass
{ 
    Stream _s;

    public MyClass(Stream s) { _s = s; }
}

但如果内部操作确实需要MemoryStream,则必须将数据从源流复制到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);
    }
}

.net相关问答推荐

找不到包Microsoft.VisualStudio.Azure.Containers.Tools.Targets

从没有流的EventStore中读取流不存在异常

NETSDK1083:无法识别指定的 RuntimeIdentifierwin10-x64

调整小数精度,.net

从 byte[] 创建 zip 文件

如何在 EF 代码优先中禁用链接表的级联删除?

什么是编组?当某些东西被编组时会发生什么?

C# 中基于接口编程的运算符重载

为什么 .NET 中不需要 Maven?

双倍的? = 双倍? + 双倍?

在 .NET (C#) 中本地存储数据的最佳方式

ILookup 接口与 IDictionary

mscorlib 代表什么?

ReaderWriterLockSlim 什么时候比简单的锁更好?

强制 XmlSerializer 将 DateTime 序列化为 'YYYY-MM-DD hh:mm:ss'

我应该绑定到 ICollectionView 还是 ObservableCollection

Environment.GetFolderPath(...CommonApplicationData) 在 Vista 上仍然返回C:\Documents and Settings\

获取磁盘上文件的大小

从流中获取 TextReader?

通过继承扩展枚举