追加到MemoryStream [英] Appending to MemoryStream

查看:622
本文介绍了追加到MemoryStream的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将一些数据附加到流中.这对于 FileStream 效果很好,但由于固定的缓冲区大小,不适用于 MemoryStream .

I'm trying to append some data to a stream. This works well with FileStream, but not for MemoryStream due to the fixed buffer size.

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

The method which writes data to the stream is separated from the method which creates the stream (I've simplified it greatly in the below example). The method which creates the stream is unaware of the length of data to be written to the stream.

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 ,然后将返回的数据附加到现有数据中.

An idea I had was to send an expandable MemoryStream to the function, then append the returned data to the existing data.

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);
}

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

Any better (more efficient) solutions?

推荐答案

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

A possible solution is not to limit the capacity of the MemoryStream in the first place. If you do not know in advance the total number of bytes you will need to write, create a MemoryStream with unspecified capacity and use it for both writes.

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

这无疑比从 byte [] 初始化 MemoryStream 的性能要差,但是如果您需要继续写入流,我相信这是您唯一的选项.

This will no doubt be less performant than initializing a MemoryStream from a byte[], but if you need to continue writing to the stream I believe it is your only option.

这篇关于追加到MemoryStream的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆