C# 附加到内存流

C# 附加到内存流,c#,arrays,stream,C#,Arrays,Stream,我试图将一些数据附加到流中。这适用于FileStream,但不适用于MemoryStream,因为缓冲区大小固定 将数据写入流的方法与创建流的方法分离(在下面的示例中,我对其进行了极大的简化)。创建流的方法不知道要写入流的数据长度 public void Foo(){ byte[] existingData = System.Text.Encoding.UTF8.GetBytes("foo"); Stream s1 = new FileStream("someFile.txt",

我试图将一些数据附加到流中。这适用于
FileStream
,但不适用于
MemoryStream
,因为缓冲区大小固定

将数据写入流的方法与创建流的方法分离(在下面的示例中,我对其进行了极大的简化)。创建流的方法不知道要写入流的数据长度

public void Foo(){
    byte[] existingData = System.Text.Encoding.UTF8.GetBytes("foo");
    Stream s1 = new FileStream("someFile.txt", FileMode.Append, FileAccess.Write, FileShare.Read);
    s1.Write(existingData, 0, existingData.Length);


    Stream s2 = new MemoryStream(existingData, 0, existingData.Length, true);
    s2.Seek(0, SeekOrigin.End); //move to end of the stream for appending

    WriteUnknownDataToStream(s1);
    WriteUnknownDataToStream(s2); // NotSupportedException is thrown as the MemoryStream is not expandable
}

public static void WriteUnknownDataToStream(Stream s)
{
   // this is some example data for this SO query - the real data is generated elsewhere and is of a variable, and often large, size.
   byte[] newBytesToWrite = System.Text.Encoding.UTF8.GetBytes("bar"); // the length of this is not known before the stream is created.
   s.Write(newBytesToWrite, 0, newBytesToWrite.Length);
}
我的想法是向函数发送一个可扩展的
MemoryStream
,然后将返回的数据附加到现有数据中

public void ModifiedFoo()
{
   byte[] existingData = System.Text.Encoding.UTF8.GetBytes("foo");
   Stream s2 = new MemoryStream(); // expandable capacity memory stream

   WriteUnknownDataToStream(s2);

   // append the data which has been written into s2 to the existingData
   byte[] buffer = new byte[existingData.Length + s2.Length];
   Buffer.BlockCopy(existingData, 0, buffer, 0, existingData.Length);
   Stream merger = new MemoryStream(buffer, true);
   merger.Seek(existingData.Length, SeekOrigin.Begin);
   s2.CopyTo(merger);
}

有更好(更有效)的解决方案吗?

一个可能的解决方案是首先不要限制
内存流的容量。
如果您事先不知道需要写入的总字节数,请创建一个容量未指定的
MemoryStream
,并将其用于两次写入

byte[] existingData = System.Text.Encoding.UTF8.GetBytes("foo");
MemoryStream ms = new MemoryStream();
ms.Write(existingData, 0, existingData.Length); 
WriteUnknownData(ms);

这无疑比从
字节[]
初始化
内存流的性能要差,但是如果您需要继续写入流,我相信这是您唯一的选择。

您能解释一下为什么两次写入都不使用可扩展流吗?啊,像这样吗?流s2=新内存流();//可扩展容量内存流s2.写入(existingData,0,existingData.Length);writeunknowndatostream(s2);是的,这就是我的意思。。。这就是为什么它是一个流而不是一个数组,不是吗?@Rotem@sprocketonline你们中的一个可能应该把它作为一个答案发布出来。只需创建一个
内存流
,将
现有数据
附加到该流,然后继续向其附加数据。如果性能差异很重要,您可以。这样,如果你猜得很好(或知道)最终的大小,就不会有重新分配。如果您猜得不好,您将浪费内存或进行影响性能的重新分配,但它仍然有效。